2010-06-11 1 views
2

У меня проблема с некоторыми тестами JUnit 4, которые я запускаю с набором тестов.Проблемы с набором тестов JUnit 4

Если я запускаю тесты индивидуально, они работают без проблем, но при запуске в большинстве из них 90% методов тестирования терпят неудачу с ошибками. Что я заметил, так это то, что всегда первые тесты работают нормально, но остальные не работают. Другое дело, что некоторые из тестов методы не выполняются в правильном порядке (отражение не работает так, как ожидалось, или это происходит потому, что поиск методов не обязательно в созданном порядке). Обычно это происходит, если существует более одного теста с методами, имеющими одно и то же имя. Я попытался отладить некоторые тесты, и кажется, что от строки к следующей значение некоторых атрибутов становится null.

Кто-нибудь знает, в чем проблема, или если поведение является «нормальным»?

Заранее спасибо.

P.S .: OK, тесты не зависят друг от друга, ни один из них не делают, и все они имеют @BeforeClass, @Before, @After, @AfterClass так между тестов все прояснилось. Тесты работают с базой данных, но база данных очищается перед каждым тестом в @BeforeClass, поэтому это не должно быть проблемой.

Simplefied пример:

TEST SUITE:

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"); } 
} 

ИСПЫТАНИЯ: Испытания тестируют functionalily на серверное приложение работает на 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(..)); 

    } 

Это основной пример, фактические испытания являются более сложными, но я пытался с упрощенными испытаниями и до сих пор это делает не работа. Спасибо.

+1

Можете ли вы опубликовать пример одного из ваших тестов и объяснить, как вы используете тестовый пакет, пожалуйста. –

+0

Набор тестов - это набор тестов JUnit 4, он имеет все настройки тестовых классов и имеет @BeforeClass и @AfterClass, которые только SOP содержат некоторую второстепенную информацию (основные строки). – Hypnus

+0

Выведенный вами код выходит из наиболее важных деталей: 1) AbstractTestClass, 2) @BeforeClass, @Before, @After, @AfterClass methods, 3) как и когда инициализируются keyEntity и объект, 4) какой тест терпит неудачу и точно как ? –

ответ

1

Кажется, что вы построили свой тестовый пакет, исходя из предположения, что порядок выполнения методов исправлен. Это неверно. JUnit не гарантирует порядок выполнения тестовых методов, поэтому вы не должны рассчитывать на это.

Это по конструкции - модульные испытания должны быть полностью независимыми друг от друга. Чтобы гарантировать это, JUnit создает отдельный, новый экземпляр вашего тестового класса для выполнения каждого тестового метода. Поэтому любые атрибуты, которые вы задали в одном методе, будут потеряны в следующем.

Если у вас есть общий код установки/разрыва кода, вы должны поместить его в отдельные методы, аннотированные с помощью @Before/@After. Они выполняются до и после каждого метода тестирования.

Update: Вы писали

база данных очищается перед каждым испытанием в @BeforeClass

если это не опечатка, это может быть источником ваших проблем. БД следует очистить в методе @Before - @BeforeClass запускается только один раз для каждого класса.

+0

ОК, тесты не зависят друг от друга, но их методы делают это, я не могу поместить код очистки базы данных в метод @Before, потому что тогда он очистит базу данных перед каждым методом и не будет работать. Если вы считаете, что я поместил код очистки базы данных в @BeforeClass пакета, это не так. Спасибо. – Hypnus

+0

@ Hypnus, что вы называете «тест» выше, является тестовым классом, правильно? По-видимому, здесь существует несовпадение терминологии. Класс тестирования может содержать множество методов тестирования. Каждый метод представляет собой отдельный _test_, в модульном тестировании. И эти тесты, т. Е. ** методы испытаний **, не должны зависеть друг от друга. –

3

Описываемая вами ситуация звучит как побочная проблема. Вы отмечаете, что тесты работают нормально, но зависят от порядка операций: это обычно критический симптом.

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

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

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

0

Будьте осторожны с тем, как вы используете @BeforeClass, чтобы настроить вещи раз и навсегда, и @Before, чтобы настроить вещи перед каждым отдельным тестом. И будьте осторожны с переменными экземпляра.

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

+0

Спасибо, я буду, но через 2 часа у меня есть срочная работа. – Hypnus

+0

Я добавил упрощенный пример для моего случая. Я попытался запустить тесты непосредственно с JUnit на пакете и по-прежнему не работает (некоторые методы не работают в разных местах). Спасибо. – Hypnus

Смежные вопросы