我有一个学校作业,我需要创建一个数据驱动的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个失败的测试!任何帮助将不胜感激,谢谢! :)
答案 0 :(得分:16)
[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);
}
}
答案 1 :(得分:3)
您可以使用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 :(得分: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);
}
}