С#, NUnit Assert в цикле
У меня есть школьное задание, где мне нужно создать управляемый данными стиль тестирования 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 неудачных теста, если это возможно! Любая помощь будет принята с благодарностью, спасибо!:)
Ответы
Ответ 1
Атрибут [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);
}
}
Ответ 2
вы можете сделать это, используя тесты, управляемые данными в 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)
являются идентификаторами продуктов, которые вы хотите проверить. Это будет отображаться как 6 тестов, каждый из которых имеет другое значение.
Я не уверен, что это может произойти из БД, но, вероятно, в любом случае это не очень хорошо.
Я не уверен в ценности этих тестов, я полагаю, это зависит от того, что делает ProductManager.
Ответ 3
Помимо использования расширения 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);
}
}