почему тестирование отдельных тестов junit работает, а совместное тестирование - нет? - PullRequest
2 голосов
/ 19 сентября 2010

Тест, который не пройден при тестировании вместе с mvn test (или через ide), называется EmpiricalTest.

Если я проверяю файл один, он проходит, но не иначе.Почему это может быть?

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

Вот так я должен убедиться, что база данных пустакаждый тест:

abstract public class PersistenceTest {

@Before
public void setUp() {
    db.destroy();
    assertIsEmpty(MUser.class);
    assertIsEmpty(Meaning.class);
    assertIsEmpty(Expression.class);
}

private <Entity> void assertIsEmpty(final Class<Entity> entityClass){
    final List<Entity> all = db.getAll(entityClass);
    Assert.assertTrue(all.isEmpty());
}

и неудачный тест:

public class EmpiricalTest extends PersistenceTest {

Ответы [ 3 ]

1 голос
/ 19 сентября 2010

Это связано с автоматически назначенным идентификатором.PU создает таблицу SEQUENCE, и хотя я очищаю базу данных от своих сущностей, я фактически не удаляю эту таблицу.Поэтому, когда я тестирую только EmpiricalTest, последовательность начинается, как и ожидалось, с 1, тогда как при совместном тестировании тест выполняется позже и начинается с более высокого неожиданного числа.

Это приводит к this вопрос.

0 голосов
/ 20 сентября 2010

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

Однако простого решения проблемы изоляции теста не существует.Основная причина в том, что SQL DLL не поддерживает создание / удаление базы данных, в то время как автоматическое удаление таблиц затруднено из-за возможных сложных ограничений внешних ключей.

По моему опыту, лучшая идея - выполнить тесты внутри транзакции иОткат данных в конце теста (как и предложил Паскаль). Spring test module предоставляет отличную поддержку для этого.

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

Вы должны отладить свой тестовый сеанс Maven , чтобы проверить, что не так с утверждением (я полагаю, что вы не можете сказать это из журналов Surefire).Затем зафиксируйте тесты (как провальные, так и другие, которые оставляют мусор в БД), чтобы они были изолированы друг от друга.

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

Это звучит так, как будто между тестом есть зависимости. Насколько я понимаю, глядя на ваш тест, вы получаете доступ к своему хранилищу данных в тесте. Есть ли вероятность, что один из тестов не очистит его следы должным образом, что приведет к сбою других ??

Тестирование на БД обычно не считается модульным тестом, хотя оно очень полезно. Подобные тесты (вы можете называть их интеграционными тестами), однако, сложнее и требуют больше времени для написания кода, потому что вы должны уделять много внимания тому, что ваш тест оставляет среду в том же состоянии, в каком он ее нашел раньше.

...