如何让NUnit测试列表中的所有值,而不仅仅是第一次失败

时间:2012-06-28 16:55:07

标签: unit-testing nunit

这里只是一些示例代码,但我有一些字符串列表,我想测试我的函数。我不喜欢的部分是当第一个Assert失败时NUnit在每个测试中停止。我想测试每个值并报告每个失败,而不仅仅是第一个失败。我不想为每个字符串写一个新的[Test]函数。

有办法做到这一点吗?

using NUnit.Framework;
using System.Collections.Generic;

namespace Examples
{
    [TestFixture]
    public class ExampleTests
    {
        private List<string> validStrings = new List<string> { "Valid1", "valid2", "valid3", "Valid4" };
        private List<string> invalidStrings = new List<string> { "Invalid1", "invalid2", "invalid3", "" };

        [Test]
        public void TestValidStrings()
        {
            foreach (var item in validStrings)
            {
                Assert.IsTrue(item.Contains("valid"), item);
            }
        }

        [Test]
        public void TestInvalidStrings()
        {
            foreach (var item in invalidStrings)
            {
                Assert.IsFalse(item.Contains("invalid"), item);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:6)

使用[TestCaseSource]属性指定要传递到(现已参数化)测试方法的值。

我们在Noda Time中使用 lot 来测试很多具有不同文化和字符串的案例。

这是你的例子,转换为使用它:

using NUnit.Framework;
using System.Collections.Generic;

// Namespace removed for brevity    
[TestFixture]
public class ExampleTests
{
    private List<string> validStrings = new List<string> 
        { "Valid1", "valid2", "valid3", "Valid4" };
    private List<string> invalidStrings = new List<string> 
        { "Invalid1", "invalid2", "invalid3", "" };

    [Test]
    [TestCaseSource("validStrings")]
    public void TestValidStrings(string item)
    {
        Assert.IsTrue(item.Contains("valid"), item);
    }

    [Test]
    [TestCaseSource("invalidStrings")]
    public void TestInvalidStrings(string item)
    {
        Assert.IsFalse(item.Contains("invalid"), item);
    }
}

请注意,另一个选项是使用[TestCase],这意味着您的测试数据不需要单独的变量。