一个针对NUnit专家:升级到2.x并使用现有测试工具的新功能

时间:2010-07-22 01:17:15

标签: unit-testing nunit standards

我最近升级到NUnit 2.5(是的,我知道),我想知道我是否可以选择某人的大脑。

我有很多看起来像这样的测试:

[Test]
public void TestTheSpecialDict() {

    int start = 0;
    int end = 44;

    Dictionary<int, string> = SomeFunction(start, end);
    Assert.That(dict1.Count > 0);

    // Alright now, some funky values
    start = -1;
    end = -34;
    Dictionary<int, string> dict2 = SomeFunction(start, end);

    Assert.That(dict2.Count == 0);

}

因此,此特定测试可确保SomeFunction在范围无效时返回空字典,而不是null。例如。

现在我在2.x中发现了[TestCase(...)]属性。我的天啊!所以我希望我的测试看起来像这样:

[TestCase(0, 44)]
[TestCase(-1, -34)]
public void TestTheSpecialDict(int start, int end) {
    /* ... */
}

真棒。这里的问题当然是第二个Assert在第一个测试用例中失败,第一个断言在第二个失败。这显然是预期的行为,因为startend具有方法范围并适用于这两种操作。毫不奇怪。

解决这个问题不是问题:

  • 将测试用例分为两种不同的方法。重复代码,实际上,TestCase在这一点上将是多余的。
  • 添加一个额外的测试用例参数(如顺序值)并基于此调节Assert调用。考虑到我的测试数量,我需要做很多工作。
  • 我还没有其他的东西。

有“清洁”的方式吗?我查看了NUnit.Framework,我看不出任何可以让我这么做的事情流利我想。所以我想知道是否有人在NUnit 1.x中拥有这种“遗留”UT结构,以及他们如何在利用新功能的同时迁移。

2 个答案:

答案 0 :(得分:1)

请原谅我没有使用Visual Studio来测试它。但也许使用Assert.That并传入一个评估参数。像这样:

[TestCase(0, 44, Is.GreaterThan(0))]
[TestCase(-1, -34, Is.Empty]
public void TestTheSpecialDict(int start, int end, Func<Dictionary<int, string>, bool> condition) {
    /* ... */

    Assert.That(dict.Count, condition);

}

再次道歉它不准确,特别是参数类型可能只是猜测它,但基本的想法应该成立。

答案 1 :(得分:1)

我个人认为这些TestCase属性对于测试带有一些参数并返回一些值的函数非常有用。所以在属性中你可以给它参数和期望值,它工作正常。在你的情况下,你可以有你的字典的确切计数或如果它的正面的布尔值。我不相信它会增加你的情况下的可读性......