Блокировка базы данных SQLite в тестах JUnit - PullRequest
1 голос
/ 10 марта 2012

Я использую JUnit 4.10 на Eclipse 3.7.Я делаю тестирование базы данных: используется база данных SQLite3 с sqlitejdbc .Я попытался запустить тесты на Windows и Linux, и вот мои наблюдения:

  • В Windows 7 x64 тесты выполняются быстрее (~ 0,6 с на тест).Я получаю ошибки об «Не могу открыть файл базы данных».Они кажутся прерывистыми (иногда один и тот же тест может пройти один раз, а следующий запуск не пройден)
  • В Ubuntu 11.10 x64 тесты выполняются медленно (~ 3 с на тест).Я получаю ошибки о "базе данных заблокирована".В отличие от ошибок Windows, которые возникают с перерывами, здесь, похоже, ошибки происходят в одном и том же тесте / файле, и как только возникает ошибка блокировки, все последующие тесты не выполняются.

ОБНОВЛЕНИЕ

Код для тестов можно найти на GitHub .Я думаю, что проблема может быть связана с настройкой моих @BeforeClass, @Before и наборов тестов

У меня есть набор тестов, подобный

@RunWith(Suite.class)
@SuiteClasses({ DataAccessTests.class, SimpleQueryTests.class, ... })
public class DataAccessTestSuite {
    @BeforeClass
    public static void setUpDatabase() throws SQLException, ClassNotFoundException {    
        DataAccess.setEnvironment(DataAccess.DATABASE_TESTING);
        Connection conn = DataAccess.getConn();

        // truncate tables: simply DELETE statements
        truncateTables(conn);

        // insert test data, INSERT statements
        insertTestData(conn);
    }

Затем в моих классах тестированияУ меня был @Before, который также вызывает установку.

public class EventsDataAccessTests {

    @Before
public void setup() throws SQLException, ClassNotFoundException {
    DataAccessTestSuite.setUpDatabase();
}

Я думал, что все еще хочу настроить свою базу данных на случай, если я не хочу вызывать весь пакет.Я думаю, что проблема связана с этим, но я не уверен, как именно это вызывает проблему.Похоже, что даже если я вызову отдельный тестовый класс, мои настройки для пакета будут выполнены?Или, если нет, как я могу убедиться, что он запускается один раз, если тест не вызывается из пакета?

- Старый пост удален -

1 Ответ

2 голосов
/ 05 апреля 2012

Необходимо убедиться, что не более одного потока одновременно пытается установить блокировку записи в базе данных sqlite. Чтобы понять, что я имею в виду, прочитайте

(5) Могут ли несколько приложений или несколько экземпляров одного приложения одновременно обращаться к одному файлу базы данных?

Итак, когда вы говорите:

Если я запускаю тест самостоятельно, он проходит. При попытке запустить весь набор это не удается

Я думаю, будет справедливо предположить, что блокировка записи не снимается, возможно, объектом соединения, пока другой пытается его получить. Таким образом, даже если вы не используете потоки, возможно, GC не доберется до объекта подключения предыдущего теста до того, как другой тест создаст другой объект подключения.

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

UPDATE:

Разве вы не должны здесь закрывать соединение?:

public static void tearDownDatabase() throws SQLException, ClassNotFoundException {
    Connection conn = DataAccess.getConn();
    truncateTables(conn);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...