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.