2011-08-19 3 views
1

나는 테스트해야 할 세 가지 클래스가있다.로드, 변환, 수행을 말하며, 모두 동일한 데이터 객체를 시작하거나 작업한다. 적어도 하나의 데이터 객체에서 필요하다. , 그리고 그것은 그것의 메소드로 그것의 일을 수행하는 Transform에 주어지며, 데이터 객체를 약간 변경하고 그것이 준비된 Perform입니다.Junit 테스트에서 동일한 데이터 객체를 공유합니까? 나는 그걸 모방해야 할까? 뭐라구?

이제로드, 변환 및 수행에 대한 테스트를 작성하고 싶습니다.

테스트 데이터 객체, 난 그냥

public static TestData makeTestData(...makeit...) 

또는 내가 TestDataMock 또는 TestDataTest 클래스를 확인해야합니다 같은로드 클래스의 정적 메서드를해야한다? 어느 것이 그 예일 수 있습니까? 또한 각 Load, Transform 및 Perform에서 작업 할 필요가있을 때 새로운 TestDataTest 클래스를 만드시겠습니까?

답변

2

당신은 항상 서로 독립적 인 단위 테스트를 만들기 위해 노력해야합니다. 이러한 이유로 가능할 때마다 항상 각 테스트에 대해 새로운 입력 테스트 데이터를 작성해야합니다. 테스트하려는 것은 "주어진 입력 데이터 X, 출력이 Y인지 확인"입니다. JUnit에는 @Before 주석이 있으며이 주석을 사용하여 해당 클래스의 각 테스트 케이스 이전에 실행될 메소드에 주석을 달 수 있습니다. 일반적으로 모든 설정 코드 (모의 객체 생성 및 초기화, 테스트 데이터 작성 또는로드 등)를 넣을 곳입니다.

대신에로드, 변환 및 수행 작업을 하나의 테스트 케이스로 결합 할 수 있지만 단위 테스트보다 더 많은 통합 테스트가 필요합니다.

0

대부분의 테스트 케이스 클래스는 testcase class per class의 스타일에 있어야합니다 : 당신의 클래스를 X이있는 경우는 하나 개의 해당 클래스 XTest있습니다. 하지만 그 일을하는 유일한 방법은 아닙니다. 협력하는 클래스 그룹이있는 경우 JUnit을 협력 클래스의 일부 저수준 통합 테스트에 사용할 수 있습니다. 이 테스트 케이스 클래스에 적합한 이름 만 생각하면된다.

그러나 협력하는 그룹의 그룹이있는 경우 해당 사실을 facade 뒤에 숨기거나 일부 상위 클래스의 단일 메서드 호출 만 숨길 수 있습니다. 그런 다음 그 정면이나 높은 lelve 방법을 단위 테스트에 대한 것으로 취급하십시오.

또는 3 개의 클래스를 매우 밀접하게 결합했기 때문에 3 개의 클래스를 개별적으로 테스트하는 방법을 모르고 다른 하나를 참조하지 않고도 하나의 동작을 설명 할 수 없다고 말하고 싶습니까? 이는 디자인이 좋지 않다는 것을 의미합니다. 각 클래스의 필수 동작을 개별적으로 설명 할 수 있도록 재 설계를 고려한 다음 개별적으로 (적어도 부분적으로) 테스트하십시오.

+0

그들은 밀접하게 결합되어 있지 않으며 단지 응용 프로그램 외부에서 키 - 값 형식으로 동일한 데이터를 처리합니다.두 번째 클래스는 첫 번째 클래스에서 좋은 작업을 수행하는 데 의존합니다. 그렇지 않으면 두 번째 클래스가 실패하고 그 다음 세 번째 클래스도 실패합니다. – rapadura

+1

"두 번째 클래스는 첫 번째 클래스에서 좋은 작업을 수행하는 데 의존합니다."즉, 두 번째 클래스의 유효한 입력 데이터를 설정하는 유일한 방법은 첫 번째 클래스를 사용하는 것이고 수업. 클래스간에 흐르는 데이터를 새 클래스로 추상화 해보십시오.이 클래스는이 세 클래스가 처리하는 대상의 종류를 설명합니다. 'Load','Transform','Perform'과 같은 프로 시저 이름을 가진 클래스는 디자인 문제가 있음을 나에게 시사합니다. – Raedwald

1

좋은 예제처럼 들리 겠지만 종속성이 유용 할 때마다 매번 객체를 재생성 할 필요가 없습니다. 그 위에는 이전 단계에서 생성 된 실제 출력을 사용하므로 통계 (항상 코드 냄새)를 사용할 필요가 없습니다.

의 JUnit 종속성을 지원하지만 TestNG 수행하지 않습니다 transform()가 실패 할 경우, 최종 보고서는 "1 Passed (load), 1 Failed (transform) and 1 Skipped (perform)"을 말할 것이다

@Test 
public void load() { ... } 

@Test(dependsOnMethods = "load") 
public void transform() { ... } 


@Test(dependsOnMethods = "transform") 
public void perform() { ... } 

, 당신은 어디에서 찾아야하는지 정확히 알고있다.

관련 문제