OpenDSA 全教程

Chapter 3 Programming Tutorials

| 关于   «  11. JUnit 中的代码覆盖率(Code Coverage In JUnit)   ::   目录   ::   13. 变异测试基础  »

12. 在 Eclipse 中使用变异覆盖

12.1. 在 Eclipse 中使用变异覆盖

变异测试(mutation testing,又称变异分析 mutation analysis) 可以帮助设计新的软件测试,并评估软件测试套件的质量。 变异测试会以微小的方式自动修改程序, 例如把加号运算符改成减号运算符, 或把小于比较改成大于比较。 然后用程序的测试套件来运行这个程序。 如果测试套件未能检测到代码中的微小改动 (也就是说,它至少没有让某个测试失败), 那就意味着我们需要改进测试套件的质量。 知道程序的哪一部分发生了变异, 有助于我们编写更好的测试用例。

与代码覆盖率相比,变异测试被认为是评估测试套件质量的更强指标。 这是因为仅仅执行了某一行代码或某个分支, 并不足以确保代码被正确执行。

Web-CAT 提交插件(Web-CAT Submission Plug-in)带有在 Eclipse IDE 中运行变异测试的能力。 运行变异测试无需安装任何额外的插件。 只需确保你安装了最新版本的 Web-CAT 提交插件即可。 (在每一门使用 Web-CAT 的学期开始时,都应该重新安装 Web-CAT 提交插件。)

请注意:如果你之前为较早的课程安装过 Web-CAT 提交插件, 则必须卸载并重新安装 Web-CAT 插件。 这样可以确保你使用的是适用于 Eclipse 的最新版 Web-CAT 提交插件。

12.1.1. 使用变异测试

安装插件后,开始编写测试代码。 完成测试代码后,按以下步骤对你的测试套件运行变异测试:

步骤 1:在包含你测试套件的 Java 项目上单击鼠标右键。

步骤 2:单击 Run As > Mutation Test(参见图中的红框)。

Mutation Testing Run

当你执行变异测试时,它会在你的 Console 输出界面旁边创建两个额外的标签页。

第一个标签页 "Mutation List"(变异列表)会列出所有的变异。 共有两组反馈:

第一组:Lines Not Tested(未测试的行)

第二组:Lines Needing Better Testing(需要更好测试的行)

Mutation list

Figure 3.12.2: Eclipse 项目中的 Mutation List 标签页

要展开反馈,请单击 Mutation List 标签页右上角的 [+] 按钮。

12.1.2. 未测试的行(Lines Not Tested)

该列表显示项目代码中未被测试套件覆盖(即未被执行)的所有代码行。 为了获得更好的变异测试覆盖率, 你必须编写能够执行本组所列全部代码行的测试用例。 如果你单击某个反馈条目,它会带你跳到未被执行的特定代码行。 该列表还显示这些代码行所属的包和类。

Mutation list (expanded)

Figure 3.12.3: Eclipse 项目中展开的 Mutation List 标签页

12.1.3. 需要更好测试的行(Lines Needing Better Testing)

该反馈组显示所有已被测试套件执行、但仍需要更好测试用例断言的代码行。 与未测试行列表类似,你可以单击列表中的任意条目, 应会被转到相应的代码行。

变异测试的实现方式有很多种。 变异测试可能代价高昂(后面会详细介绍), 因此围绕着如何以最少的成本最大化测试套件评估质量, 人们开展了大量关于变异测试最佳使用方式的研究。 我们的变异测试使用两种变异:

1:逻辑表达式变异。

2:算术运算变异。

对于逻辑表达式变异,你必须编写测试用例断言, 以检查逻辑运算符所有分支的预期行为。 一个简单的逻辑条件有两个分支, 而包含多个布尔运算符的较复杂条件则可能产生更多分支。

对于算术运算变异,你必须编写测试用例断言, 以有效检查运算是否产生预期行为。

行需要更好测试意味着什么? 举一个典型的例子,你可能有一条语句 if (a < b) 。 变异测试可能会把它替换为 if (false) 。 如果你的测试没有通过失败察觉出差异, 那么你实际上并没有测试 a 是否小于 b 这件事是否要紧。 当然,在这个例子中,如果你的测试套件 只是在 a 恰好大于或等于 b (结果为 false)时做了正确的事, 但可能它并没有测试当 a 确实小于 b 时会发生什么。 这也是为什么即使你在变异测试中拿到满分, 也不能保证找出程序中每个 bug 的原因之一。

12.1.4. 变异汇总(Mutation Summary)

汇总标签页显示项目的总体测试覆盖率。 变异覆盖率以百分比形式显示, 其计算方式是检测到的变异数量与变异测试过程中生成的变异数量之比。 100% 的变异测试结果意味着项目测试套件检测到了所有生成的变异。

该页面还按项目中的不同类对变异覆盖率进行了细分。

Mutaiton Summary

Figure 3.12.4: Eclipse 项目的变异覆盖汇总

利用这些可视化信息,通过编写额外的测试用例断言, 来改进项目测试套件的质量。

12.1.5. 如何恢复 "Mutation List"/"Mutation Summary" 标签页?

如果你不小心关闭了 "Mutation List" 和 "Mutation Summary" 标签页,有两种方法可以找回它们。

  1. 直接再次运行变异测试: Run as --> Mutation Test 。这可能会重新生成 "Mutation List" 和 "Mutation Summary" 这两个标签页。

  2. 在菜单栏上导航到 Window --> Show View --> Other 。在其中的 PIT 选项下,你应该能找到 "Mutation List" 和 "Mutation Summary" 两项。单击所需的标签页,然后点击 Open 。

Mutation Panel View

Figure 3.12.5: 变异面板视图

   «  11. JUnit 中的代码覆盖率(Code Coverage In JUnit)   ::   目录   ::   13. 变异测试基础  »

关闭窗口