2010-06-07 2 views
2

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

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

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

ответ

5

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

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

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

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 

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

+0

Является 'sum.ShouldEqual (data.sum);' опечатка? – MickyD

0

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

что-то вроде: = СЦЕПИТЬ ("[TestCase (" A1 " " B1,", " С1,", " D1,",", E1 ")]")

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

Смежные вопросы