2010-05-03 2 views
6

Я понимаю, что есть @Before и @BeforeClass, которые используются для определения светильников для @Test. Но что я должен использовать, если мне нужны разные светильники для каждого @Test?JUnit Best Practice: Различные светильники для каждого @Test

  • Должен ли я определить прибор в @Test?
  • Должен ли я создать класс испытаний для каждого @Test?

Я прошу о лучших практиках здесь, так как оба решения не чисты, на мой взгляд. С первым решением я проверил бы код инициализации. И со вторым решением я бы разбил шаблон «один тестовый класс для каждого класса».

ответ

14

Советы:

  1. Forget класс один тест в классе модели, она имеет мало достоинств. Переключение на один класс тестирования с точки зрения использования. В одной перспективе у вас может быть несколько случаев: верхняя граница, нижняя граница и т. Д. Создайте разные @Tests для тех, кто находится в одном классе.
  2. Помните, что JUnit создаст экземпляр тестового класса для каждого теста @Test, поэтому каждый тест получит отдельное приспособление (настроенное теми же методами @Before). Если вам нужен разный прибор, вам нужен другой тестовый класс, потому что вы находитесь в другой перспективе (см. 1.)
  3. Нет ничего плохого в настройке прибора для конкретного теста, но вы должны стараться, чтобы тест был чистым поэтому он рассказывает историю. Эта история должна быть особенно ясна, когда тест терпит неудачу, а следовательно, и другой, хорошо названный @Test для каждого случая (см. 1.)
+0

Испытание «чистый, так что он рассказывает историю, которая само по себе», как правило, приведет к повторному использованию вспомогательных функций в тестах. Поэтому, надеюсь, когда вам нужно реорганизовать код, и он разбивает 200 тестов, вы нужно только изменить 1 функцию. Нет 200 тестов. – borjab

0

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

0

Если вы уверены, что ваше приспособление уникально для одного теста, оно относится к методу @Test. Однако это не типично. Может быть, какая-то его часть уникальна, или вы не параметризировали/не извлекли ее правильно, но обычно вы будете делиться множеством одинаковых данных между тестами.

В конечном счете прибор является частью теста. Размещение арматуры в @Before было принято как XUnit шаблон, потому что тесты всегда:

  1. подготовить тестовые данные/издевается
  2. выполнять операции с SUT
  3. Validate/утверждать состояние/поведение
  4. уничтожить данные испытаний/издевается

и шаги 1 (@Before) и 4 (@After) многократно используются (по крайней мере частично) в связанных тестах. Поскольку xUnit очень серьезно относится к независимости теста, он предлагает методы крепления, чтобы гарантировать, что они всегда запускаются и тестируются данные, созданные/уничтоженные должным образом.