У меня проблема с некоторыми тестами JUnit 4, которые я запускаю с набором тестов.
Если я запускаю тесты по отдельности, они работают без проблем, но при запуске в наборе большинство из них, 90% методов тестирования, терпят неудачу с ошибками. Я заметил, что всегда первые тесты работают нормально, а остальные терпят неудачу. Другое дело, что в некоторых тестах методы не выполняются в правильном порядке (отражение не работает должным образом или работает потому, что извлечение методов не обязательно происходит в созданном порядке). Обычно это происходит, если имеется более одного теста с методами с одинаковыми именами. Я попытался отладить некоторые тесты, и кажется, что от строки к следующей значение некоторых атрибутов становится null
.
Кто-нибудь знает, в чем проблема, или если поведение "нормально"?
Заранее спасибо.
P.S.: Хорошо, тесты не зависят друг от друга, ни один из них не зависит, и все они имеют @BeforeClass
, @Before
, @After
, @AfterClass
, так что между тестами все прояснилось. Тесты работают с базой данных, но база данных очищается перед каждым тестом в @BeforeClass
, так что это не должно быть проблемой.
Упрощенный пример:
ТЕСТИРОВАНИЕ:
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
importy testclasses...;
@RunWith(Suite.class)
@Suite.SuiteClasses({ Test1.class, Test2.class })
public class TestSuiteX {
@BeforeClass
public static void setupSuite() { System.out.println("Tests started"); }
@AfterClass
public static void setupSuite() { System.out.println("Tests started"); }
}
ТЕСТЫ: тесты проверяют функциональность серверного приложения, работающего на Glassfish.
Теперь тесты расширяют базовый класс, который имеет метод @BeforeClass, который очищает базу данных и логины, и метод @AfterClass, который производит только выход из системы. Это не источник проблем, потому что то же самое произошло до введения этого класса.
Класс имеет некоторые общедоступные статические атрибуты, которые не используются в других тестах, и реализует 2 метода управления.
Остальные классы, для этого примера, расширяют базовый класс и не переопределяют унаследованные методы управления.
Пример тестовых классов:
imports....
public class Test1 extends AbstractTestClass {
protected static Log log = LogFactory.getLog( Test1.class.getName() );
@Test
public void test1_A() throws CustomException1, CustomException2 {
System.out.println("text");
creates some entities with the server api.
deletes a couple of entities with the server api.
//tests if the extities exists in the database
Assert.assertNull( serverapi.isEntity(..) );
}
}
и второй:
public class Test1 extends AbstractTestClass {
protected static Log log = LogFactory.getLog( Test1.class.getName() );
private static String keyEntity;
private static EntityDO entity;
@Test
public void test1_B() throws CustomException1, CustomException2 {
System.out.println("text");
creates some entities with the server api, adds one entities key to the static attribute and one entity DO to the static attribute for the use in the next method.
deletes a couple of entities with the server api.
//tests if the extities exists in the database
Assert.assertNull( serverapi.isEntity(..) );
}
@Test
public void test2_B() throws CustomException1, CustomException2 {
System.out.println("text");
deletes the 2 entities, the one retrieved by the key and the one associated with the static DO attribute
//tests if the deelted entities exists in the database
Assert.assertNull( serverapi.isEntity(..) );
}
Это базовый пример, настоящие тесты более сложны, но я пробовал использовать упрощенные тесты, но они все равно не работают. Спасибо.