Тестирование на основе данных в NUnit? - PullRequest
12 голосов
/ 27 октября 2010

В MSTest вы можете сделать что-то вроде:

[TestMethod]
[DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", 
            "testdata.csv", "testdata#csv", DataAccessMethod.Sequential)]
public void TestSomething()
{
    double column1 = Convert.ToDouble(TestContext.DataRow["column1"]);
    ...
    Assert.AreEqual(...);
}

Что такое эквивалентный код в NUnit 2.5?

Ответы [ 5 ]

12 голосов
/ 23 мая 2011

Я получил основанное на csv тестирование данных в NUnit, которое работает следующим образом:

Используйте csv reader из проекта кода , обернутый в закрытый метод, возвращающий IEnumerable в ваш тестовый класс, изатем свяжите это с атрибутом TestCaseSource в ваших тестовых примерах.Включите ваш CSV-файл в свой проект и установите " Копировать в выходной каталог " в " Копировать всегда" .

using System.Collections.Generic;
using System.IO;
using LumenWorks.Framework.IO.Csv;
using NUnit.Framework;

namespace mytests
{
    class MegaTests
    {
        [Test, TestCaseSource("GetTestData")]
        public void MyExample_Test(int data1, int data2, int expectedOutput)
        {
            var methodOutput = MethodUnderTest(data2, data1);
            Assert.AreEqual(expectedOutput, methodOutput, string.Format("Method failed for data1: {0}, data2: {1}", data1, data2));
        }

        private int MethodUnderTest(int data2, int data1)
        {
            return 42; //todo: real implementation
        }

        private IEnumerable<int[]> GetTestData()
        {
            using (var csv = new CsvReader(new StreamReader("test-data.csv"), true))
            {
                while (csv.ReadNextRecord())
                {
                    int data1 = int.Parse(csv[0]);
                    int data2 = int.Parse(csv[1]);
                    int expectedOutput = int.Parse(csv[2]);
                    yield return new[] { data1, data2, expectedOutput };
                }
            }
        }
    }
}

оригинальное сообщение по адресу: http://timwise.blogspot.com/2011/05/data-driven-test-in-nunit-with-csv.html

7 голосов
/ 27 октября 2010

Я бы посмотрел документацию по параметризованным тестам в NUnit 2.5 и выяснил, можете ли вы сделать что-то вроде того, что вы там делаете.Я не помню, чтобы NUnit имел встроенный атрибут чтения CSV для проведения параметризованных тестов.Хотя где-то может быть плагин для сообщества.

Я должен также отметить, что если вы просто ищете библиотеки фреймворка для не-MS Unit Testing, чтобы помочь вам, xUnit.net действительно имеет эту функцию.Проверьте это сообщение в блоге от Бена Холла

3 голосов
/ 24 апреля 2014

Вот еще один пример, очень похожий на то, что Тим Абелл, однако, не использует каркас для ридера CSV и показывает особенности теста. Обратите внимание, что при использовании TestCaseAttribute TestAttribute может быть опущен.

        [TestCaseSource("GetDataFromCSV")]
    public void TestDataFromCSV(int num1,int num2,int num3)
    {
        Assert.AreEqual(num1 + num2 ,num3);
    }

    private IEnumerable<int[]> GetDataFromCSV()
    {
        CsvReader reader = new CsvReader(path);
        while (reader.Next())
        {
            int column1 = int.Parse(reader[0]);
            int column2 = int.Parse(reader[1]);
            int column3 = int.Parse(reader[2]);
            yield return new int[] { column1, column2, column3 };
        }
    }


public class CsvReader : IDisposable
{
    private string path;
    private string[] currentData;
    private StreamReader reader;

    public CsvReader(string path)
    {
        if (!File.Exists(path)) throw new InvalidOperationException("path does not exist");
        this.path = path;
        Initialize();
    }

    private void Initialize()
    {
        FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read);
        reader = new StreamReader(stream);
    }

    public bool Next()
    {
        string current = null;
        if ((current = reader.ReadLine()) == null) return false;
        currentData = current.Split(',');
        return true;
    }

    public string this[int index]
    {
        get { return currentData[index]; }
    }


    public void Dispose()
    {
        reader.Close();
    }
}

Данные CSV:

10200210 20190210 30180210 40170210 50160210 60150210 70140210 80130210 90120210 100110210

Примечание: 3-й столбец представляет собой сумму первых двух столбцов, и это будет подтверждено в модульном тесте.

Результаты:

results

Найдите ниже альтернативу, используя объекты TestCaseData и установив тип возврата (который вне курса является обязательным)

        [TestCaseSource("GetDataFromCSV2")]
    public int TestDataFromCSV2(int num1, int num2)
    {
        return num1 + num2;
    }

    private IEnumerable GetDataFromCSV2()
    {
        CsvReader reader = new CsvReader(path);
        while (reader.Next())
        {
            int column1 = int.Parse(reader[0]);
            int column2 = int.Parse(reader[1]);
            int column3 = int.Parse(reader[2]);
            yield return new TestCaseData(column1, column2).Returns(column3);
        }
    }
0 голосов
/ 30 марта 2019

MS Test предоставляет механизм для получения ваших тестовых данных из разных источников.Однако это не доступно из коробки от NUnit.

Я за использование разделения данных и кода для тестов, которые имеют значительный размер.Когда я разделяю оба, я ожидаю 1. Читаемость тестовых данных 2. Тестовые данные должны быть легко модифицируемыми 3. Модульные тесты должны комфортно работать в локальной среде и в среде сборкиниже есть все функции, которые я хотел бы иметь.Инструмент способен читать разделы данных из встроенных файлов JSON.Это также обеспечивает очень удобный механизм для десериализации.

https://www.nuget.org/packages/WonderTools.JsonSectionReader/

PS Я поддерживаю этот проект, и этот проект был создан, потому что я не нашел никакого другого инструмента, который решаетэта проблема в той степени, в которой я хотел.

0 голосов
/ 27 октября 2010

Я думаю, что Nunit эквивалентно помечать метод как метод настройки, а затем загружать данные в поле, которое будет использоваться в последующих тестах.

Вы должны кодировать его самостоятельно, более или менее.

...