2011-10-11 3 views
0

나는 내 테스트가 통과하거나 선언의 순서에 따라 실패하는 경우를 다루고있다. 이 코스는 제대로 격리되지 않은 테스트를 가리 킵니다. 그러나 나는 문제를 찾는 방법에 관해서 난처한 입장에 처해있다. 것은 junit에 빌드 된 테스트 프레임 워크에 속하며 일부 종속성 주입 컨테이너가있는 클래스에서 파생 된 내 junit 테스트입니다. 컨테이너는 기본 클래스 설정에 따라 모든 테스트마다 재설정되므로 컨테이너 자체가 새로운 컨테이너이기 때문에 적어도 컨테이너에는 느린 개체가 없습니다. 그래서 나는 다음과 같은 시나리오에 기대고있다.간헐적 인 junit 테스트 실패 문제를 해결하는 방법은 무엇입니까?

  1. test1은 classA.somestaticMember를 xyz 값으로 설정하는 일부 classA를 간접적으로 발생시킵니다. test obj는 classA에 대한 참조를 직접적으로 유지하지 않지만 testA가 끝나면 classA는 여전히 값이 xyz 인 VM에 의해로드됩니다.
  2. test2 액세스 classA 및 xyz 값을 가진 somestaticmember에 올라간다.

문제점은 다음과 같습니다. a) 실제로 이것이 사실인지 어떻게 알지 못합니다. 어떻게 찾습니까? 코드에서 정적 var에 대한 참조를 찾을 수없는 것 같습니다 ... b) junit에로드 된 모든 클래스를 덤프하고 모든 테스트 메소드에 대해 새로 고치라고하는 방법이 있습니까?

+1

실행 순서에 따라 테스트가 실패하면 실제로는 단위 테스트가 아닙니다. 그것은, 또는 당신은 비품을 이용하지 않습니다. – cHao

답변

1

당신은

@Before public void init() 
{ 
    // set up stuff 
} 

처럼 @Before과 방법을 선언 할 수 있습니다 및 JUnit을 각 테스트 전에 실행됩니다. 이것을 사용하여 "fixture"(테스트가 서로 독립적으로 작동 할 수있는 알려진 새로운 객체, 데이터 등)를 설정할 수 있습니다.

각 테스트 후에 이 필요한 정리를 수행하는 데 사용할 수있는 @After도 있습니다. Java는 사용 된 모든 객체를 정리할 것이므로 일반적으로이 작업을 수행 할 필요는 없지만 외부 객체 (생성 및 제어하지 않는 객체)를 알려진 상태로 복원하는 데 유용 할 수 있습니다.

(참고 : 테스트를 수행하기 위해 외부 물체에 의존하는 경우 더 이상 단위 테스트가 아닙니다. 코드가 실패했는지 여부는 말할 수 없습니다. 바깥 쪽 대상은 단위 테스트의 목적 중 하나입니다.)

+0

"단위 테스트"에 동의하지 않습니다. 필자는 완전한 외부 물체를 사용하고 있기 때문에 더 많은 기능/통합 테스트가 필요합니다. 그러나 나는 그 문제에 대해 많은 말을하지 않는다. HAVING 테스트는 아무도 반대하지 않는 큰 발전이었습니다. junit 3.8과 setup 및 teardown 메소드를 사용하고 있지만 외부 객체는 어떻게 초기화합니까? – treefrog

+0

@ treefrog : 귀하의 DI 프레임 워크 및/또는 귀하의 개체에 따라 다릅니다. 필요에 따라 수동으로 개체를 새로운 개체로 대체하거나 기존 개체를 "재설정"할 수 있어야합니다. 예를 들어, 외부 객체가 데이터베이스 인 경우 모든 이전 데이터를 삭제 한 다음 모든 테스트를 수행 할 수있는 충분한 데이터를 삽입하십시오. 또는 파일의 경우 파일을 제거하거나 다시 넣거나 알려진 버전으로 바꿉니다. 네트워크 항목의 경우 연결을 닫은 다음 다시 시작하십시오. 요점은 * 테스트가 일으킬 수있는 부작용 *을 취소합니다. 각 테스트마다 환경이 동일해야합니다. – cHao

+0

네, 그게 내가해야 할 일이라는 것을 이해합니다. 나는 그것을 달성 할 수있는 방법을 찾고있었습니다 .- junit은 테스트를로드하기위한 별도의 클래스 로더를 지정하는 방법을 제공합니까? 또는 클래스 로더에 의해로드 된 모든 클래스를 반복하고 리플렉션을 통해이를 정리해야 할 수도 있습니다. 다른 방법은 생각할 수 없습니다. – treefrog