好测试的评判标准
简单测试四部曲
准备
准备一些需要提前初始化的工作,可以放在setUp中。
执行
这个阶段是整个测试中最核心的部分,触发被测目标的行为。
断言
断言是我们的预期,它负责验证执行的结果是否正确。
清理
清理是一个可能会有的部分。如果在测试中使到了外部资源,在这个部分要及时地
释放掉,保证测试环境被还原到一个最初的状态,就像什么都没发生过一样。
@Test
public void should_add_task_item() {
//准备
TaskRepository repository = mock(TaskRepository.class);
when(repository.save(any())).then(returnsFirstArg());
ITaskService service = new TaskService(repository);
//执行
Task item = service.addTaskItem(new Task(0, "task1"));
//断言
assertThat(item.getName()).isEqualTo("task1");
//清理
}
A-TRIP原则
Automatic,自动化
自动化测试相比传统测试,核心增强就在自动化上。这也是为什么测试一定要有断言,因为只有在有
断言的情况下,机器才能够帮我们判断测试是否成功。
Thorough,全面的
应该尽可能用测试覆盖各种场景。我们可以使用JaCOCO + SonarQube来实现自动生成测试覆盖率报告和代码覆盖率的可视化。
Repeatable,可重复的
它要求测试能够反复运行,并且结果都应该是一样的。
Independent,独立的。测试和测试之间不应该有任何依赖,就是一个测试不会依赖于另外一个测试运行的结果。
Professional,专业的
测试代码也是代码,也要按照代码的标准去维护。这就意味着你的测试代码也要写得清晰,比如良好的命名、把函数写小、要重构甚至要抽象出测试的基础库、测试的模式。在 Web 测试中常见的
PageObject 模式,就是这种理念的延伸。
代码覆盖率指标
函数覆盖率(Function coverage):代码中定义的函数有多少得到了调用;
语句覆盖率(Statement coverage):代码中有多少语句得到了执行;
分支覆盖率(Branches coverage):控制结构中的分支有多少得到了执行(比如 if 语句中的条件);
条件覆盖率(Condition coverage):每个布尔表达式的子表达式是否都检查过 true 和 false 的不同情况;
行覆盖率(Line coverage):代码中有多少行得到了测试。