变化测试系统
在这部分中,我将逐行向您介绍变化测试程序,但是省略了图 1 中所示的用于生产输出的 WriteLine 语句的大部分内容。 我在 MutationTesting 根目录中创建了一个名为 Mutation 的 C# 控制台应用程序。 该程序的开头如下所示:
using System; using System.Collections.Generic; using System.IO; using System.Diagnostics; using System.Threading; namespace Mutation { class Program { static Random ran =new Random(2); staticvoid Main(string[] args) { try { Console.WriteLine("\nBegin super-simple mutation testing demo\n"); ... |
Random 对象的目的是生成一个随机的变化位置。 我使用了一个种子值 2,但其实任意值都可以。 接下来,设置文件位置:
string originalSourceFile =".. \\.. \\Class1-Original.cs"; string mutatedSourceFile =".. \\.. \\.. \\MathLib\\Class1.cs"; string mutantProject =".. \\.. \\.. \\MathLib\\MathLib.csproj"; string testProject =".. \\.. \\.. \\TestMutation\\TestMutation.csproj"; string testExecutable = ".. \\.. \\.. \\TestMutation\\bin\\Debug\\TestMutation.exe"; string devenv ="C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\Common7\\IDE\\devenv.exe"; ... |
稍后,您将看到如何使用每个文件。 请注意,我所指向的 devenv.exe 程序与 Visual Studio 2008 相关联。 我没有对该位置进行硬编码,而是生成一个 devenv.exe 的副本,并放置到变化系统的根文件夹中。
程序继续:
List<int> positions = GetMutationPositions(originalSourceFile); int numberMutants =2; ... |
我调用帮助程序 GetMutationPositions 方法来扫描原始源代码文件并将所有的“<”和“>”字符的字符位置存储到 List 中,然后将要创建和测试的变化数量设置为 2。
主处理循环为:
for (int i =0; i < numberMutants; ++i) { Console.WriteLine("Mutant # "+ i); int randomPosition = positions[ran.Next(0, positions.Count)]; CreateMutantSource(originalSourceFile, randomPosition, mutatedSourceFile); try { BuildMutant(mutantProject, devenv); BuildTestProject(testProject, devenv); TestMutant(testExecutable); } catch { Console.WriteLine("Invalid mutant. Aborting."); continue; } } ... |