我有一个测试方法,用于针对已知的良好输出测试类的ToString()方法。
/// <summary>
///A test for ToString
///</summary>
[TestMethod()]
public void ToStringTest()
{
string input = System.IO.File.ReadAllText(@"c:\temp\input2005.txt");
MyClass target = new MyClass(input);
string expected = System.IO.File.ReadAllText(@"c:\temp\output2005.txt");
string actual;
actual = target.ToString();
Assert.AreEqual(expected, actual);
}
该方法效果很好,但我已经有几对输入/输出文件。经验告诉我,我不想为每一对编写单独的测试方法。我也不想遍历每对文件,因为我不知道哪一对导致测试失败。我该怎么办?
答案 0 :(得分:1)
你可以在你的测试中使用一个循环但是你只能获得一次通过或失败。一些测试框架将为每组输入生成并运行单独的测试,如下所示:
[Test]
[Row(@"c:\temp\input2005.txt", @"c:\temp\output2005.txt")]
[Row(@"c:\temp\input2006.txt", @"c:\temp\output2006.txt")]
[Row(@"c:\temp\input2007.txt", @"c:\temp\output2007.txt")]
public void ToStringTest(string inputPath, string expectedPath)
{
string input = System.IO.File.ReadAllText(inputPath);
MyClass target = new MyClass(input);
string expected = System.IO.File.ReadAllText(expectedPath);
string actual;
actual = target.ToString();
Assert.AreEqual(expected, actual);
}
以上内容适用于MbUnit,但我相信其他许多框架也支持类似的功能。
顺便说一句,单元测试不应该真正触及文件系统,因为外部因素(例如文件被锁定)会导致测试失败,这会使测试变得不可靠。
答案 1 :(得分:0)
如果您希望测试所有文件对,可以将失败的文件作为消息放入断言中:
foreach(file in filenames)
{
/* run your test */
Assert.AreEqual(expected, actual, "Failure occured on file: " + file);
}
这将打印出一条消息,告诉您哪个文件发生了故障。
此外,您可以在测试本身内指定字符串,而不是将它们放在extrenal文件中。我不确定您的测试是如何设置的,但如果您这样做,则不必担心文件路径的外部依赖性:
MyClass target = new MyClass("myTestString");
string actual = target.ToString();
string expected = "MyExpectedString";
Assert.AreEqual(expected, actual);
这会将所有测试数据保存在一起。
答案 2 :(得分:0)
MbUnit框架具有行测试的概念,我相信有一个针对2.4的NUnit Add-In,它为NUnit提供了类似的功能。使用MbUnit语法看起来像这样:
/// <summary>
///A test for ToString
///</summary>
[Test]
[RowTest(@"c:\temp\input2005.txt", @"c:\temp\output2005.txt")]
[RowTest(@"c:\temp\input2006.txt", @"c:\temp\output2006.txt")]
[RowTest(@"c:\temp\input2007.txt", @"c:\temp\output2007.txt")]
public void ToStringTest(string inputFile, string outputFile)
{
string input = System.IO.File.ReadAllText(inputFile);
MyClass target = new MyClass(input);
string expected = System.IO.File.ReadAllText(outputFile);
string actual;
actual = target.ToString();
Assert.AreEqual(expected, actual);
}