将多对文件送入测试方法

时间:2009-11-07 01:17:42

标签: c# unit-testing

我有一个测试方法,用于针对已知的良好输出测试类的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);
    }

该方法效果很好,但我已经有几对输入/输出文件。经验告诉我,我不想为每一对编写单独的测试方法。我也不想遍历每对文件,因为我不知道哪一对导致测试失败。我该怎么办?

3 个答案:

答案 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);
}