m2eclipse test practice

m2eclipse를 사용하면 기존의 한 번 작성한 테스트룰 절대 다시 수정하지 않는 것, 테스트 코드내에 sleep()을 사용한든지 하는 것, 대충 mocking 하는 것들의 습관이 절망으로 다가옵니다. 기존의 잘못된 테스트 코드들이 m2eclipse로 유기적으로 프로젝트를 관리하는데 방해됩니다.

Maven없이도 test를 사용해왔지만 Maven의 강력하고도 편리한 기능을 사용하려면 test가 잘 짜여져야 합니다. 그 이유는 Maven CoC에서 package등의 life cycle에 test가 포함돼있기 때문입니다. test가 반드시 빨리 성공하지 않으면 심장이 터질듯한 답답함을 느끼게됩니다.

이 글은 m2eclipse를 처음 사용하면서 느끼게 되는 답답함을 조금 덜어줬으면 하는 바램에서 작성해봅니다.

m2eclipse test practice

먼저 m2eclipse test실행할 때의 케이스를 정리해 봅니다. 이 것은 제가 생각하본 케이스로 각각 상황에 맞게 configure할 수 있다면 불편하지 않을 것 같습니다(다른 상황이 생각나질 않는데 알려주시면 고맙겠습니다).

  • test without m2eclipse - 디버깅, 하나또는 몇 개의 테스트를 선택적으로 실행시킬 때 유용.
  • test with m2eclipse - eclipse내에서 사용하기에는 조금 붚편합니다. 몇 가지 옵션을 주어야만 가능합니다.
  • skip test in mvn package - 테스트에 문제가 있는 상황에서 급하게 배포하려 할때 유용.

test without m2eclipse

m2eclipse를 사용한다고 해도 테스트를 하나씩 혹은 몇개씩 실행하기도 쉽고 디버깅도 편리합니다. m2eclipse를 통해 실행할 테스트를 명시하려면 다음과 같이 옵션을 줘야하는데 귀찮습니다:

mvn -Dtest=TestSquare,TestCi*le test

또 디버깅하려면 다음과 같이 옵션을 줘서 실행하고 'Remote Java application'을 통해서 디버깅해야 하는데 이 것도 귀찮습니다:

mvn -Dmaven.surefire.debug=true test

실행하면 디폴트로 5005 포트가 열립니다. 'Remote Java application'를 통해서 디버깅할 수 있는데 다시 말씀드리지만 조금 귀찮습니다. 자세한 설정방법은 Classloading and Forking under Maven Surefire을 읽어보세요.

단, maven-surefire-plugin의 forkMode설정이 기본값인 once나 never로 설정돼있어야 합니다.

test with m2eclipse

'test with m2eclipse'는 반드시 빨리 성공하기만 하면됩니다. 먼저 말했듯이 m2eclipse로 디버깅하는 것은 귀찮습니다. m2eclipse의 test 메뉴로 실행하는 경우는 거의 없습니다. 음 좀 혼란 스러울 수 있는데 여기서 말하고 있는 것은 eclipse의 junit test 메뉴를 말하는 것이 아닙니다. eclipse의 'run as'/'maven ...'를 이용해 테스트를 하는 것을 말하는 것입니다.

skip test in mvn package or etc

다음과 같은 옵션으로 테스트를 스킵할 수 있습니다:

mvn -Dmaven.test.skip=true package

[Skipping Tests]에는 pom파일에도 명시할 수 있는데 전 잘되지 않네요. 아마도 버전때문일 듯싶습니다. 2.5라고 명시를 해도 2.4.x버전으로만 실행됩니다. 나중에 다시 해볼일이 생겼을때 확실히 정리하겠습니다.

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.5</version>
        <configuration>
          <skipTests>true</skipTests>
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

Reference