Разница между теориями JUnit и параметризованными тестами - PullRequest
59 голосов
/ 20 апреля 2011

В чем разница между теорией и параметризованным тестом?

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

Ответы [ 5 ]

28 голосов
/ 04 мая 2011

Из того, что я понимаю: с помощью параметризованных тестов вы можете подавать серию статических входов в тестовый набор.

Теории похожи, но различны по своей концепции.Идея, стоящая за ними, заключается в создании тестовых случаев, которые проверяют предположения, а не статические значения.Поэтому, если мои предоставленные тестовые данные верны в соответствии с некоторыми допущениями, полученное в результате утверждение всегда детерминировано.Одна из движущих идей заключается в том, что вы сможете предоставить бесконечное количество тестовых данных, и ваш тестовый пример все равно будет верным;Кроме того, часто вам необходимо проверить множество возможностей в тестовых входных данных, например, отрицательные числа.Если вы тестируете это статически, то есть вводите несколько отрицательных чисел, это не гарантирует, что ваш компонент будет работать против всех отрицательных чисел, даже если это очень вероятно.

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

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

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

11 голосов
/ 29 апреля 2011

Parameterized.class тестирует "параметризовать" тесты с одной переменной, в то время как Theories.class "параметризует" со всеми комбинациями нескольких переменных.

Для примеров читайте:

http://blogs.oracle.com/jacobc/entry/parameterized_unit_tests_with_junit

http://blog.schauderhaft.de/2010/02/07/junit-theories/

http://blogs.oracle.com/jacobc/entry/junit_theories

Theories.class похож на Haskell QuickCheck:

http://en.wikibooks.org/wiki/Haskell/Testing

, но QuickCheckавтоматически генерирует комбинации параметров

0 голосов
/ 19 сентября 2017

В дополнение к приведенным выше ответам: на входе с 4 значениями и 2 методами тестирования

  • @ RunWith (Theories.class) - сгенерирует 2 теста JUnit

  • @ RunWith (Parameterized.class) - сгенерирует 8 (4 входа x 2 метода) JUnit тестов

0 голосов
/ 08 мая 2017

Немного опоздал с ответом. Но это было бы полезно для будущих тестеров.

Параметризованные тесты против теорий

  • Класс, помеченный как "@RunWith (Parameterized.class)" VS "@RunWith (Theories.class)"
  • Входные данные теста извлекаются из статического метода, возвращающего коллекцию, и помечаются @Parameters против статических полей, помеченных @DataPoints или @ DataPoint.
  • Входные данные передаются в конструктор (обязательно) и используются методом тестирования, а входные данные непосредственно передаются в метод теста.
  • Метод тестирования аннотирован @Test и не принимает аргументы против vs Метод тестирования аннотируется @Theory и может принимать аргументы
0 голосов
/ 21 апреля 2011

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

...