IT박스

JUnit 테스트 케이스에 대해 MySQL 메모리 내에서 실행하는 방법이 있습니까?

itboxs 2020. 12. 13. 09:07
반응형

JUnit 테스트 케이스에 대해 MySQL 메모리 내에서 실행하는 방법이 있습니까?


MySQL DB에 액세스하는 서비스에 대한 테스트 사례를 추가하려고 시도하고 있으며 전체 스키마를 다시 만들고 싶습니다 (일부 시나리오에서는 각 테스트 사례에 필요한 데이터가 포함 된 MySQL 덤프 파일도 사용). 나는 주위를 둘러보고 SQLite / H2를 사용하는 일부 사람들을 발견했고 다른 사람들은 이것을 수행했지만 MySQL 메모리 내에서 실행할 방법이 있다면 방황하고 있으므로 MySQL과 관련된 것에 대해 걱정할 필요가 없습니다. 우리 서비스에서 사용할 수있는 방언.


MySQL과 완벽하게 호환되고 JUnit 테스트 케이스 내에서 사용할 수있는 메모리 내 데이터베이스를 사용하는 가장 쉬운 방법은 imho MariaDB4j입니다. Gradle (/ Maven) 종속성 ( http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22mariaDB4j%22 )과 몇 줄의 코드 만 있으면됩니다.

DB database = DB.newEmbeddedDB(3306);
database.start();
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "");

시작 스크립트는 다음을 통해 포함될 수 있습니다.

database.source("path/to/resource.sql");

GitHub readme에 대한 추가 정보 : https://github.com/vorburger/MariaDB4j

편집 :이 답변에 몇 가지 힌트를 추가했습니다 .MariaDB4j는 시스템 임시 폴더에 파일을 추가하는 것 같습니다. 따라서 임베디드 방식으로 작동하므로 아무것도 설치할 필요가 없으며 원하는 빌드 도구를 통해 종속성을 사용할 수 있습니다. 그러나 이것은 진정한 메모리 전용 솔루션이 아니므로 단위 테스트가 파일이나 데이터베이스에 의존해서는 안되기 때문에 더 이상 단위 테스트에 대해 말할 수 없습니다.


MySQL과 flyway를 사용하여 마이그레이션을 처리합니다.

단위 테스트 및 간단한 통합 테스트를 위해 MODE = MySQL 매개 변수와 함께 메모리 데이터베이스에서 H2를 사용합니다. Mode = MySQL을 사용하면 H2 db가 대부분의 MySQL 언어를 처리 할 수 ​​있습니다.

Spring 구성의 테스트 데이터 소스는 다음과 같이 설정됩니다.

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" >
      <property name="driverClassName" value="org.h2.Driver"/>
      <property name="url" value="jdbc:h2:mem:testdb;MODE=MySQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE" />
    </bean>

(Spring을 모른다면-XML은 새로운 BasicDataSource를 호출하는 것으로 변환 된 다음 생성 된 인스턴스에서 setDriverClassName 및 setUrl을 호출합니다)

그런 다음 데이터 소스에서 플라이 웨이를 사용하여 스키마를 만들고 일반 MySQL db에 대해 읽는 것처럼 읽습니다.

    <bean id="flyway" class="com.googlecode.flyway.core.Flyway" init-method="migrate">
       <property name="dataSource" ref="dataSource" />
       <property name="cleanOnValidationError" value="false" />
       <property name="initOnMigrate" value="true" />
       <property name="sqlMigrationSuffix" value=".ddl" />
    </bean>

jdbcTemplate에서 dataSource bean을 사용하고 그런 식으로 일부 SQL 스크립트를 실행하거나 <jdbc:initialize-database...>태그를 사용하여 여러 MySQL 스크립트를 실행할 수도 있습니다 .


이것이 독점 SQL 확장을 사용하는 것이 일반적으로 좋은 생각이 아닌 이유 중 하나입니다.

내가 할 일은 비표준 SQL을 사용하는 곳을 식별하고 코드를 리팩터링하여 이러한 부분을 전용 서비스로 이동하는 것입니다. 그런 다음 단위 테스트를 실행할 때이를 모의 할 수 있습니다.


JUnit 테스트에 다른 스키마를 사용할 수 있습니다. Spring을 사용하는 경우 JUnit 확장을 사용하면 각 테스트가 읽기 전용 트랜잭션으로 실행될 수 있으므로 테스트 후 데이터베이스에서 데이터가 지속되지 않습니다. 테스트를위한 초기 데이터가 필요한 @Before경우 트랜잭션에 참여 하는 표시된 메서드 에 필요한 데이터를 넣습니다 .


일반적으로 작은 my.cnf 단위 테스트 데이터베이스의 적절한 구성을 변경 한 후 (ImDisk를 사용하여) ramdrive를 마운트하고 데이터 파일을 복사하고 Mysql 서비스를 시작할 수 있습니다 (빠른 테스트를 위해 작게 유지해야 함). 일반적으로 ramdrive에 맞습니다.

각 테스트에서 테이블을 다시 작성하는 대신 스프링 테스트에서 트랜잭션을 사용하는 것을 고려할 수도 있습니다.

우리는 개발팀을 위해 그것을 사용했고 그것은 매력처럼 작동했고, 우리는 속도면에서 수십 배를 얻었습니다.


http://hsqldb.org/ 시도해보십시오 . 경험이 없지만 좋은 소식을 들었습니다.

편집 죄송합니다 -MySQL 특정 구문을 제거해야 같습니다 ...

참고 URL : https://stackoverflow.com/questions/6734410/is-there-a-way-to-run-mysql-in-memory-for-junit-test-cases

반응형