Skip to content

计算器

项目简介

计算器是近代人发明的可以进行数字运算的机器。 计算器通过对加法、减法、乘法、除法等功能的运算,将正确的结果展示在屏幕上。 可帮助人们更方便的实现数字运算。一般情况下计算器除显示计算结果外,还常有溢出指示、错误指示等功能。

知识点

  • 测试流程与需求分析
  • bug 提交与管理
  • JUnit5基本注解、常用注解、自带断言
  • Hamcrest断言
  • Allure报告

受众

  • 高级测试工程师

作业内容

  1. 使用思维导图完成需求分分析;应用多种测试用例设计方法,包括:等价类、边界值、错误推测法等。
  2. 测试执行过程中应用多种测试方法完成计算器的加法、除法运算。
  3. 编写自动化测试用例,结合 Allure 技术自动生成带操作步骤的测试报告。
  4. 使用参数化减少代码量,提高代码的可维护性。
  5. 使用数据驱动实现数据驱动代码执行,合理规范的保存测试数据。
  6. 掌握 JUnit5 常用的注解,例如:添加标签、YAML文件进行参数化数据驱动、自定义方法名 等。
  7. 掌握 JUnit5 自动化测试框架多种复杂配置,比如 测试用例的执行顺序配置、分布式并发执行配置等。
  8. 合理使用第三方库,比如 使用hamcrest进行断言
  9. 掌握分层思想实现用例的分层,实现测试装置,测试数据,测试日志,测试报告等合理的框架构建。

被测源码

/*
 * @Author: 霍格沃兹测试开发学社-盖盖
 * @Desc: '更多测试开发技术探讨,请访问:https://ceshiren.com/t/topic/15860'
 */
package com.ceshiren;

import org.slf4j.Logger;


import java.util.Arrays;
import java.util.UUID;
import java.util.stream.IntStream;

import static java.lang.invoke.MethodHandles.lookup;
import static org.slf4j.LoggerFactory.getLogger;

public class Calculator {
    //获得具有所需名称的记录器
    static final Logger logger = getLogger(lookup().lookupClass());

    public static int result = 0;

    //用例名
    String name;
    //唯一ID标识
    String id;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Calculator(String name) {
        this.name = name;
        logger.info("创建 {} ", name);
    }


    public void initId(){
        id = UUID.randomUUID().toString();
        logger.info("生成ID:{} 并绑定", id);

    }
    public void destroyId() {
        if (id == null) {
            throw new IllegalArgumentException(name + " 没有初始化对应ID");
        }
        logger.info("ID: {} 释放", id);
        id = null;
    }


    public void close() {
        logger.info("关闭 {} ", name);
    }


    //连续添加
    public int sum(int... numbers) {
        /*if(Arrays.stream(numbers).anyMatch(u -> u == 100)){
            logger.warn("integer is 100!");
            //拦截,重置,发送某些消息给其他服务端
            throw new NumberFormatException("integer is 100!");
        }else */if(Arrays.stream(numbers).anyMatch(u -> u > 99) | Arrays.stream(numbers).anyMatch(u -> u < -99)){
            logger.warn("请输入范围内的整数");
            throw new IllegalArgumentException("请输入范围内的整数!");
//            throw new NumberFormatException("请输入范围内的整数!");

        }else {
            //[-99,99]
            return IntStream.of(numbers).sum();
        }

    }


    //从100进行减法
    public int subtract(int... numbers) {
        if(Arrays.stream(numbers).allMatch(u -> u > 99) | Arrays.stream(numbers).allMatch(u -> u < -99)){
            logger.warn("请输入范围内的整数");
            throw new IllegalArgumentException("请输入范围内的整数!");
        }else {
            return IntStream.of(numbers).reduce(100, (a, b) -> a-b);
        }
    }

    public int subtract(int x, int y) {
        if(x>99 | x<-99 | y>99 | y<-99){
            logger.warn("请输入范围内的整数");
            //100-8
            return 0;
        }else {
            //99-8
            return x-y;
        }
    }


    //平均值 average
    public double average(int... numbers) {
        if(Arrays.stream(numbers).allMatch(u -> u > 99) | Arrays.stream(numbers).allMatch(u -> u < -99)){
            logger.warn("请输入范围内的整数");
            return 0;
        }else {
            return IntStream.of(numbers).average().getAsDouble();
        }
    }


    //连续拼接
    public String concatStr(String... words) {
        return String.join(" ", words);

    }

}