计算器
项目简介
计算器是近代人发明的可以进行数字运算的机器。 计算器通过对加法、减法、乘法、除法等功能的运算,将正确的结果展示在屏幕上。 可帮助人们更方便的实现数字运算。一般情况下计算器除显示计算结果外,还常有溢出指示、错误指示等功能。
知识点
- 测试流程与需求分析
- bug 提交与管理
- JUnit5基本注解、常用注解、自带断言
- Hamcrest断言
- Allure报告
受众
- 高级测试工程师
作业内容
- 使用思维导图完成需求分分析;应用多种测试用例设计方法,包括:等价类、边界值、错误推测法等。
- 测试执行过程中应用多种测试方法完成计算器的加法、除法运算。
- 编写自动化测试用例,结合 Allure 技术自动生成带操作步骤的测试报告。
- 使用参数化减少代码量,提高代码的可维护性。
- 使用数据驱动实现数据驱动代码执行,合理规范的保存测试数据。
- 掌握 JUnit5 常用的注解,例如:添加标签、YAML文件进行参数化数据驱动、自定义方法名 等。
- 掌握 JUnit5 自动化测试框架多种复杂配置,比如 测试用例的执行顺序配置、分布式并发执行配置等。
- 合理使用第三方库,比如 使用hamcrest进行断言
- 掌握分层思想实现用例的分层,实现测试装置,测试数据,测试日志,测试报告等合理的框架构建。
被测源码
/*
* @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);
}
}