C#中循环中的NUnit断言

16

我有一个学校作业,需要创建一种基于数据驱动的 NUnit 测试风格。使用下面的代码,我能够从数据库中获取数据,但是每次“Assert”调用失败时,测试都会停止。

是否有任何方法可以将循环的结果显示为六个不同的测试(考虑到数据库中有六行)?

namespace TestClasses
{
    [TestFixture]
    public class TestingClass : ConnectionClass
    {
        private ProductManagement pm;

        [TestFixtureSetUp]
        public void CreateTestClass()
        {
            pm = new ProductManagement();
        }

        [TestCase]
        public void GetProductDetailsTest()
        {
            SqlDataAdapter da = new SqlDataAdapter("Select * From GetProductDetailsTest;", Connection);
            Database1DataSet.GetProductDetailsTestDataTable dt = new Database1DataSet.GetProductDetailsTestDataTable();
            da.Fill(dt);

            foreach (Database1DataSet.GetProductDetailsTestRow dr in dt.Rows)
            {
                if (pm.GetProductById(dr.productId) == null)
                    Assert.Fail("Id of test case: " + dr.id + ", Product id of failure: " + dr.productId);
            }
        }
    }
}

我需要的是,如果可能的话,NUnit能够显示3个通过的测试和3个失败的测试!非常感谢您的帮助,谢谢!:)

3个回答

18
[TestCaseSource]属性可以让您做到这一点。您可以创建一个返回可枚举的测试用例列表的函数。
public IEnumerable<Database1DataSet.GetProductDetailsTestRow> GetTestCases()
{
    SqlDataAdapter da = new SqlDataAdapter("Select * From GetProductDetailsTest;", Connection);
    Database1DataSet.GetProductDetailsTestDataTable dt = new Database1DataSet.GetProductDetailsTestDataTable();
    da.Fill(dt);

    foreach (Database1DataSet.GetProductDetailsTestRow dr in dt.Rows)
    {
        yield return dr;
    }
}

那么你可以传递一个 TestCaseSource:

    [Test, TestCaseSource("GetTestCases")]
    public void GetProductDetailsTest(Database1DataSet.GetProductDetailsTestRow dr)
    {
        if (pm.GetProductById(dr.productId) == null)
            Assert.Fail("Id of test case: " + dr.id + ", Product id of failure: " + dr.productId);
        }
    }

我尝试了相同的方法,但是我一直收到空引用错误。这是我在Stackoverflow上发布的问题链接:http://stackoverflow.com/questions/28624270/c-sharp-nunit-using-testcasesource-results-in-nullpointer - joesan

4

您可以使用NUnit中的数据驱动测试来完成此操作,但我不确定您是否可以对来自数据库的数据执行此操作。大致步骤如下:

[TestFixture]
public class RowTestSample
{
     [RowTest]
     [Row( 1)]
     [Row( 2)]
     [Row( 3)]
     [Row( 4)]
     [Row( 5)]
     [Row( 6)]
     public void GetProductById(int productId)
     {
          Assert.That(pm.GetProductById(productId),Is.Not.Null);
     }
}

Row(n)中的值是您要测试的产品ID。这将显示为6个测试,每个测试都有不同的值。

我不确定这些值是否可以来自数据库,但在测试中进行此操作可能并不是一个好主意。

我也不确定这些测试的价值,这取决于ProductManager正在做什么。


2
除了像Sam Holder建议的使用RowTest扩展之外,您还可以使用TestCaseAttribute来实现此功能:
[TestFixture]
public class TestCaseSample 
{      
    [TestCase(1)]
    [TestCase(2)]
    [TestCase(3)]
    [TestCase(4)]
    [TestCase(5)]
    [TestCase(6)]
    public void GetProductById(int productId)
    {           
        Assert.That(pm.GetProductById(productId),Is.Not.Null);
    } 
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接