3

这里只是一些示例代码,但我有要测试我的函数的字符串列表。我不喜欢的部分是当第一个 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);
            }
        }
    }
}
4

1 回答 1

6

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

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

这是您的示例,已转换为使用它:

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],这意味着您的测试数据不需要单独的变量。

于 2012-06-28T16:58:00.090 回答