构建和测试变化
BuildMutant 帮助程序方法是:
staticvoid BuildMutant(string mutantSolution, string devenv) { ProcessStartInfo psi = new ProcessStartInfo(devenv, mutantSolution +" /rebuild"); Process p =new Process(); p.StartInfo = psi; p.Start(); while (p.HasExited ==false) { System.Threading.Thread.Sleep(400); Console.WriteLine("Waiting for mutant build to complete . . " ); } p.Close(); } |
我使用 Process 对象来调用 devenv.exe 程序以重新构建 Visual Studio 解决方案,该方案中包含已变化的 Class1.cs 源代码并产生 MathLib.dll 变化。 无需参数,devenv.exe 便可启动 Visual Studio IDE,但是当参数传递后,devenv 即可用于重新构建项目或解决方案。 请注意,我使用了延时循环,每 400 毫秒暂停一次以便让 devenv.exe 有时间完成构建变化 DLL;否则,变化系统会在变化 SUT 创建之前即尝试测试它。
用于重新构建测试工具的帮助程序方法是:
staticvoid BuildTestProject(string testProject, string devenv) { ProcessStartInfo psi = new ProcessStartInfo(devenv, testProject +" /rebuild"); Process p =new Process(); p.StartInfo = psi; p.Start(); while (p.HasExited ==false) { System.Threading.Thread.Sleep(500); Console.WriteLine("Waiting for test project build to complete . . " ); } p.Close(); } |
这里的主要思路是,通过重新构建测试项目,测试工具在执行时会使用新的变化 SUT 而不使用以前使用过的变化 SUT。 如果您的变化源代码无效,则 BuildTestProject 将抛出异常。
超简单变化测试系统的最后一个部分是用于调用测试工具的帮助程序方法:
... staticvoid TestMutant(string testExecutable) { ProcessStartInfo psi =new ProcessStartInfo(testExecutable); Process p =new Process(); p.StartInfo = psi; p.Start(); while (p.HasExited ==false) System.Threading.Thread.Sleep(200); p.Close(); } } // class Program } // ns Mutation |
正如我前面谈到的,测试工具使用硬编码的日志文件名称和位置,但您可以将其参数化,方法是将信息作为参数传递给 TestMutant,并放在 Process 的 StartInfo 中(在此,它可被 TestMutation.exe 测试工具接受)。
实际应用的变化测试系统
变化测试从原理上讲并不复杂,但是创建一个成熟的变化测试系统需要注意的细节却很有挑战性。 然而,通过尽可能简化变化测试系统,并利用 Visual Studio 和 devenv.exe,您可针对 .NET SUT 创建非常有效的变化测试系统。 使用我在此处介绍的示例,您应该可以创建自己的 SUT 变化测试系统。 示例变化测试系统的主要限制在于,由于该系统是基于单字符更改,因此,您不能轻松执行多字符运算符的变化,例如将“>=”更改为其求补运算符“<”。 另一个限制是,该系统仅为您提供变化的字符位置,不能让您轻松诊断变化。 尽管存在这些限制,但该示例系统已成功运用到许多中型软件系统中,用来衡量测试套件的有效性。