Я нашел правильное использование (или, по крайней мере, документацию) JUnit очень запутанным. Этот вопрос служит как будущей ссылкой, так и реальным вопросом.
Если я правильно понял, есть два основных подхода к созданию и запуску теста JUnit:
Подход A (стиль JUnit 3): создайте класс, расширяющий TestCase, и запустите методы тестирования со словом test
. При запуске класса в качестве теста JUnit (в Eclipse) все методы, начинающиеся со слова test
, запускаются автоматически.
import junit.framework.TestCase;
public class DummyTestA extends TestCase {
public void testSum() {
int a = 5;
int b = 10;
int result = a + b;
assertEquals(15, result);
}
}
Подход B (стиль JUnit 4): создайте «нормальный» класс и добавьте @Test
аннотацию к методу. Обратите внимание, что вам не нужно начинать метод со слова test
.
import org.junit.*;
import static org.junit.Assert.*;
public class DummyTestB {
@Test
public void Sum() {
int a = 5;
int b = 10;
int result = a + b;
assertEquals(15, result);
}
}
Смешивание этих двух не кажется хорошей идеей, см., Например, этот вопрос stackoverflow :
Теперь мои вопросы:
- Какой предпочтительный подход , или когда вы бы использовали один вместо другого?
- Подход B позволяет тестировать исключения, расширяя аннотацию @Test, как в
@Test(expected = ArithmeticException.class)
. Но как вы проверяете исключения при использовании подхода А? При использовании подхода A вы можете сгруппировать несколько классов тестов в набор тестов следующим образом:
TestSuite suite = new TestSuite("All tests");
suite.addTestSuite(DummyTestA.class);
suite.addTestSuite(DummyTestAbis.class);
Но это не может быть использовано с подходом B (поскольку каждый тестовый класс должен быть подклассом TestCase). Как правильно группировать тесты для подхода B?
Изменить: я добавил версии JUnit для обоих подходов
источник
extends TestCase
а затем каждый тест также помечен@Test
просто чтобы запутать вещи. :)Ответы:
Различие довольно простое:
TestCase
- это способ написания модульных тестов в JUnit 3 (конечно, он все еще поддерживается в JUnit 4)@Test
аннотации - это способ, введенный JUnit 4Как правило, вы должны выбирать путь аннотации, если только не требуется совместимость с JUnit 3 (и / или версией Java более ранней, чем Java 5). Новый способ имеет несколько преимуществ:
@Test
annotaton более четко и легче поддержки в инструментах (например, легко найти все тесты таким образом)@Before
/@BeforeClass
и@After
/,@AfterClass
обеспечивая большую гибкость@Rule
аннотаций на такие вещи, какExpectedException
@Ignored
аннотации@RunWith
Чтобы проверить ожидаемые исключения в JUnit 3,
TestCase
вам нужно сделать текст явным.JUnit 5 представил еще одно изменение API, но все еще использует аннотации. Новая
@Test
аннотацияorg.junit.jupiter.api.Test
(«старая» JUnit 4 былаorg.junit.Test
), но она работает почти так же, как JUnit 4.источник
assertTrue(e.getMessage().contains("foo"))
может быть полезен.expected
Метод проверяет только тип.У меня есть предпочтение JUnit 4 (аннотированный подход), потому что я считаю его более гибким.
Если вы хотите собрать набор тестов в JUnit 4, вы должны создать класс, объединяющий все тесты, подобные этому:
источник
В вашем вопросе есть неотвеченная часть, а именно: «Как правильно группировать тесты для подхода B»?
Официальный ответ заключается в том, что вы аннотируете класс с помощью @RunWith (Suite.class), а затем используете аннотацию @ Suite.SuiteClasses для вывода списка классов. Вот как это делают разработчики JUnit (перечисляя каждый класс в наборе вручную). Во многих отношениях этот подход является улучшением в том смысле, что его тривиально и интуитивно понятно добавить до поведения пакета и после пакета (просто добавьте методы @BeforeClass и @AfterClass в класс, аннотированный @RunWith - намного лучше, чем старая TestFixture). ).
Тем не менее, он имеет шаг назад, поскольку аннотации не позволяют динамически создавать список классов, и решение этой проблемы становится немного уродливым. Вы должны создать подкласс класса Suite и динамически создать массив классов в подклассе и передать его конструктору Suite, но это неполное решение в том смысле, что другие подклассы Suite (такие как Categories) не работают с ним и по существу не поддерживают динамический набор классов Test.
источник
Вы должны использовать JUnit 4. Это лучше.
Многие фреймворки начали осуждать поддержку JUnit 3.8.
Это из справочной документации Spring 3.0:
В общем, вы всегда должны пытаться использовать последнюю стабильную версию фреймворка при запуске чего-то нового.
источник
«Предпочтительным» подходом будет использование аннотаций, которые были введены начиная с Junit 4. Они облегчают многие вещи (см. Ваш второй вопрос)
Для этого вы можете использовать простой блок try / catch:
источник