[database] 데이터베이스 기반 애플리케이션을 단위 테스트하는 최선의 전략은 무엇입니까?



Answers

나는 항상 다음과 같은 이유로 인 메모리 DB (HSQLDB 또는 Derby)에 대한 테스트를 수행하고 있습니다.

  • 그것은 당신이 테스트 DB에 보관할 데이터와 그 이유를 생각하게합니다. 프로덕션 DB를 테스트 시스템으로 옮기는 것만으로도 "내가하고있는 일과 그 이유에 대해 전혀 알지 못합니다. 뭔가 이상이 생기면 그건 제가 아닌 것입니다 !!" ;)
  • 새로운 장소에서 약간의 노력으로 데이터베이스를 다시 만들 수 있습니다 (예 : 프로덕션에서 버그를 복제해야하는 경우)
  • DDL 파일의 품질에 엄청난 도움이됩니다.

테스트가 시작되고 대부분의 테스트가 끝나면 메모리 내 DB에 새로운 데이터가로드되고 ROLLBACK을 호출하여 안정성을 유지합니다. 항상 테스트 DB의 데이터를 안정적으로 유지하십시오! 데이터가 항상 변경되면 테스트 할 수 없습니다.

데이터는 SQL, 템플리트 DB 또는 덤프 / 백업에서로드됩니다. 내가 VCS에 넣을 수 있기 때문에 그들이 읽을 수있는 형식이면 덤프를 선호합니다. 그래도 작동하지 않으면 CSV 파일이나 XML을 사용합니다. 엄청난 양의 데이터를로드해야한다면 ... 그렇지 않습니다. 엄청난 양의 데이터를로드 할 필요가 없습니다. 단위 테스트가 아닙니다. 성능 테스트는 또 다른 문제이며 다른 규칙이 적용됩니다.

Question

나는 백엔드에서 다양한 복잡성의 데이터베이스에 의해 구동되는 많은 웹 애플리케이션을 사용한다. 일반적으로 비즈니스 및 프리젠 테이션 로직과는 별도로 ORM 레이어가 있습니다. 따라서 비즈니스 로직을 단위 테스트하는 것이 매우 간단합니다. 사물들은 개별 모듈로 구현 될 수 있으며 테스트에 필요한 모든 데이터는 객체 조롱을 통해 가짜가 될 수 있습니다.

그러나 ORM과 데이터베이스 자체를 테스트하는 것은 언제나 문제와 타협을 야기했습니다.

몇 년 동안 나는 몇 가지 전략을 시도했지만 그 중 어느 것도 나를 완전히 만족시키지 못했습니다.

  • 알려진 데이터로 테스트 데이터베이스를로드하십시오. ORM에 대한 테스트를 실행하고 올바른 데이터가 다시 제공되는지 확인하십시오. 단점은 테스트 DB가 응용 프로그램 데이터베이스의 스키마 변경 사항을 따라 잡아야하고 동기화되지 않을 수 있다는 점입니다. 또한 인공적인 데이터에 의존하기 때문에 바보 같은 사용자 입력으로 인해 발생하는 버그가 드러나지 않을 수도 있습니다. 마지막으로, 테스트 데이터베이스가 작 으면 인덱스 누락과 같은 비 효율성을 드러내지 않습니다. (좋아, 마지막 하나는 실제로 단위 테스트를 사용해야하는 것은 아니지만, 해를 끼치 지 않습니다.)

  • 프로덕션 데이터베이스의 복사본을로드하고 테스트합니다. 여기서 문제는 주어진 시간에 프로덕션 DB에 무엇이 있는지 전혀 모를 수 있다는 것입니다. 시간이 지남에 따라 데이터가 변경되면 테스트를 다시 작성해야 할 수도 있습니다.

어떤 사람들은이 두 전략 모두 특정 데이터에 의존하고 단위 테스트는 기능 만 테스트해야한다고 지적했습니다. 이를 위해 다음과 같은 제안을 보았습니다.

  • 모의 데이터베이스 서버를 사용하고 주어진 메소드 호출에 대한 응답으로 ORM이 올바른 쿼리를 보내고 있는지 확인하십시오.

데이터베이스 기반 응용 프로그램을 테스트 할 때 어떤 전략을 사용 했습니까? 무엇이 최선을 다 했나요?




데이터베이스를 모방 할 수있게 해주는 툴 (예를 들어, 이 답변 에서 볼 수있는 MockConnectionMockConnection , jOOQ의 벤더에서 일하는 면책 조항) 이 있더라도, 나는 더 큰 데이터베이스를 조롱 하지 말 것을 권한다. 복잡한 검색어

ORM을 통합 테스트하려는 경우에도 ORM이 데이터베이스에 매우 복잡한 일련의 쿼리를 발행한다는 점에 유의하십시오.

  • 통사론
  • 복잡성
  • 주문 (!)

합리적인 더미 데이터를 생성하기 위해 모든 것을 조롱하는 것은 아주 어렵습니다. 전송 된 SQL 문을 해석하는 모의 데이터베이스에 실제로 데이터베이스를 구축하지 않는 한. 이렇게 말하면 잘 알려진 데이터로 쉽게 재설정 할 수있는 잘 알려진 통합 테스트 데이터베이스를 사용하십시오.이 데이터베이스에 대해 통합 테스트를 실행할 수 있습니다.




JDBC 기반 프로젝트 (직접 또는 간접적으로, 예를 들어 JPA, EJB 등)의 경우 전체 데이터베이스가 아닌 실제 데이터베이스를 모형으로 만들 수 있습니다 (이 경우 실제 JDBC 데이터베이스에서 테스트 데이터베이스를 사용하는 것이 낫습니다). 그러나 JDBC 수준의 모형 만 .

Advantage는 JDBC 데이터 (결과 집합, 업데이트 개수, 경고 등)가 백엔드와 동일하므로 추상화됩니다. prod db, 테스트 db 또는 각 테스트에 제공된 일부 모형 데이터 케이스.

각 경우에 대해 JDBC 연결을 조롱하면 테스트 DB (클린업, 한 번에 하나의 테스트 만, 설비를 다시로드 ...)를 관리 할 필요가 없습니다. 모든 모형 연결은 격리되어있어 정리할 필요가 없습니다. JDBC 교환을 모방하기 위해 각 테스트 케이스에 최소한의 필수 설비 만 제공되므로 전체 테스트 DB를 관리하는 복잡성을 피할 수 있습니다.

Acolyte 프레임 워크에는 mockup과 같은 JDBC 드라이버와 유틸리티가 포함되어 있습니다. http://acolyte.eu.org .




Links