2008-11-11 2 views
35

저는 스프링 MVC 프로젝트에서 작업 중이며 소스 트리의 다양한 컴포넌트에 대한 단위 테스트를하고 있습니다. I는 LoginService가 주입 있어야 제어기 HomeController를 가질 경우, 예를 들어유닛 테스트와 Spring과의 통합 테스트

, 다음 제 단위 테스트 HomeControllerTest에 단순히 (스프링의 외부) 정상적으로 객체를 인스턴스화하고 속성 주입 :

protected void setUp() throws Exception { 
    super.setUp(); 
    //... 
    controller = new HomeController(); 
    controller.setLoginService(new SimpleLoginService()); 
    //... 
} 

이것은 각 구성 요소를 분리 된 단위로 테스트하는 데 효과적입니다. 클래스를 작성하고 성공적인 단위 테스트를 작성한 후 프로젝트에서 수십 개의 클래스가 생겼으나, 스프링 MVC를 업데이트하는 것을 잊어 버렸습니다. 전개 된 응용 프로그램에서 실제 배선 작업을 수행하는 컨텍스트 파일. 나는 프로젝트를 Tomcat에 배포하고 non-wired-up beans에서 NullPointers를 찾을 때 컨텍스트 파일을 업데이트하는 것을 잊었다. 그것이 내가했던 것처럼, 개별 콩에 대한 단위 테스트를 작성하는 것이 정상입니다, 다음 테스트의 두 번째 세트를 만들 -

  1. 이 나의 첫번째 봄 프로젝트입니다 :

    그래서 여기 내 질문 있습니다 (통합 테스트) 실제 애플리케이션 컨텍스트에서 모든 것이 예상대로 작동하는지 테스트하십시오. 이것에 대한 가장 좋은 방법이 있습니까?

  2. 또한 단위 테스트를 통합 테스트와 어떻게 구분합니까? 나는 모든 소스 코드를 src, test의 단위 테스트 - 통합 테스트 케이스에 대한 두 번째 테스트 폴더 (예 : test-integration)가 있어야합니까? 오히려 내가 오히려 사회의 나머지 물어 바퀴를 다시 발명보다 - 이것이 나의 첫번째 봄 프로젝트이기 때문에

, 나는 다른 사람들이 일반적으로 이런 종류의 일에 대해 이동하는 방법 궁금합니다.

답변

32

모범 사례가 될 수는 없지만 과거에 내가 한 일은 여기에 있습니다.

단위 테스트 :

  • 주입 서비스에 대한 사소하지 않은 콩 (즉, 당신의 봄 대부분의 관련 콩)
  • 사용 모의 객체를위한 단위 테스트를 작성 곳 실질적인 (즉, 대부분의 경우 모든 시간).
  • 프로젝트 test 디렉토리에서 이러한 테스트에 대한 표준 명명 규칙을 사용하십시오. 클래스 이름에 접두사 또는 접미사로 Test 또는 TestCase을 사용하는 것은 널리 보급 된 것으로 보입니다.

통합 테스트 :

  • 가 설정하는 AbstractIntegrationTestCase 만들기 intetgration 테스트 clases에서 사용 SpringWebApplicationContext.
  • test 디렉터리의 통합 테스트에 대한 명명 규칙을 사용하십시오. 이 테스트에서는 IntTest 또는 IntegrationTest을 접두어 또는 접미사로 사용했습니다.

설정 세 개미 test 대상 :

  1. 테스트 - 모든 (또는 당신이 그것을 이름을 원하는대로) : 실행 단위 및 통합
  2. 시험 테스트 : 실행 단위 테스트를 (단지 때문에 test 보인다
  3. 테스트 통합 테스트 단위에 대한 가장 일반적인 사용 될 수 :. 통합 테스트를 실행을

언급 한 바와 같이, 프로젝트에 적합한 이름 지정 규칙을 사용할 수 있습니다.

분리 단위를 통합 테스트에서 별도의 디렉토리로 분리하면 개발자 및 해당 도구을 쉽게 찾고 실행할 수 있다는 것이 중요하지 않다고 생각합니다.

예를 들어 Spring과 함께 작업 한 마지막 Java 프로젝트는 위에서 설명한 것과 정확히 같은 것을 사용했으며 통합 테스트와 유닛 테스트는 동일한 test 디렉토리에 있습니다. 반면에 Grails 프로젝트는 일반 테스트 디렉토리 아래에 단위 및 통합 테스트 디렉토리를 명시 적으로 분리합니다.

+1

이것은 좋은 전략처럼 들립니다. 하지만 동일한 디렉토리에있는 유닛 테스트와 통합 테스트를 통해 이클립스가 서로 구분할 수있는 방법이 없다. 그렇다. Eclipse의 junit 테스트 실행 옵션은 Ant를 실행하거나 특정 폴더에서 모두 실행하는 것입니다. Ant와 같은 이름으로 나눌 수는 없습니다. –

+0

다시 돌아가서 이클립스를 확인해야했다. 맞다. 같은 디렉토리에 있다면 테스트를 차별화 할 방법이 없다. 마지막 Spring 프로젝트는 Idea/Intellij에서 이루어졌으며 IDE 구성이 무엇인지 정확하게 기억하지 못할 정도로 오래되었습니다. –

4

@Component, @Controller, @Service 및 @Repository를 사용하여 모든 콩에 주석을 추가하는 순전히 주석이 달린 정권으로 전환하면 봄이 지루하고 이중으로 책을 관리하는 일이 사라집니다. 삽입해야하는 속성에 @Autowired를 추가하십시오.

스프링 참조 매뉴얼 3.11 절 참조. http://static.springframework.org/spring/docs/2.5.x/reference/beans.html#beans-annotation-config

관련 메모에 KenG에서 설명한 Division/Integratrion 테스트를 사용하고 있습니다. 저의 가장 최근 정권에서는 세 번째 "클래스"의 테스트 인 "ComponentTests"도 소개했습니다. 이들은 전체 스프링 배선으로 실행되지만 유선 스텁 구현 (봄철에는 구성 요소 스캔 필터 및 주석 사용)으로 실행됩니다.

우리가 이것을 한 이유는 "서비스"계층의 일부로 수작업으로 코딩 된 배선 논리로 끝나기 때문에 수동으로 빈과 빈번한 양의 모의 객체를 연결하기 때문입니다. 5 라인의 테스트를위한 100 라인의 배선은 드문 일이 아닙니다. 구성 요소 테스트는이 문제를 완화합니다.

+0

불행히도 저는 여전히 Java 1.4를 사용하고 있습니다. ( –

0

웹 응용 프로그램에 대한 통합 테스트를 만들었다면이를 별도의 디렉토리에 넣었습니다. 그것들은 jUnit이나 TestNG를 사용하여 만들어졌고 사용자 인 것처럼 웹 페이지를 때리는 Selenium 같은 것을 사용하여 테스트중인 시스템과 상호 작용합니다. 이 사이클은 컴파일, 유닛 테스트 실행, 웹 앱 구축, 실행중인 서버에 배포, 테스트 실행, 앱 배치 해제 및 결과보고가 될 것입니다. 아이디어는 전체 시스템을 테스트하는 것입니다.

2

InitializingBean 인터페이스 ("afterPropertiesSet"메소드 구현)를 사용하거나 bean에 대해 init 메소드를 지정하십시오. bean에 init 메소드를 추가하는 것을 기억할 필요가 없으므로 InitializingBean이 일반적으로 더 쉽습니다.

afterPropertiesSet를 사용하여 모든 항목이 null이 아닌 것으로 주입되었는지 확인하고, null 인 경우 예외를 throw합니다.

0

통합 테스트와 별도로 실행중인 유닛 테스트와 관련하여 나는 후자를 모두 통합 테스트 디렉토리에두고 this과 같은 접근법을 사용하여 IDE/Ant를 사용하여 실행합니다. 나를 위해 일합니다.

6

몇 가지 고립 된 점 :

예, 테스트 봄하는 일반적인 접근 방식 - 전자는 어떤 Spring 컨텍스트를로드하지 않는 별도의 단위 테스트 및 통합 테스트.

단위 테스트의 경우, 고립 된 하나의 모듈에 테스트가 집중되도록 조롱하는 것이 좋습니다.

테스트가 종속성 톤에 배선되어 있다면 실제로는 단위 테스트가 아닙니다. 종속 테스트는 dependency injection보다는 새로운 테스트를 사용하여 종속성을 연결하는 통합 테스트입니다. 제작 응용 프로그램에서 Spring을 사용할 때 시간과 노력이 낭비됩니다!

스프링 컨텍스트를 가져 오는 기본 통합 테스트가 유용합니다.

@required 주석은 스프링 배선에서 필요한 종속성을 확보하는 데 도움이 될 수 있습니다.

Maven을 살펴보면 유닛과 통합 테스트를 바인드하기위한 명확한 단계가 제공됩니다. Maven은 Spring 커뮤니티에서 널리 사용된다.

0

단위 테스트와 통합 테스트의 차이점은 단위 테스트가 반드시 컨텍스트를로드하지 않는다는 것입니다. 작성한 코드에 초점을 맞추고 있습니다. 즉, 작동 속도가 빠르며, 예외가있을 수도 있고 없을 수도 있습니다. 그것에서 전화. 그러나 통합 테스트의 경우 컨텍스트를로드하고 실제 시나리오처럼 종단 간 테스트를 수행합니다.