C#,NUnit在循环中断言

我有一个学校作业,我需要创建一个数据驱动的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个失败的测试! 任何帮助将不胜感激,谢谢! 🙂

[TestCaseSource]属性允许您执行此操作。 您可以创建一个返回可枚举测试用例列表的函数

 public IEnumerable 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); } } 

您可以使用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在做什么。

除了使用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); } }