我认识的很多测试人员都听说过变化测试,却很少有人执行过该测试。 变化测试以难度大、需要昂贵的第三方软件工具而闻名。 但是,在本月专栏中我将为您展示如何用 C# 和 Visual Studio 创建一个超简单(不到 2 页代码,用不了 4 个小时)的变化测试系统。 简单的变化测试系统能让您用很少的时间和精力,就获得成熟的变化测试系统所提供的大部分好处。
变化测试是一种评估一组测试用例有效性的方法。 其原理很简单。 假设您有 100 个测试用例,并且被测系统 (SUT) 通过了这 100 个测试。 如果您改变 SUT,例如把“>”更改为“<”或把“+”更改为“-”,则有可能将一个错误引入到了 SUT。 现在,如果您重新运行这 100 个测试用例,则可以预见至少有一个测试用例会失败,表明其中一个测试用例捕获了错误代码。 但是,如果未看到测试失败,则很可能是您的这组测试用例错过了错误代码,未能彻底测试 SUT。
若要了解我将要介绍的内容,最好是看一下图 1。
图 1 变化测试运行演示
该示例中的 SUT 是一个名为 MathLib.dll 的库。 我在这里介绍的方法可用于测试大部分的 Microsoft .NET Framework 系统,包括 DLL、WinForms 应用程序、ASP.NET Web 应用程序等。 变化系统首先扫描 SUT 的原始源代码,寻找可进行更改的候选代码。我的超简单系统只搜索“<”和“>”运算符。 测试系统设置为创建并评估两处变化。 在实际的工作中,您可能会创建上百甚至上千个变化。 第一处变化会随机选择并更改一个运算符,本示例中,是 SUT 源代码中字符位置 189 上的“>”运算符,并将此符号更改为“<”。 接下来,构建变化 DLL 源代码以创建变化的 MathLb.dll 库。 然后,变化系统调用变化的 SUT 上的一组测试用例,并将结果记录到文件中。 第二次迭代会以同样的方法创建和测试第二处变化。 日志文件的结果如下所示:
============= Number failures=0 Number test case failures=0indicates possible weak test suite! ============= Number failures=3 This is good. ============= |
第一个变化未生成任何测试用例失败,这说明您应该检查 189 位置上的源代码并确定为何没有测试用例检查该代码。
SUT
我的超简单变化测试演示包含 3 个 Visual Studio 项目。 第一个项目包含 SUT,在本例中是一个名为 MathLib 的 C# 类库。 第二个项目是一个可执行的测试工具,在本例中是一个名为 TestMutation 的 C# 控制台应用程序。 第三个项目创建和构建变化,在本例中是一个名为 Mutation 的 C# 控制台应用程序。 为方便起见,我将三个项目放置到一个名为 MutationTesting 的目录中。 在变化测试中要跟踪很多文件和文件夹,您不应忽视妥善组织它们所面临的难度。 对于此演示,我使用了 Visual Studio 2008(可使用任何版本的 Visual Studio)来创建虚拟的 MathLib 类库。 图 2 显示了该虚拟 SUT 的完整源代码。
图 2 虚拟 SUT 的完整源代码
usingSystem; namespaceMathLib { publicclassClass1 { publicstaticdoubleTriMin(doublex,doubley,doublez) { if(x<y) returnx; elseif(z>y) returny; else returnz; } } } |