Распараллеливание модульных и интеграционных тестов в приложении Springboot - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь распараллелить тесты в моем приложении весенней загрузки. Для этого я внес изменения в плагин maven surefire, включив параллельный аргумент с классами в качестве значения и аргумент подсчета потоков с 5 в качестве значения. Но когда я запускаю maven clean install, mvn clean install я получаю PessimisticLockingFailure или Pessimisti c Exception.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <parallel>classes</parallel>
        <threadCount>5</threadCount>
    </configuration>
</plugin>

Для моих тестовых случаев я настроил базу данных H2 в файле свойств приложения, который находится в папке test. , После прочтения в Google я узнал, что мне нужно включить MVCC=TRUE;DEFAULT_LOCK_TIMEOUT=10000 в URL базы данных. Итак, поэтому файл свойств приложения имеет конфигурацию ниже:

spring:
    datasource:
        type: com.zaxxer.hikari.HikariDataSource
        url: jdbc:h2:TestDB;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MVCC=TRUE;DEFAULT_LOCK_TIMEOUT=10000
    jpa:
        database-platform: io.github.jhipster.domain.util.FixedH2Dialect
        database: H2
        open-in-view: false
        show-sql: true
        hibernate:
            ddl-auto: none
            naming:
                physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
                implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
        properties:
            hibernate.id.new_generator_mappings: true
            hibernate.connection.provider_disables_autocommit: true
            hibernate.cache.use_second_level_cache: false
            hibernate.cache.use_query_cache: false
            hibernate.generate_statistics: false
            hibernate.hbm2ddl.auto: validate
            hibernate.jdbc.time_zone: UTC

Теперь я понимаю, что эта блокировка Pessimisti c выполняется, потому что она должна быть для того, чтобы следовать свойствам ACID. Также я понял, что в случае параллелизма H2 использует блокировку pessimisti c вместо блокировки optimisti c, что имеет смысл, поскольку мы не хотим использовать поврежденные данные. Но тогда как мне распараллелить мои тесты. Я также вижу, что при выполнении этих тестов maven использует разные потоки, так как имя потока печатается, но затем я получаю это Pessimisti c Exception.

Caused by: org.hibernate.PessimisticLockException: could not execute statement
    at com.x.y.z.repository.a.ProductionDataRepositoryTest.setUp(ProductionDataRepositoryTest.java:45)
Caused by: org.h2.jdbc.JdbcSQLException: 
Timeout trying to lock table ; SQL statement:
insert into my_table

Одна мысль, которая пришла мне в голову, заключается в том, что, возможно, , мы должны запускать отдельные экземпляры h2 для каждого потока, чтобы при наличии 4 потоков было 4 экземпляра h2, но тогда это не было бы дорого, а если нет, то как это сделать? Или есть какой-то другой подход в достижении распараллеливания тестов при весенней загрузке, java и maven.

Пожалуйста, предложите.

...