测试3 如何评判一个测试的好坏 - 自动化测试四部曲/A-Trip/代码覆盖率指标

373 阅读2分钟

好测试的评判标准

image.png

简单测试四部曲

准备
准备一些需要提前初始化的工作,可以放在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):代码中有多少行得到了测试。