Unit testing NUnit大师的一个选择:升级到2.x并使用现有测试工具的新功能

Unit testing NUnit大师的一个选择:升级到2.x并使用现有测试工具的新功能,unit-testing,nunit,standards,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); // Alrigh

我最近升级到了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);

}
[TestCase(0, 44)]
[TestCase(-1, -34)]
public void TestTheSpecialDict(int start, int end) {
    /* ... */
}
[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);

}
太棒了。这里的问题当然是,第二个断言在第一个测试用例中失败,而第一个断言在第二个测试用例中失败。这显然是预期的行为,因为
start
end
具有方法范围并适用于这两个操作。不足为奇

修复此问题不是问题:

  • 将测试用例分成两种不同的方法。在这一点上,代码和测试用例的重复是多余的
  • 添加一个额外的测试用例参数(如顺序值)并基于该参数调整断言调用。考虑到我的测试量,我做了很多工作
  • 还有一件我没想到的事

有“更干净”的方法吗?我已经浏览了
NUnit.Framework
,我想我看不到任何东西可以让我流利地完成这项工作。所以我想知道是否有人在NUnit 1.x上拥有这种类型的“遗留”UT结构,以及他们是如何在利用新功能的同时进行迁移的

请原谅我没有用Visual Studio来测试这个。但可能使用Assert.That并传入一个求值参数。大概是这样的:

[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);

}
[TestCase(0, 44)]
[TestCase(-1, -34)]
public void TestTheSpecialDict(int start, int end) {
    /* ... */
}
[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);

}
[TestCase(0,44,大于(0))]
[测试用例(-1,-34,为.Empty]
public void test特殊指令(int start、int end、Func条件){
/* ... */
断言(命令计数、条件);
}

再次为其不精确表示歉意,特别是参数类型可能只是猜测,但基本思想应该是正确的。

我个人认为这些TestCase属性对于测试接受一些参数并返回一些值的函数很有用。因此,在属性中,您可以为其提供参数和期望值d它很好用。在你的例子中,你可以有字典的精确计数,如果它是正数,也可以有一个布尔值。但是我不相信它是否会增加你的例子的可读性…

谢谢。这是一个好主意。事实上,问题是NUnit在测试用例中不允许除常量以外的任何东西卡车司机,所以它死的时候受到了限制。该死,那会很有效的:(