C #, NUnit Assert в цикле - PullRequest
       3

C #, NUnit Assert в цикле

14 голосов
/ 15 февраля 2011

У меня есть школьное задание, где мне нужно создать управляемый данными стиль тестирования 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 ]

16 голосов
/ 15 февраля 2011

Атрибут [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);
        }
    }
3 голосов
/ 15 февраля 2011

Вы можете сделать это с помощью тестов, управляемых данными, в 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.

2 голосов
/ 15 февраля 2011

Помимо использования расширения 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);
    } 
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...