JUnit 클래스를 특수 테스트 패키지로 분리?


118

저는 이전 질문 인 "JUnit 및 적절한 소프트웨어 엔지니어링 학습을위한 샘플 프로젝트" 에 대한 답변에서 권장 하는 Craftsman 기사 ( 주제별 아래에서 Craftsman 클릭) 를 읽고 테스트 주도 개발의 개념 을 배우고 있습니다. 나는 그것을 지금까지 좋아한다!

하지만 지금은 앉아서 직접 해보고 싶습니다. 간단한 답변 만 필요하다는 질문이 있습니다.

JUnit 테스트 클래스와 실제 코드를 어떻게 구성합니까? 나는 주로 패키지 구조에 대해 이야기하고 있지만, 다른 어떤 개념도 도움이 될 것입니다.

org.myname.project.test. *에 테스트 클래스를 넣고 org.myname.project. *에 일반 코드를 넣습니까? 시험 수업을 일반 수업과 나란히 배치합니까? 클래스 이름에 접미사를 붙이는 대신 Test를 접두사로 붙이는 것을 선호합니까?

조만간 걱정하지 말아야 할 일처럼 보이지만 저는 조직 중심적인 사람입니다. 난 거의 오히려 실제로 일을 얻는 것보다 수행하려면 무엇을 추적하는 방법을 알아내는 더 많은 시간을 소비하는 사람의 종류.

그리고 현재는 패키지로 깔끔하게 분할 된 프로젝트가 있는데 프로젝트가 엉망이되었습니다. 모든 것을 리팩토링하고 테스트를 작성하는 대신 처음부터 테스트를 새로 시작하고 싶습니다. 하지만 먼저 테스트가 어디로 가는지 알아야합니다.


편집 : 나는 Maven에 대해 완전히 잊었지만 대다수가 그것을 사용하고있는 것 같습니다! 과거에는 Maven이 저를 완전히 망가 뜨리는 특정 사용 사례가 있었지만 Ant는 내게 필요한 유연성을 제공했기 때문에 결국 Ant에 연결되었지만 잘못된 접근 방식을 취한 것 같습니다. 테스트 기반 개발과 잘 어울릴 것 같기 때문에 Maven을 다시 시도해 보겠습니다.


답변:


154

테스트 클래스를 테스트하는 프로젝트 클래스와 동일한 패키지에 넣는 것을 선호하지만 다음과 같이 다른 물리적 디렉토리에 저장합니다.

myproject/src/com/foo/Bar.java
myproject/test/com/foo/BarTest.java

Maven 프로젝트에서는 다음과 같습니다.

myproject/src/main/java/com/foo/Bar.java
myproject/src/test/java/com/foo/BarTest.java

이것의 요점은 내 테스트 클래스가 패키지 범위 클래스와 멤버에 액세스하고 테스트 할 수 있다는 것입니다.

위의 예에서 볼 수 있듯이 내 테스트 클래스에는 테스트 된 클래스의 이름과 Test접미사가 있습니다. 이것은 그것들을 빨리 찾는 데 도움이됩니다. 각각의 이름이 Test...로 시작하는 수백 개의 테스트 클래스 중에서 검색을 시도하는 것은 그리 재미 있지 않습니다 .

@Ricket의 의견에서 영감을 얻은 업데이트 :이 방식으로 테스트 클래스 (일반적으로)가 테스트 된 친구 바로 뒤에 프로젝트 별 알파벳순 클래스 이름 목록이 표시됩니다. (의식적으로 그 방법을 깨닫지 못한 채 매일 이로부터 혜택을 받고 있다는 사실이 재밌습니다 ...)

Update2 : Maven을 좋아하는 개발자 (저를 포함하여)가 많이 있지만, 적어도 그렇지 않은 개발자는 많은 것 같습니다. IMHO는 "주류"Java 프로젝트에 매우 유용합니다 (프로젝트의 약 90 %를이 범주에 넣 겠지만 나머지 10 %는 여전히 상당한 소수입니다). Maven 규칙을 받아 들일 수 있다면 사용하기 쉽습니다. 그러나 그렇지 않다면 그것은 삶을 비참한 투쟁으로 만듭니다. Maven은 매우 다른 사고 방식이 필요하기 때문에 Ant에서 사회화 된 많은 사람들에게 이해하기 어려운 것 같습니다. (Ant를 사용한 적이없는 나 자신은이 둘을 비교할 수 없습니다.) 한 가지는 확실합니다. 단위 (및 통합) 테스트를 프로세스에서 자연스럽고 일류 단계로 만들어 개발자가이 필수 관행을 채택하는 데 도움이됩니다.


6
나도 접미사에 동의합니다. 또한 테스트 클래스가 다른 물리적 폴더로 분리되어 있기 때문에 알파벳 순서 정렬을 그룹화하기 위해 Test를 접두사로 시도 할 필요가 없으며 SomeClassTest가 더 잘 읽는다고 생각합니다.
Ricket

우수한 컨벤션 +1
whiskeysierra

1
동일한 패키지에 테스트 클래스를 넣는 것에 대한 한 가지 : 패키지 전용 멤버를 사용할 수 있지만 (이 스키마를 사용하는 이유) 자동으로 가시성을 테스트 할 수는 없습니다. TDD를 사용하고 IDE에서 필요한 메서드 스텁을 생성하도록하는 경우. 패키지-개인 가시성 (NetBeans, 내가보고있는)으로 생성 할 수 있으므로 테스트를 완벽하게 통과 할 수 있지만 (실제로 해당 스텁에 구현을 넣은 후) 실제 사용에서는 실패 할 수 있습니다 (추가하는 것을 잊은 경우 public). .
Sergei Tachenov

이 규칙은 흥미롭지 만 테스트 스위트가 커지면 무엇을합니까? 예를 들어 클래스에 6 개의 메서드가 있고 각 메서드에는 10 개의 테스트가 있다고 가정 해 보겠습니다. 수업에 60 개의 테스트가 있습니까? 일반적으로 테스트 클래스를 세분화합니다 (메서드 당 하나의 테스트 클래스). 이것의 문제는 테스트 패키지에서 많은 클래스를 찾을 수 있다는 것입니다.
mmalmeida

1
Eclipse의 @Thick_propheT : 프로젝트 이름을 마우스 오른쪽 버튼으로 클릭하고 New-Other ...를 클릭 한 다음 Java 폴더 내에서 Source Folder를 선택합니다. 이름을 "test"로 지정합니다. 그런 다음 위의 규칙을 따르고 싶다면 테스트 케이스를 작성하려는 클래스의 패키지와 이름이 같은 새 패키지를이 테스트 폴더에 추가 한 다음 패키지에서 새 JUnit 테스트 케이스를 추가하십시오 (위치 : New-Other ...를 수행 할 때 Java / Junit 폴더). 이 새로운 마법사에서 당신은 클래스가 테스트되고 지정하고 "테스트"접미사와 같은 이름으로 테스트 케이스의 이름을 지정할 수 있습니다
inor

15

테스트 클래스와 동일한 패키지에 테스트 클래스를 넣었 지만 다른 소스 폴더 나 프로젝트에 넣었습니다 . 이러한 방식으로 테스트 코드를 구성하면 프로덕션 jar 파일에 테스트 코드가 포함되지 않도록 쉽게 컴파일하고 별도로 패키징 할 수 있습니다. 또한 테스트 코드가 패키지 비공개 필드 및 메서드에 액세스 할 수 있습니다.


12

나는 Maven을 사용 합니다. Maven이 추진하는 구조는 다음과 같습니다.

src/main/java/org/myname/project/MyClass.java

src/test/java/org/myname/project/TestMyClass.java

즉, 테스트중인 클래스 이름 앞에 Test가 추가 된 테스트 클래스는 주 테스트에 대한 병렬 디렉토리 구조에 있습니다.

동일한 패키지 (반드시 디렉터리는 아님)에 테스트 클래스를 포함하는 한 가지 장점은 패키지 범위 메서드를 활용하여 모의 테스트 개체를 검사하거나 삽입 할 수 있다는 것입니다.


18
나는이 있었지만 <class>Test.java,하지Test<class>.java
마이크 Rylander

2
Maven은 Maven Surefire Plugin 문서에 따라 두 패턴 중 하나를 허용합니다 .
Elijah Woodward

3
나는 주장 것 <class>Test.java조금 더 나은 것보다 그것을 만드는, IDE 검색 기능을 사용하는 경우 명명 체계는 메인 클래스와 테스트 클래스 모두 가까이 표시합니다 Test<class>.java.
christopheml

1
@christopheml 동의합니다. 그게 제가 지금하는 일입니다.
Martin

이것은 Intellij에서 작동했습니다. MyClassTest.java가 작동하지 않았습니다.
user2761431
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.