Могу ли я иметь утверждение в цикле и получить результат для каждого из утверждений, а не только один в конце? - PullRequest
0 голосов
/ 27 сентября 2019

Итак, у меня есть таблица значений, которую я хотел бы обработать одно за другим и подтвердить результаты.Вместо того, чтобы иметь несколько утверждений, у меня есть Assert внутри цикла.Это работает, и это повторяет каждый результат по очереди, но предоставляет мне только один результат.Если в таблице десять пунктов, я хотел бы получить десять результатов теста - возможно ли это?

[Test]
public void TestOne()
{
    var test = new SemParserLibrary.SemSummaryInfo();
    double[] testValues = new double[] {0, 0.0, 0.1, 1.1, 10, 010, 150, 299, 299.9, 300, 300.0};

    foreach (int i in testValues)
    {
        test.Rate.LogRate = i;
        var testFile = new ParserLibrary.SummaryInfo(test);
        var parsedRecord = ParserLibrary.FileManager.ParseRecord(testFile);
        Assert.AreEqual(parsedRecord.Summary.Data.Rate.LogRate, i, "The de-serialised Rate {0} does not match the input value of {1}", parsedRecord.Summary.Data.Rate.LogRate, i);
    }
}

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Учитывая, что мой комментарий, кажется, отвечает на вопрос, я опубликую его как ответ.

Тесты, управляемые данными позволяют параметризировать модульные тесты с данными тестов.Самый простой способ использовать это с атрибутом [TestCase]:

[TestCase(0)]
[TestCase(0.0)]
[TestCase(0.1)]  // etc.
public void TestOne(int i)
{
    var test = new SemParserLibrary.SemSummaryInfo();
    test.Rate.LogRate = i;
    var testFile = new ParserLibrary.SummaryInfo(test);
    var parsedRecord = ParserLibrary.FileManager.ParseRecord(testFile);
    Assert.AreEqual(parsedRecord.Summary.Data.Rate.LogRate, i, "The de-serialised Rate {0} does not match the input value of {1}", parsedRecord.Summary.Data.Rate.LogRate, i);
}

Это может быть утомительно, если у вас много тестовых данных.В этом случае вы можете использовать атрибут [TestCaseSource], который позволяет вам получить тестовые данные из статического свойства.В коде свойства вы можете либо жестко закодировать эти данные, либо получить их из базы данных, файла или любого другого источника данных.

0 голосов
/ 27 сентября 2019

Как отмечает @Peter, вместо этого вы можете использовать управляемый данными тест, используя TestCaseAttribute или TestCaseSourceAttribute.Это то, что я бы предпочел в вашем примере.

Однако, просто ответить на вопрос в том виде, в котором он был задан, да, это возможно.Вы бы сделали это так ...

[Test]
public void TestOne()
{
    var test = new SemParserLibrary.SemSummaryInfo();
    double[] testValues = new double[] {0, 0.0, 0.1, 1.1, 10, 010, 150, 299, 299.9, 300, 300.0};

    Assert.Multiple(() =>
    {
        foreach (int i in testValues)
        {
            test.Rate.LogRate = i;
            var testFile = new ParserLibrary.SummaryInfo(test);
            var parsedRecord = ParserLibrary.FileManager.ParseRecord(testFile);
            Assert.AreEqual(parsedRecord.Summary.Data.Rate.LogRate, i, "The de-serialised Rate {0} does not match the input value of {1}", parsedRecord.Summary.Data.Rate.LogRate, i);
        }
    });
}
...