2011-02-15 76 views
14

我有一个学校作业,我需要创建一个数据驱动的NUnit测试风格。使用下面的代码,我可以从数据库获取数据,但每次'Assert'调用失败时,测试都会停止。C#,NUnit声明在循环中

有没有什么方法可以将循环的结果实际显示为六个不同的测试(考虑到我的数据库中有六行)?

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个失败的测试!任何帮助将不胜感激,谢谢! :)

回答

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); 
     } 
    } 
+0

这很酷!它在NUnit 2.5.3中可用,有时间升级! – Jonathan 2011-02-15 14:53:55

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

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