Интеграционные тесты базы данных

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

10
задан Garry Shutler 18 September 2008 в 16:51
поделиться

6 ответов

Транзакции.

То, что делает рубин на платформе модульного теста направляющих, является этим:

Load all fixture data.

For each test:

  BEGIN TRANSACTION

    # Yield control to user code

  ROLLBACK TRANSACTION

End for each

Это означает это

  1. Любые изменения, которые Ваш тест вносит в базу данных, не будут влиять на другие потоки, в то время как это происходит
  2. Данные следующего теста не загрязнены предшествующими тестами
  3. Это приблизительно в огромное количество раз быстрее, чем ручная перезагрузка данных для каждого теста.

Я для каждый думает, что это довольно прохладно

10
ответ дан 3 December 2019 в 19:36
поделиться

Для простых приложений базы данных я нахожу использование SQLite неоценимый. Это позволяет Вам иметь уникальную и автономную базу данных для каждого теста.

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

9
ответ дан 3 December 2019 в 19:36
поделиться

Только для добавления к ответу Свободной Антилоп гну я также использовал HSQLDB, чтобы сделать подобное сертификационное испытание, где каждый тест получает чистый экземпляр DB.

1
ответ дан 3 December 2019 в 19:36
поделиться

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

0
ответ дан 3 December 2019 в 19:36
поделиться

Я хотел принять и ответы Свободной Антилоп гну и Orion Edwards, но это не позволит мне. Причина, которую я хотел сделать, это - то, что я пришел к выводу, что они были двумя основными способами сделать это, но какой к выбрал, зависит от отдельного случая (главным образом размер базы данных).

0
ответ дан 3 December 2019 в 19:36
поделиться

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

При выполнении набора тестов Вы загружаете данные в запуске, выполняете набор тестов, разгружаетесь/сравниваете результаты, удостоверяясь, что фактический результат встречает ожидаемый результат. В противном случае сделайте цикл снова. Загрузка, выполненный комплект, разгружается/сравнивает.

0
ответ дан 3 December 2019 в 19:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: