2011-09-21 3 views
2

다음은 scanario입니다 :정적 테스트 데이터베이스가 없어도 DAO 클래스의 단위 테스트를 덜 취약하게 만드는 방법은 무엇입니까?

최대 절전 모드 기준 API를 사용하여 데이터베이스에서 특정 작업을 수행하는 복잡한 쿼리를 여러 개 작성하는 DAO 개체를 작업 중입니다 (예 : 여러 필드의 키워드 검색).

생성 된 쿼리가 다양한 시나리오에 적합한 지 확인하려면이 테스트를 단위 테스트해야합니다. 이를 테스트하는 한 가지 방법은 끝에서이를 확인하고 데이터베이스 상호 작용을 조롱함으로써 최대 절전 기준이 올바르게 작성되었는지 테스트하는 것입니다. 그러나 이것이 바람직하지 않은 이유는 첫째, 코드를 작성하는 것만으로도 속임수로 쓰는 것이고, 조건 자체가 최대 절전 모드로 바뀌거나 문제가되는 데이터베이스로 이동하는지 확인하지 않기 때문에 바람직하지 않습니다.

사용할 옵션은 테스트 데이터베이스에 대해 쿼리를 실행합니다. 그러나 역사적인 이유로 정적 테스트 데이터베이스 (예 : 코드가 코드의 일부로 체크인되는 데이터베이스)가 없으며 프로젝트의 송금으로 인해 프로젝트를 만들 수 없기 때문에 테스트를 통해 만족해야합니다. 프로덕션 데이터로 정기적으로 새로 고친 공유 개발 데이터베이스입니다.

이러한 문제가 새로 고쳐지면 테스트 뒤의 데이터가 변경 될 수 있으며 이로 인해 Google의 단위 테스트가 약해질 수 있습니다. 테스트에서 정확한 숫자를 사용하지 않음으로써 문제를 해결할 수 있지만 실제로는 그렇게 테스트하지 않습니다.

질문은 다음과 같습니다. 사람들이 테스트를 덜 부서지기 위해 이런 경우에 무엇을합니까? 내가 염두에두고있는 한 가지 옵션은 동일한 쿼리를 수행하는 네이티브 SQL을 실행하는 것입니다 (behaviourally - 기대 한 번호를 얻고 DAO 버전을 실행하기 위해 최대 절전 모드로 생성 된 쿼리와 정확히 동일 할 필요는 없습니다). 일치하면. 이 방법으로 쿼리의 동작을 초기 네이티브 SQL에서 항상 구현할 수 있으며 항상 올바른 숫자를 갖게됩니다.

이 상황을 관리하는 방법에 대한 의견이나 다른 의견을 보내 주시면 대단히 감사하겠습니다.

A.

UPDATE : 안부

내가 그들과 함께 잘 알고 있지만,이 회사는 아직 그 길을 내려 가서 조금씩 그 일을 할 준비가되지,/H2/더비 제안을 HSQLDB하기 단 하나의 테스트 케이스만으로는 적합하지 않습니다.

내 상대적으로 복잡한 키워드 검색이 "존 스미스"2100 일치를 반환하는지 확인하려면 : - 내가 좀 더 정교하고 싶은 내 이전 제안에 관해서

이 시나리오를 고려하십시오.

예상되는 번호를 찾으려면 데이터베이스를 분석하여 SQL 쿼리를 사용하여 번호를 알아 냈어야합니다. 테스트의 일부로 쿼리를 사용하는 단점은 무엇입니까? 그러면 기준의 동작을 테스트하고 있음을 항상 알 수 있습니다.

기본적으로 질문은 : 어떤 이유로 테스트를 위해 정적 데이터 세트를 가질 수없는 경우, 취성이없는 방식으로 통합 테스트를 수행하는 방법은 무엇입니까?

답변

5

필자는 안드레이 (Andrey)와 베드 위 (Bedwyr)와 장기적으로 가장 좋은 접근법은 테스트를 위해 특별히 hsqldb 데이터베이스를 만드는 것이라고 동의합니다. 그렇게 할 수있는 옵션이 없다면 솔루션이 적절한 것 같습니다. 모든 것을 테스트 할 수는 없지만 아무 것도 테스트하지 않으려는 경우도 있습니다. 필자는이 방법을 통합 데이터베이스 등을 대상으로 웹 서비스를 테스트하는 데 몇 번 사용했습니다. 그러나 새로운 열 등을 추가하면이 데이터베이스도 유지되어야합니다.

시도 할 대상을 결정해야합니다. 테스트 할. 당신은 최대 절전 모드를 테스트하고 싶지 않다. 데이터베이스가 당신이 요청한 것을 SQL이 제공하는지 테스트하고 싶지는 않을 것이다. 테스트에서 데이터베이스와 마찬가지로 최대 절전 모드가 작동한다고 가정 할 수 있습니다.

당신 말 :

우리는이 생성 된 쿼리가 다양한 시나리오에 대한 올바른 있는지 확인하기 위해 단위 테스트를해야합니다. 이를 테스트하는 한 가지 방법은 이 바람직하며 최대 절전 기준은 으로 끝 부분을 확인하고 데이터베이스를 조롱하여 정확히 만들어집니다. 그러나 처음에는 다소 부정 행위 (코드가 수행하는 것만 복사하는 것임)이고 또한 조건 자체가 최대 절전 모드를 barf 에 발생 시키거나 데이터베이스로 이동하면 문제가 발생하는지 확인하지 않기 때문에 바람직하지 않습니다.

barf를 기준으로 최대 절전 모드로 전환해야하는 이유는 무엇입니까? 왜냐하면 당신은 잘못된 기준을 부여하기 때문입니다. 이것은 최대 절전 모드에서는 문제가 아니지만 기준을 만드는 코드와 관련이 있습니다. 데이터베이스없이 테스트 할 수 있습니다.

데이터베이스에 도착하면 문제가 발생합니까? Hibernate는 일반적으로 여러분이 지정한 조건과 데이터베이스 언어에 적합한 sql을 생성한다. 그래서 다시 문제가된다.

데이터베이스가 최대 절전 모드에서 기대하는 것과 일치하지 않습니까? 이제 기준과 데이터베이스가 정렬되어 있는지 테스트하고 있습니다. 이를 위해서는 데이터베이스가 필요합니다. 그러나 더 이상 기준을 테스트하지 않고, 모든 것이 정렬되어 있는지, 다른 종류의 테스트인지를 테스트하고 있습니다.

그래서 실제로, 당신이 통합 테스트를하고있는 것으로 보입니다. 기준에서 데이터베이스 구조에 이르는 전체 체인이 작동합니다. 이것은 완벽하게 유효한 시험입니다.

그래서 내가하는 일은 정보를 얻기 위해 데이터베이스 (jdbc)에 대한 다른 연결을 만드는 테스트입니다. 행 번호 등을 얻기 위해 SQL을 실행하거나 삽입이되었는지 확인하십시오.

나는 귀하의 접근 방식이 완벽하게 유효하다고 생각합니다.

+0

감사합니다. 그렇습니다. 올바른 수준에서 테스트를 수행하는 것과 관련하여 여러분의 관점에서 절대적으로 옳습니다. 그리고 우리는 여기서 최대 절전 모드 나 그것의 기준 API를 테스트하지 않습니다. 저는 기준이 특정 방식으로 만들어 졌는지 테스트하는 것이 효과가 없다는 것을 설명하려고했습니다. 그리고 말했듯이 우리는 기준에서 구조까지 전체 체인을 테스트해야 할 것입니다. 그게 정확히 내가 생각하고있는 것이고 당신의 의견은 그것에 많은 도움이됩니다! 건배. –

3

그러나 역사적인 이유로 정적 테스트 데이터베이스 (코드 예를 들어, 코드의 한 부분으로 체크인 할 일)과 나

을에 작성에 착수하는 것을 허용하지 않습니다 내 프로젝트의 송금이 없다

당신이해야 할 일은 H2 또는 그와 비슷한 것입니다 - 일부 엔티티를 넣고 통합 테스트를 실행하십시오. 몇 가지 테스트를 수행하고 나면 필요한 경우 모든 통합 테스트에 사용할 수있는 일부 테스트 데이터가있는 스키마를 만드는 데이터 설치 유틸리티를 추출 할 수 있어야합니다.

+0

아래 @Andrey Adamovich에게 의견을 보내 주셔서 감사합니다. 두 가지 제안은 모두 의미가 있지만 지금 당장 수행되는 방식의 전반적인 구조에서 그 변화를 만들지 못할 수도 있습니다. –

6

Apache Derby 또는 HSQLDB과 같은 메모리 내 데이터베이스를 사용하고 테스트 시작 전에 DBUnit을 사용하여 데이터를 미리 채울 수 있습니다.

업데이트 : 여기에 aproach에 대한 멋진 article이 있습니다.

+0

고맙습니다. 저는 hyperSQL db, dbunit 및 liquibase에 익숙하며 과거에는 여러 번 사용했습니다. 그러나, 그것은 우리가 작업하고있는 소규모 프로젝트의 범위 내에서 현재 수행 할 수있는 권한이없는 작업 수준입니다. –

+0

점심 시간에 마시거나 1 시간 전에 도착하십시오. 최신 버그를 발견 한 테스트를 사용하여 컴퓨터에서 실행하여 상사에게 데모하십시오. – blank

+0

hsqldb 설정, 최대 절전 모드 구성 만들기 및 빈 데이터베이스를 만들고 setUp/tearDown 메서드를 추가하여 너무 오래 걸리지 않도록 단위 테스트를 지정하십시오. DBUnit 데이터 세트를 만드는 데 더 오래 걸릴 수있는 유일한 비트가 있습니다. 그러나 실제 데이터베이스 중 일부를 사용하여 DBUnit을 사용하여 데이터를 추출하거나 일부 데이터 생성기를 사용하여 데이터를 만들 수 있습니다. –

관련 문제