Предостережение: я не пытался это сделать. Это одно из моих нереализованных улучшений в моем текущем наборе тестов.
Параллельные тесты с использованием JPA неизбежно завершатся неудачей, если выполняется одно или несколько из следующих условий:
- параллельно выполняющиеся тесты используют один и тот же набор данных.
- тесты, которые читают данные, могут выполняться одновременно с тестами, которые создают, обновляют или удаляют данные.
Если вам нужно запустить параллельные тесты, вы можете сгруппировать все тесты, которые читают данные, в отдельный набор, но это все равно потребует сериализации тестов, которые изменяют состояние базы данных. Вы можете, если позволяют ваши тесты, использовать отдельные наборы данных для каждого теста, который выполняется параллельно; обратите внимание, что это относится не ко всем приложениям и не ко всем тестам.
Наборы специфичных для теста наборов данных могут быть загружены из набора файлов (скажем, с использованием DbUnit) или из набора данных в памяти (подготовленного с использованием настраиваемой фабрики значений теста), причем каждый параллельный тест опирается на отдельный элемент в набор. Совершенно очевидно, что любые общие данные не должны быть изменены во всех тестах , в противном случае вы получите откат транзакций (если имеется оптимистическая блокировка), иначе ваши тесты просто не пройдут.
Кроме того, данные, которые могут быть изменены во время тестов, не должны совместно использоваться тестами. Это легко достижимо, если вы используете разные значения для каждого теста. Вам нужно убедиться, что ваши тесты будут утверждать эти значения или эквивалентное инвариантное свойство, специфичное для теста. Прикрепление данных может быть выполнено с использованием идентификаторов потоков.
Чтобы привести пример вышесказанного, если вы запускаете тесты, которые сохранят сущность A (с атрибутами A1 и A2) в базе данных, тогда тест T1 должен сохранить экземпляр A со значениями A1 = x1 и A2 = y1 и параллельный тест T2, должен сохраняться другой объект A со значениями A1 = x2 и A2 = y2. Это предполагает, что другие тесты, которые выполняются параллельно, изменят значение как A1, так и A2. Если ваши тесты имеют свойство не мутировать А1, то все такие значения А1 могут быть постоянными по всем тестам.