代码之家  ›  专栏  ›  技术社区  ›  kprobst

NUnit专家的一个建议是:升级到2.x并使用现有测试工具的新特性

  •  0
  • kprobst  · 技术社区  · 15 年前

    我有很多这样的测试:

    [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

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

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

    令人惊叹的。当然,这里的问题是,第二个断言在第一个testcase中失败,而第一个断言在第二个testcase中失败。这显然是人们期待的行为 start end 具有方法范围并应用于两个操作。不奇怪。

    解决这个问题不是问题:

    • 添加一个额外的测试用例参数(比如一个序列值)并在此基础上调整Assert调用。考虑到我的测试量,我做了很多工作。

    有“更干净”的方法吗?我已经看过了 NUnit.Framework 我看不出有什么能让我这么做的 流利地 我想是吧。所以我想知道是否有人在nunit1.x上拥有这种类型的“遗留”UT结构,以及他们是如何在利用新特性的同时进行迁移的。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Grzenio    15 年前

    我个人认为这些TestCase属性对于测试接受一些参数并返回一些值的函数非常有用。所以在属性中,你可以给它参数和期望值,它就可以正常工作了。在你的例子中,你可以有字典的精确计数或者布尔值(如果是正数)。我不相信这是否会增加你的可读性的情况下,虽然。。。。

        2
  •  1
  •   Matt    15 年前

    请原谅我没有用visualstudio来测试这个。但可能使用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);
    
    }
    

    再次对它不准确表示歉意,特别是参数类型可能只是一个猜测,但基本思想应该是正确的。