Подтвердить что ты не робот

Проверьте несколько различных входов примера в одном тесте?

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

Однако я могу придумать кучу разных способов протестировать те же самые function ([email protected]; [email protected]; test.test.com и т.д.).

Я помещаю все заклинания, которые мне нужно проверить в одном и том же одиночном тест с несколькими ASSERTS или я пишу новый тест для каждого что я могу придумать?

Спасибо!

4b9b3361

Ответ 1

Большинство тестовых фреймворков теперь поддерживают какое-то тестирование на основе данных, чтобы вы могли запускать один и тот же тест на нескольких наборах данных.

Обратитесь к ValuesAttribute в NUnit.

xUnit.net, MBUnit и другие аналогичные методы.

Ответ 2

Вообще я создаю много разных тестов и даю каждому свое имя. Например, допустим, что для сопоставления адреса электронной почты существует 3 разных регулярных выражения {A, B и C}. Функция проверяет входящую электронную почту для соответствия и принимает первое найденное совпадение.

У меня были бы следующие тесты.

  • ATypeEmailShouldMatchPatternA
  • BTypeEmailShouldMatchPatternB
  • CTypeEmailShouldMatchPatternC
  • BadEmailShouldNotMatchAnyPattern
  • EmailCompatibleWithPatternAAndPatternBShouldBeMatchedByA
  • EmailCompatibleWithPatternAAndCShouldBeMatchedByA
  • EmailCompatibleWithPatternBAndCShouldBeMatchedByB

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

Иногда, однако, я стану более чем один утверждать в тесте, если утверждения все проверяют разные части одной и той же вещи. Например, допустим, что у меня есть функция, которая находит все письма, соответствующие шаблону A. Мои тестовые каналы в списке писем, но только один шаблон соответствия A. Функция возвращает список, и я ожидаю, что этот список будет иметь только один элемент в Это. Поэтому я бы сказал две вещи:

  • Что список имеет в нем один элемент.
  • То, что один элемент является адресом электронной почты, который соответствует шаблону А.

Ответ 3

Как отметил @Paul, несколько тестовых платформ поддерживают RowTests. Используя эту функцию, вы можете написать что-то чудовищное, как это:

[TestCase ("[email protected]", true)]
[TestCase ("[email protected]", true)]
[TestCase ("x#[email protected]", true)]
[TestCase ("[email protected]", true)]
[TestCase ("x%[email protected]", true)]
[TestCase ("x&[email protected]", true)]
[TestCase ("x'[email protected]", true)]
[TestCase ("x*[email protected]", true)]
[TestCase ("[email protected]", true)]
[TestCase ("[email protected]", true)]
[TestCase ("x/[email protected]", true)]
[TestCase ("[email protected]", true)]
[TestCase ("[email protected]", true)]
[TestCase ("x^[email protected]", true)]
[TestCase ("[email protected]", true)]
[TestCase ("x`[email protected]", true)]
[TestCase ("x{[email protected]", true)]
[TestCase ("x{[email protected]", true)]
[TestCase ("x|[email protected]", true)]
[TestCase ("x}[email protected]", true)]
[TestCase ("[email protected]", true)]
[TestCase ("test", false)]
[TestCase ("", false)]
[TestCase (null, false)]
public void IsEmail_Should_Match_Valid_Email_Addresses(string target, bool result)
{
    Assert.AreEqual(result, target.IsEmail());
}

Или вы можете сделать то же самое с кучей утверждений. Общепринято утверждать несколько свойств объекта после выполнения какого-либо действия. Я думаю, что вышеупомянутое решение более читаемо, хотя.

Ответ 4

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

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

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

Ответ 5

Структуры BDD и/или контекста/спецификации такие как SubSpec, который имеет некоторые важные примеры, управляют этим, обрабатывая каждую партию связанных утверждений как отдельный блок наблюдения, который дает имя или описательную метку.

Ключевыми элементами хорошего теста, который он подталкивает, являются:

  • у вас есть разделение ААА/ГВТ каждой из фаз - вы вынуждены действительно думать о том, что есть [и часто быстро понимают, когда что-то нужно разбить больше)
  • В итоге вы получаете хорошие имена/описания в Observations (Row Tests обычно оставляют вас с [менее поддерживаемыми] комментариями в лучшем случае)
  • При тестах 10 и 17 из 24 [как и в тестах Row] у вас есть статус каждого из тестов, чтобы помочь вам сузить решение.

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

Также xUnit.net PropertyData может быть мощным и уместным в некоторых случаях как способ выполнения некоторых трюков в других anwers.

Ответ 6

Я не думаю, что вы должны написать отдельный тест для каждого случая, поскольку все случаи связаны с тем же, что и проверка того, что строка является правильным адресом электронной почты. Если вы используете MbUnit или NUnit для запуска ваших тестов, вы можете использовать атрибут RowTest и Row для передачи в тесте разных значений. Другим способом является сохранение всех разных форматов электронной почты в массиве и цикл по массиву и выполнение команды assert.

Ответ 7

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

Некоторые люди утверждают, что каждый тест должен иметь только одно утверждение, потому что тест должен быть очень, очень и очень простым.

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

Если ваш тест содержит несколько утверждений, но все равно остается простым (нет циклов, нет ifs) и, несколько утверждений проверяют одно и то же, тогда я бы не был так агрессивен в том, утверждать за тест ". Выбор за вами.