문제

처음 포스터와 TDD 채택 자. :-) 나는 조금 장황 할 것이다.

최근에 비즈니스 흐름을 구현하기 위해 Apache CXF 프레임 워크, Spring 및 Commons 체인을 사용하여 SOAP 기반 웹 서비스를 개발하기 시작했습니다. 여기서 직면 한 문제는 단위 테스트 및 기능 테스트에서와 같이 웹 서비스를 테스트하는 것입니다.

단위 테스트에 대한 첫 번째 시도는 완전한 실패였습니다. 장치 테스트를 유연하게 유지하기 위해 스프링 XML 파일을 사용하여 테스트 데이터를 유지했습니다. 또한 테스트 할 "구성 요소"인스턴스를 작성하는 대신 스프링 응용 프로그램 컨텍스트에서 검색했습니다. 데이터를 보유한 XML 파일은 빠르게 손을 잡았습니다. XML에서 객체 그래프를 만드는 것은 악몽으로 판명되었습니다. 테스트 할 "구성 요소"는 스프링 응용 프로그램 컨텍스트에서 선택되었으므로 각 테스트 실행이로드되었습니다. 모두 내 애플리케이션, DAO 객체와 관련된 구성 요소 등. 또한 단위 테스트 사례가 중앙 집중화되거나 구성 요소 만 테스트하는 데 집중되어있는 개념과 달리 내 단위 테스트는 데이터베이스를 치고 메일 서버 등과 통신하기 시작했습니다. 나쁜.

나는 내가 무엇을 잘못했는지 알고 그것을 바로 잡는 방법을 생각하기 시작했다. 이 보드의 게시물 중 하나의 조언에 따라, 나는 실제 DAO 클래스와 메일 서버를 사용하고 기능을 조롱 할 수 있도록 Java Mocking 프레임 워크 인 Mockito를 찾아 보았습니다.

단위 테스트가 약간 제어되면 두 번째 문제가 발생합니다. 데이터에 대한 의존성. 내가 개발 한 웹 서비스는 논리가 거의 없지만 데이터에 대한 의존도는 거의 없습니다. 예를 들어, 내 구성 요소 중 하나를 고려하십시오.

public class PaymentScheduleRetrievalComponent implements Command {
  public boolean execute(Context ctx) {
    Policy policy = (Policy)ctx.get("POLICY");
    List<PaymentSchedule> list = billingDAO.getPaymentStatementForPolicy(policy);
    ctx.put("PAYMENT_SCHEDULE_LIST", list);
    return false;
  }
}

내 구성 요소의 대다수는 동일한 경로를 따릅니다. 컨텍스트에서 도메인 객체를 선택하고 DAO를 누르고 [우리는 IBATIS를 SQL Mapper로 사용하고 있습니다] 결과를 검색합니다.

이제 질문이 있습니다.
- 단일 삽입 또는 업데이트가 데이터베이스를 "불안정한"상태로 남겨두면 DAO 클래스가 ESP를 어떻게 테스트합니까?
- 데이터 저장소에서 Mindless Insertions/검색을 통해 많은 데이터를 이동하는 기능 테스트 웹 서비스를위한 요소 표준은 무엇입니까?

귀하의 개인적인 경험/의견은 크게 감사 할 것입니다. 당면한 문제를 설명 할 때 내 부분에 대한 세부 정보를 놓친 경우 알려주십시오.

-Sasuke

도움이 되었습니까?

해결책

HSQL과 같은 단위 테스트를 실행하기위한 메모리 인 데이터베이스를 권장합니다. 이를 사용하여 스키마를 즉시 생성 할 수 있습니다 (예 : Hibernate를 사용하는 경우 XML Mappings 파일을 사용할 수 있습니다). 그런 다음 장치 테스트가 끝날 때 데이터베이스를 파괴하기 전에 필요한대로 삽입/업데이트/삭제. 테스트는 실제 데이터베이스를 방해하지 않습니다.

두 번째 문제 (웹 서비스의 엔드 투 엔드 테스트)를 위해 과거에 CXF 기반 서비스를 성공적으로 테스트했습니다. 트릭은 테스트 시작시 경량 웹 서버를 사용하여 웹 서비스를 게시 한 다음 CXF를 사용하여 클라이언트를 웹 서비스 엔드 포인트로 가리키고 전화를 실행 한 다음 마지막으로 부제티를 종료하는 것입니다. 웹 서비스를 호스팅하는 인스턴스 단위 테스트가 완료되면.

이를 달성하려면 jaxwsserverfactorybean (Server-Side) 및 JAXWSPROXYFACTORYBEAN (Client-Side) 클래스를 CXF와 함께 사용할 수 있습니다. 샘플 코드는이 페이지를 참조하십시오.

http://cwiki.apache.org/cxf20doc/a-simple-jax-ws-service.html#asimplejax-wsservice-publishingyourservice

또한 웹 서비스에 대한 기능 테스트를 수행하기 위해 SOAP UI까지 큰 엄지 손가락을 줄 것입니다. JMeter는 또한 스트레스 테스트 웹 서비스에 매우 유용하며, 이는 데이터베이스 조회를 수행하는 서비스에 중요합니다.

다른 팁

나는 "당신이라면"글로벌 해시 맵으로서의 컨텍스트 "에서 멀리 떨어져있을 것입니다.

지속성 매핑을 테스트하는 것 같습니다 ...

당신은 다음을 살펴볼 수 있습니다. 봄이없는 지속적인 물체를 테스트합니다

우선 : 스프링 응용 프로그램 컨텍스트에서 테스트 중 (SUT)에 따라 피사체를 검색 해야하는 이유가 있습니까? 효율적인 단위 테스트를 위해서는 컨텍스트없이 SUT를 만들 수 있어야합니다. 어딘가에 숨겨진 의존성이있는 것 같습니다. 그것은 당신의 두통의 뿌리 일 수 있습니다.

단일 삽입 또는 업데이트가 데이터베이스를 "불안정한"상태로 남겨두면 DAO 클래스가 ESP를 어떻게 테스트합니까?

테스트를 실행 한 후 데이터베이스의 상수도에 대해 걱정하는 것 같습니다. 가능한 경우 테스트를 위해 자체 데이터베이스를 사용하여 신경 쓰지 않아도됩니다. 이러한 샌드 박스 데이터베이스가있는 경우 원하는대로 데이터를 삭제할 수 있습니다. 이 경우 다음을 수행합니다.

  1. 특수 접두사를 필드에 넣는 것과 같은 공통 식별자로 모든 가짜 데이터를 표시하십시오.
  2. 테스트를 실행하기 전에 삭제 된 데이터를 삭제하는 삭제 명령문을 떨어 뜨립니다. 아무것도 없다면 나쁜 일은 일어나지 않습니다.
  3. 단일 DAO 테스트를 실행하십시오. 그 후 2 단계를 반복 한 후 다음 테스트의 경우.

많은 데이터를 중심으로하는 기능 테스트 웹 서비스에 대한 사실적인 표준은 무엇입니까?

나는 아무것도 모른다. 질문에서 귀하가 묻는 질문에서 나는 당신이 한쪽에 웹 서비스와 다른쪽에는 데이터베이스를 가지고 있다고 추론 할 수 있습니다. 책임을 분할하십시오. 각 측면에 대해 별도의 테스트 스위트가 있습니다. 한쪽은 데이터베이스 액세스를 테스트합니다 (위에서 설명한대로). 다른 쪽에서는 웹 서비스 요청 및 응답을 테스트합니다. 이 경우 스텁/가짜/모의 계층은 네트워크와 대화하는 계층을 지불합니다. 또는 고려하십시오 https://wsunit.dev.java.net/.

프로그램이 데이터를 안팎으로 밀어내는 경우 동작이 많지 않다고 생각합니다. 이 경우 가장 어려운 작업은 데이터베이스 측면과 웹 서비스 측을 단위 테스트하는 것입니다. 요점은 "현실적인"데이터가 필요없이 단위 테스트를 수행 할 수 있다는 것입니다. 기능 테스트의 경우 현실에 가까운 손으로 필요한 데이터가 필요합니다. 이것은 번거로울 수 있지만 이미 데이터베이스와 웹 서비스 부품을 집중적으로 테스트 한 경우 "현실적인"테스트 사례의 필요성을 상당히 줄여야합니다.

우선, 일을 명확하게하십시오.

이상적인 세상에서 당신의 구축중인 소프트웨어의 수명주기는 다음과 같습니다. - SY는 고객과 보고서를 작성하므로 응용 프로그램이 어떻게 작동하는지에 대한 예제가있는 사용자 스토리를 얻었습니다. 사용자 스토리를 일반화하므로 얻었습니다. 사용 사례라고 부르는 규칙 - 기능적 (End -End) 테스트를 작성하기 시작하면 실패합니다 ...- 그 후 UI를 빌드하고 서비스를 조롱 한 후 녹색 기능 테스트를 받았습니다. 서비스 작동 방식에 대한 사양 ...- 귀하의 작업은 기능 테스트를 녹색으로 유지하고 서비스를 단계별로 작성하여 통합 테스트를 작성하고 단위 테스트 수준에 도달 할 때까지 동일한 접근 방식으로 종속성을 조롱하는 것입니다. - 그 후 사용 사례와 함께 다음 반복을 수행하고 다음 기능 테스트를 작성하는 등 프로젝트가 끝날 때까지 사용합니다. 그 후 제품을 수락하고 많은 비용을 지불하는 고객과 수락 테스트를 수행합니다.

그래서 우리는 이것으로부터 무엇을 배웠습니까?

  • 많은 유형의 테스트가 있습니다 (서로 혼동하지 마십시오)
    • 기능 테스트 - 사용 사례를 테스트하기 위해 (아무것도 조롱하지 않음)
    • 통합 테스트 - 응용 프로그램, 구성 요소, 모듈, 클래스 상호 작용 테스트 (관련없는 구성 요소 조롱)
    • 단위 테스트 - 환경과 분리하여 단일 클래스를 테스트하기 위해 (모든 것을 조롱)
    • 사용자 수락 테스트 - 고객은 제품을 수락해야합니다 (수동 기능 테스트 또는 작동 중 자동 기능 테스트에서 작성된 프리젠 테이션)
  • 불가능하기 때문에 기능 테스트 및 통합 테스트를 통해 모든 것을 테스트 할 필요가 없습니다. 기능 및 통합 테스트를 통해 관련 부분 만 테스트하고 단위 테스트로 모든 것을 테스트하십시오! 자신을 익숙해 지십시오 피라미드 테스트.
  • TDD를 사용하면 인생이 더 쉬워집니다!
  • 단일 삽입 또는 업데이트가 데이터베이스를 "불안정한"상태로 남겨두면 DAO 클래스가 ESP를 어떻게 테스트합니까?

데이터베이스 트랜잭션을 테스트 할 필요가 없습니다. 데이터베이스 개발자가 이미 테스트했기 때문에 잘 작동한다고 가정하고 동시성 테스트를 작성하고 싶지 않다고 확신합니다 ... DB는 외부 구성 요소이므로 직접 테스트 할 필요가 없습니다. 데이터 액세스 계층을 작성하여 데이터 스토리지를 시스템에 조정하고 해당 어댑터에 대해서만 통합 테스트를 작성할 수 있습니다. 데이터베이스 마이그레이션의 경우이 테스트는 새로운 데이터베이스 어댑터에서도 작동합니다. 다른 테스트 (기능 테스트 제외)에 따라 특정 인터페이스를 구현하기 위해 작성하기 때문에 데이터 액세스 계층을 조롱 할 수 있습니다. 다른 모든 외부 구성 요소와 동일하게 수행하고 어댑터를 작성하고 조롱하십시오. 데이터베이스 액세스, 파일 시스템 액세스 등으로 인해 느리기 때문에 이러한 종류의 통합 테스트를 다른 테스트와 다른 테스트 스위트에 넣습니다.

  • 많은 데이터를 중심으로하는 기능 테스트 웹 서비스에 대한 사실적인 표준은 무엇입니까?

데이터베이스를 제외한 다른 모든 것을 구현할 때까지 동일한 스토리지 어댑터를 구현하는 IN 메모리 DB로 데이터 저장소를 조롱 할 수 있습니다. 그 후 데이터베이스의 데이터 액세스 계층을 구현하고 기능 테스트로 테스트하십시오. 느리게 진행되지만 예를 들어 새 릴리스마다 한 번만 실행해야합니다 ... 개발하여 기능 테스트가 필요한 경우 다시 메모리 솔루션으로 조롱 할 수 있습니다 ... 대체 접근 방식 만 실행할 수 있습니다. Test DB의 설정을 개발하거나 수정하여 영향을받는 기능 테스트를 더 빨리 만들기 위해 테스트 DB의 설정을 수정합니다.

나는 당신의 정확한 문제를 정말로 이해하지 못한다고 말해야합니다. 테스트를 실행 한 후 데이터베이스가 변경된 상태에있는 문제가 있습니까?

예, 실제로 여기에는 두 가지 문제가 있습니다. 첫 번째는 테스트 사례를 실행 한 후 데이터베이스가 일관되지 않은 상태로 남겨진 문제입니다. 두 번째는 웹 서비스의 엔드 투 엔드 테스트 측면에서 우아한 솔루션을 찾고 있다는 것입니다.

효율적인 단위 테스트를 위해서는 컨텍스트없이 SUT를 만들 수 있어야합니다. 어딘가에 숨겨진 의존성이있는 것 같습니다. 그것은 당신의 두통의 뿌리 일 수 있습니다.

그것은 실제로 조롱 프레임 워크의 도움으로 내가 지금 벗어나려고하는 두통의 근본 원인이었습니다.

테스트를 실행 한 후 데이터베이스의 상수도에 대해 걱정하는 것 같습니다. 가능한 경우 테스트를 위해 자체 데이터베이스를 사용하여 신경 쓰지 않아도됩니다. 이러한 샌드 박스 데이터베이스가있는 경우 원하는대로 데이터를 삭제할 수 있습니다.

이것은 실제로 이전 게시물에서 언급 한 문제에 대한 솔루션 중 하나이지만 데이터베이스/데이터가 귀하의 제어에 있지 않은 레거시 시스템과 일부 DAO의 경우에 모든 경우에 ESP가 작동하지 않을 수 있습니다. 방법은 특정 테이블 세트에 특정 데이터가 이미 존재해야합니다. DBUNIT와 같은 데이터베이스 장치 테스트 프레임 워크를 살펴 봐야합니까?

이 경우 스텁/가짜/모의 계층은 네트워크와 대화하는 계층을 지불합니다. 또는 고려하십시오 https://wsunit.dev.java.net/.

아, 흥미로워 보인다. 또한 SOAPUI와 같은 도구와 기능 테스트에 사용할 수있는 것과 같은 도구에 대해 들었습니다. 여기에 그러한 도구로 성공한 사람이 있습니까?

모호한 설명에 대한 모든 답과 사과에 감사드립니다. 영어는 내 모국어가 아닙니다.

-Sasuke

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top