4

인 컨테이너 테스트는 종종 모의 객체로 테스트하는 것에 반대합니다. 그러나 모의 객체가 단순히 실제 객체의 동작을 모방하기 때문에 실제 환경에서 시스템을 실제로 테스트하는 유일한 방법은 인 - 컨테이너 테스트가 아닌가?인 컨테이너 테스트와 모의 객체 대 통합 테스트

컨테이너 내 테스트 및 모의 객체의 부분적인 대안으로 Spring은 실제 응용 프로그램 컨테이너 (필자의 경우 웹 응용 프로그램 서버)를 시작하지 않고도 Spring을 멋지게 초기화하는 TestContext 프레임 워크를 제공합니다. 그러나 이는 애플리케이션 서버 고유의 기능이 지원되지 않는 동안 Spring 고유의 기능 만 초기화하기 때문에 다소 제한적인 접근 방식이다. 그래서 모든 것을 테스트 할 수는 없습니다. 또한 실제 웹 실행에 사용되는 기본값 인 WebApplicationContext과 100 % 동일하지 않기 때문에이 방법이 조금 해킹되지 않습니까? 나쁜가요?

컨테이너 내 테스트의 경우 Cactus (구형), Jeeunit (매우 작은 프로젝트) 및 JBoss Arquillian (여전히 알파이지만 유망 해 보입니다)이 있습니다. 이 프로젝트가 너무 광범위하게 사용되는 것을 보지 못했기 때문에 용기 내 테스트에 문제가 있습니까? 컨테이너 내 테스트에서 자주 언급되는 주된 단점은 실행 속도가 느리다는 것입니다. 그러나 지속적인 통합 환경과 비교적 작은 규모의 프로젝트에서 실행될 때는 문제가되지 않습니다.

정리 요약 : 컨테이너 내 또는 컨테이너 외부 테스트를해야하며 그 이유는 무엇입니까? 모의 객체 나 다른 초기화 메카니즘 (Spring TestContext와 같은)을 사용하여 통합 테스트를 수행하는 것이 좋지 않습니까?

부제 : 나는 최근에 약 categorization of integration test에 대해 물었습니다.

답변

3

그러나,하지 않은에서 컨테이너 정말 그 '실제 환경에서 시스템을 테스트 할 수있는 유일한 방법을 테스트 ?

나는 짧은 대답은 '예'라고 생각하지만 ... "통합 테스트의 분류"질문은 매우 적절하다고 생각합니다. 단위 및 통합 테스트는 모두 중요한 역할을하지만 중요합니다.

단위 테스트는 코드와 밀접하게 연관되어 있으며, 시작 및 실행 속도가 매우 빠르며 코드를 반복하는 개발자가 자주 실행해야하며 보통 mock을 많이 사용해야합니다. 아이디어는 의존성이나 통합 포인트가 아닌 문제의 코드를 테스트하는 것입니다. 단위 테스트를 모두 컨테이너에 포함시키는 문제는 실행 빈도가 적어 지거나 너무 많은 개발자 시간을 낭비하게된다는 것입니다.

우리는 코드 프로젝트와의 종속성을 가지고 다른 프로젝트의 컨테이너 내/통합 테스트를 격리했습니다. 가능한 한 많이 생산 구성을 가깝게 모방하도록 설계되었습니다. 이 테스트는 설정하는 데 시간이 오래 걸리고 더 오래 실행되며 cruisecontrol과 같은 것으로 실행하는 것이 더 유용합니다. 릴리즈가 끝나거나 개발이 안정화되면 특히 손으로 작동합니다. 점심 식사 나 모임에 갈 때 통합 테스트를 자주하는 경우가 종종 있습니다. 통합 테스트에서 버그가 발견되면 우리는 모의 버그를 보여주는 단위 테스트를 작성하려고 시도합니다. 이는 종종 어렵고 불가능할 수 있습니다.

일반적으로 단위 테스트에는 스프링 배선이 작동하는지 확인하거나 기본 기능을 테스트하기위한 몇 가지 작은 컨테이너 테스트가 있지만 나머지 테스트는 다른 프로젝트에서 수행됩니다.

이 모든 것들은이 둘 사이에 확연한 차이가 없다고 말했습니다. 때로는 많은 데이터를 처리하고 통합 테스트에 시간을 많이 소비하는 단위 테스트를 이동하고 때로는 통합 테스트가 충분히 빠르게 실행되고 코드와 함께 포함될만큼 가치가 있습니다.

+0

컨테이너에서 단위 테스트를 완벽하게 실행하고 있습니다. 사실, "스프링 배선"을 테스트하기 위해 왜 "작은 컨테이너 내 단위 테스트"를 실행하는지 이해할 수 없습니까? 어쩌면 거기에 타이포그래피, "작은 컨테이너 내 통합 테스트 *"를 의미할까요? 또한 올바르게 이해합니까? 런타임 구성이 변경되면 해당 설정을 통합 테스트 프로젝트에 복사해야합니까? 컨테이너 내 테스트를 실제로 어떻게 실행/초기화합니까? 어쩌면 일부 프레임 워크의 도움으로? –

+0

섹션을 편집했습니다. 우리는 모든 스프링 배선이 작동하는지 확인하기 위해 단위 테스트 모음에서 몇 가지 통합 테스트를 수행해야한다는 것을 의미했습니다. 모든 구성 파일은 코드와 함께 있습니다. 통합 프로젝트에 구성을 복사하지 않습니다. 통합 프로젝트는 프로덕션 코드와 동일한 패키지 경로를 공유하므로 동일한 src/main/resource (우리는 mvn을 사용하고 있습니다) 구성을 모두로드 할 수 있습니다. – Gray

2

우리는 용기 내외 컨테이너 테스트를해야한다고 말하고 싶습니다. 컨테이너를 테스트 할 때 발견 한 주요 문제점은 모든 것을 자동화하는 것이 훨씬 더 많은 작업이라는 것입니다. Spring의 통합 테스팅 지원과 같은 것으로 좀 더 저렴한 승리를 얻을 수 있지만, 전개 컨테이너에서 테스트하는 모든 것을 다룰 수 있다는 것을 속여서는 안됩니다.

모의 화제에 관해서는 스프링과의 통합 테스트에 참여할 수 있지만 통합 및 컨테이너 테스트를 위해 가짜/스텁 서비스를 사용할 가능성이 높습니다. d 호출 시스템 테스트).

조롱과 스터 빙의 차이점에 대해 잘 모르는 경우 Martin Fowler article을 확인하십시오. 모의 객체는 단순히 실제 객체의 동작을 모방로

+0

용기 내 테스트에는 어떤 라이브러리를 사용 했습니까? 어떤 속임수가 나는 것은 컨테이너 내부 테스트 프레임 워크 (Cactus, jeeunit, Arquillian) 각각은 CDI, EJB, Servlet 등과 같은 다양한 기술에 대한 특정 지원을 구현하는 것 같습니다./기사에 대한 포인터 주셔서 감사합니다, 나는이 경우 거의 경험이 없다는 것을 인정해야합니다. –

관련 문제