Использовать внешний источник данных с TestCaseAttribute NUnit - PullRequest
2 голосов
/ 07 июня 2010

Можно ли получить значения для TestCaseAttribute из внешнего источника данных, такого как электронная таблица Excel, файл CSV или база данных? то есть иметь файл .csv с 1 строкой данных для каждого теста и передавать эти данные в NUnit по одному за раз.

Вот конкретная ситуация, для которой я хотел бы использовать это. В настоящее время я объединяю некоторые функции из одной системы в другую. Это в значительной степени просто процесс копирования и вставки из старой системы в новую. К сожалению, перемещаемый код не только не имеет каких-либо тестов, но и не написан тестируемым образом (то есть тесно связан с базой данных и другим кодом.) Потратить время на то, чтобы сделать код тестируемым, на самом деле невозможно, так как большой беспорядок, у меня плотный график, и вся функция будет переписана с нуля в ближайшие 6-9 месяцев. Однако, поскольку мне не нравится идея отсутствия каких-либо тестов вокруг кода, я собираюсь создать несколько простых тестов Selenium с использованием WebDriver для тестирования страницы через пользовательский интерфейс. Хотя это не идеально, но лучше, чем ничего.

На рассматриваемой странице есть около 10 входных значений и около 20 значений, которые мне нужно утверждать после завершения вычислений, и около 30 допустимых комбинаций значений, которые я хотел бы проверить. У меня уже есть данные в электронной таблице, поэтому было бы неплохо просто извлечь их, вместо того, чтобы перепечатывать их все в Visual Studio.

Ответы [ 2 ]

5 голосов
/ 22 июля 2010

Я наконец смог выполнить то, что хотел, используя атрибут NUnit TestCaseSource . Код выглядит немного некрасиво, но работает.

Вот пример извлечения данных из файла .csv и передачи их в метод теста. Тест предназначен для метода Add простого калькулятора, который берет два целых числа, складывает их вместе и возвращает сумму.

Класс для загрузки тестовых данных из файла.

public class TestData
{
    public int number1 { get; set; }
    public int number2 { get; set; }
    public int sum { get; set; }

    public static IEnumerable TestCases
    {
        get
        {
            string inputLine;
            using(FileStream inputStream = 
                new FileStream("C:\\Code\\TestData\\TestData.csv", 
                    FileMode.Open, 
                    FileAccess.Read))
            {
                StreamReader streamReader = new StreamReader(inputStream);

                while((inputLine = streamReader.ReadLine()) != null)
                {
                    var data = inputLine.Split(',');
                    yield return new TestData { 
                        number1 = Convert.ToInt32(data[0])
                        ,number2 = Convert.ToInt32(data[1])
                        ,sum = Convert.ToInt32(data[2]) 
                    };
                }

                streamReader.Close();
                inputStream.Close();
            }
        }
    }
}

Класс с актуальными тестами:

[TestFixture]
public class CalculatorTests
{
    [Test]
    [TestCaseSource(typeof(TestData), "TestCases")]
    public void AddTwoNumbers(TestData data)
    {
        int sum = Calculator.Add(data.number1, data.number2);
        sum.ShouldEqual(data.sum);
    }
}

Содержимое TestData.csv

4,4,8
15,20,35
8,8,16
5,5,10
42,13,55

Должно быть довольно просто изменить свойство get в классе TestData для извлечения данных из любого источника данных, который вы хотите (например, базы данных, веб-службы, Excel ...)

0 голосов
/ 07 июня 2010

Вы всегда можете открыть свой CSV-файл в Excel или любом другом инструменте для работы с электронными таблицами, а затем добавить новый столбец, объединяющий значения ввода / вывода в синтаксис тестового примера.

Что-то вроде: = CONCATENATE ("[TestCase (", A1, ",", B1, ",", C1, ",", D1, ",", E1, ")]")

Затем скопируйте / вставьте столбец в код.

...