Модульное тестирование различных foreach некоторых входов - PullRequest
1 голос
/ 30 июня 2010

Специально для C # Unit Testing , как выполнить тестовый прогон для различных входов или матрицы ввода?

У меня очень часто бывают случаи модульных тестов, составляющих матрицу входных данных, но обычно это можно решить путем проверки списка входных данных.

Простейший случай - тестирование дополнения :

  • 0 + 0 = 0
  • 1 + 0 = 1
  • 0 + -1 = -1
  • 1 + -1 = 0

Те же тесты будут выполняться для каждого из этих входов (в этом примере есть 4 входа, каждый из которых связан с некоторым ожидаемым выходом.

Простое решение :

object[] inputs = ...
foreach (var input in inputs)
   // Put Assert here

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

Другое решение - развернуть цикл (как показано ниже). Затем трассировка стека дает данные о том, какой вход не прошел, и это позволяет снова запустить тест для одного входа.

TestAddition(0, 0, 0);
TestAddition(1, 0, 1);
TestAddition(0, -1, -1);
TestAddition(1, -1, 0);

И последнее, но не менее важное: такие решения, как FitNess , которые, кажется, помогают в таких случаях, но также добавляют много сложности и, кажется, не подходят для стандартной разработки на C #.

Все эти решения плохо работают с приборами, потому что [TestInitialize] вызывается один раз для всех входов.

Каково ваше решение?

Есть ли какая-то функция, о которой я не знаю, которая помогает этим случаям?

Ответы [ 3 ]

5 голосов
/ 30 июня 2010

Если вы используете NUnit, вы должны взглянуть на атрибут TestCase .

[TestCase(0,0,0)]
[TestCase(1,0,1)]
[TestCase(0,-1,-1)]
[TestCase(1,-1, 0)]
public void AdditionTest(int x, int y, int z)
{
  Assert.AreEqual( z, x+y );
}
2 голосов
/ 30 июня 2010

Это возможно. Вы пропустили термин «Тесты на основе данных» / Параметризованные тесты. Попробуйте использовать поисковую систему, и вы должны найти немало ответов для вашей конкретной среды тестирования.

В большинстве сред тестирования xUnit есть механизмы, позволяющие это сделать. Как писал Мартин, NUnit использует атрибут RowTest / TestCase для передачи параметров в тест.

1 голос
/ 30 июня 2010

Взгляните на Pex .Вы можете попробовать онлайн , прежде чем решить, стоит ли скачивать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...