단위 테스트에 '실제'데이터베이스를 사용하는 데 따른 문제는 테스트 설정, 중단 및 격리입니다. 완전히 새로운 MySQL 데이터베이스를 가동시키고 단 한 번의 단위 테스트를 위해 테이블과 데이터를 생성 할 필요는 없습니다. 이 문제는 데이터베이스의 외부 특성과 관련이 있으며 테스트 데이터베이스가 다운되어 단위 테스트가 실패합니다. 테스트 할 고유 한 데이터베이스가 있는지 확인하는 데 문제가 있습니다. 그들은 극복 할 수 있지만 더 간단한 대답이 있습니다.
데이터베이스를 조롱하는 것은 하나의 옵션 이지만 실행되는 실제 쿼리는 테스트하지 않습니다. DAO의 데이터가 시스템을 올바르게 통과하는지 확인하려는 경우 훨씬 간단한 솔루션으로 사용할 수 있습니다. 그러나 DAO 자체를 테스트하려면 DAO 뒤에 데이터가 있고 쿼리가 올바르게 실행됩니다.
가장 먼저 할 일은 in-memory 데이터베이스를 사용하는 것입니다. HyperSQL 은 다른 데이터베이스의 방언을 에뮬레이트 할 수 있으므로 데이터베이스 간의 사소한 차이 (데이터 유형, 함수 등)가 동일하게 유지되므로 탁월한 선택입니다. hsqldb에는 단위 테스트를위한 멋진 기능도 있습니다.
db.url=jdbc:hsqldb:file:src/test/resources/testData;shutdown=true;
testData
파일 에서 데이터베이스 상태 (테이블, 초기 데이터)를로드 합니다. shutdown=true
마지막 연결이 닫히면 데이터베이스가 자동으로 종료됩니다.
의존성 주입을 사용 하여 단위 테스트 가 프로덕션 (또는 테스트 또는 로컬) 빌드에서 사용 하는 것과 다른 데이터베이스를 선택 하도록합니다.
그런 다음 DAO는 데이터베이스에 대해 테스트를 시작할 수있는 주입 된 데이터베이스를 사용합니다.
그러면 단위 테스트는 다음과 같이 보일 것입니다 (간단하게 포함되지 않은 지루한 것들).
@Before
public void setUpDB() {
DBConnection connection = new DBConnection();
try {
conn = connection.getDBConnection();
insert = conn.prepareStatement("INSERT INTO data (txt, ts, active) VALUES (?, ?, ?)");
} catch (SQLException e) {
e.printStackTrace();
fail("Error instantiating database table: " + e.getMessage());
}
}
@After
public void tearDown() {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
private void addData(String txt, Timestamp ts, boolean active) throws Exception {
insert.setString(1, txt);
insert.setTimestamp(2, ts);
insert.setBoolean(3, active);
insert.execute();
}
@Test
public void testGetData() throws Exception {
// load data
Calendar time = Calendar.getInstance();
long now = time.getTimeInMillis();
long then1h = now - (60 * 60 * 1000); // one hour ago
long then2m = now - (60 * 1000 * 2); // two minutes ago
addData("active_foo", new Timestamp(then1h), true); // active but old
addData("inactive_bar", new Timestamp(then1h), false); // inactive and old
addData("active_quz", new Timestamp(then2m), true); // active and new
addData("inactive_baz", new Timestamp(then2m), false); // inactive and new
DataAccess dao = new DataAccess();
int count = 0;
for (Data data : dao.getData()) {
count++;
assertTrue(data.getTxt().startsWith("active"));
}
assertEquals("got back " + count + " rows instead of 1", count, 1);
}
따라서 DAO를 호출하고 테스트 기간 동안 존재하는 즉석 데이터베이스에 설정된 데이터를 사용하는 단위 테스트가 있습니다. 실행하기 전에 외부 리소스 나 데이터베이스 상태에 대해 걱정하거나 알려진 상태로 복원 할 필요가 없습니다 ( '알려진 상태'는 '존재하지 않음'이므로 되돌릴 수 없습니다).
DBUnit 은 데이터베이스 설정, 테이블 작성 및 데이터로드에서 더 간단한 프로세스를 설명 할 수 있습니다. 어떤 이유로 실제 데이터베이스를 사용해야 할 경우에는 훨씬 더 유용한 도구입니다.
위 코드는 github의 TestingWithHsqldb 개념 증명을 위해 작성한 maven 프로젝트의 일부입니다.