Program Tip

자바 단위 테스트, 디렉토리 레이아웃

programtip 2020. 10. 28. 20:32
반응형

자바 단위 테스트, 디렉토리 레이아웃


Java 코드에 대한 단위 테스트 모음을 빌드 할 때 소스 코드와 관련하여 테스트 코드를 배치 할 위치에 대한 규칙이 있습니까?

예를 들어, /java여러 .java소스 파일 이 포함 된 디렉토리 가있는 경우 테스트 케이스를 /java자체에 넣거나 /java/test.

후자가 선호되는 경우 클래스 private/ protected멤버를 패키지 외부에서 사용할 수 없을 때 코드의 내부를 어떻게 테스트 합니까?


소스 코드가 자체 디렉토리 루트에 있더라도 원본 클래스와 동일한 패키지에 테스트를 넣을 수 있습니다.

PROJECT_ROOT
    +--- src/
    +----test/

당신은 클래스 선언 할 수 있습니다 com.foo.MyClass에서 src그 테스트 com.foo.MyClassTest아래를 test.

비공개 멤버에 대한 액세스와 관련하여 리플렉션사용 하여 메서드를 호출 Class.getDeclaredMethod.setAccessible하거나 (를 통해 액세스 가능성을 변경 ) testng / junit5와 같은 것을 사용하여 소스 코드 자체에 주석 기반 테스트를 추가 할 수 있습니다 (개인적으로 이것이 나쁜 생각).

java.net예를 들어 swinglabs (SVN 저장소가 꽤 느립니다) 와 같은 것들을 어떻게 구성했는지 확인하기 위해 일부 프로젝트 를 확인하는 것은 어떻습니까?


Apache Software Foundation의 표준 디렉토리 구조를 따르는 것이 좋습니다 .

module/
  src/
    main/
      java/
    test/
      java/

이렇게하면 테스트가 소스와 별도로 유지되지만 디렉터리 구조에서 동일한 수준으로 유지됩니다. Apache가 구조를 정의하는 방법을 읽어 보면 리소스, 구성 파일, 기타 언어 등을 비롯한 다른 문제를 분할하는 데 도움이된다는 것을 알 수 있습니다.

또한이 구조를 사용하면 테스트 케이스를 테스트하는 것과 동일한 패키지에 배치한다고 가정하여 단위 테스트에서 테스트중인 단위의 패키지 및 보호 수준 메서드를 테스트 할 수 있습니다. 비공개 방법 테스트에 관해서는-신경 쓰지 않을 것입니다. 공개, 패키지 또는 보호 된 다른 어떤 것이이를 호출하고 이러한 것들을 테스트하는 전체 테스트 커버리지를 얻을 수 있어야합니다.

그런데 위의 링크는 Apache의 표준 빌드 도구 인 Maven입니다. 그들이 보유한 모든 Java 프로젝트는이 표준을 준수하며 Maven으로 빌드 된 모든 프로젝트를 만났습니다.


대부분의 경우 다음과 같이 수행됩니다.

<SOME_DIR>/project/src/com/foo/Application.java
<SOME_DIR>/project/test/com/foo/ApplicationTest.java

따라서 테스트가 동일한 패키지에 있으므로 패키지 / 보호 된 기능을 계속 테스트 할 수 있습니다.

클래스 내부에서 자체적으로 선언되지 않는 한 개인 정보를 테스트 할 수 없습니다.

배송시 .class테스트가 아닌 src에 의해 생성 된 파일을 압축합니다.


실제로 프로덕션 및 테스트 프로젝트를 2 개의 개별 엔터티로 분리하는 것이 합리적이지만 두 프로젝트에서 동일한 패키지 구조를 사용합니다.

따라서 'my-project'프로젝트가있는 경우 'my-project-test'도 생성하므로 다음과 같은 디렉터리 구조가 있습니다.

my-project
  +--- src/com/foo
my-project-test
  +---test/com/foo

이 접근 방식은 테스트 코드 종속성이 프로덕션 코드를 오염시키지 않도록합니다.

개인적으로 패키지 비공개 및 보호 방법은 공개 방법뿐만 아니라 테스트해야합니다. 따라서 프로덕션 클래스와 동일한 패키지에있는 테스트 클래스를 원합니다.


이것이 우리가 설정하는 방법이며 우리는 그것을 좋아합니다.

build/
src/
test/build/
test/src/

모든 테스트 코드는 자체 빌드 디렉토리로 컴파일됩니다. 이는 실수로 프로덕션에 테스트 클래스가 포함되는 것을 원하지 않기 때문입니다.


Android Studio 에서 Java 라이브러리 모듈을 만들 때 다음과 같은 기본 클래스를 만듭니다.

[module]
   + src/main/java/[com/foo/bar]

[module].iml파일 을 살펴보면 사용할 수있는 테스트 경로와 해당 경로를 찾을 수 있습니다. 다음은 요약입니다.

<module>
  <component>
    <content>
      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
    </content>
  </component>
</module>

특히 할 수있는 일은 다음과 같은 구조를 갖는 테스트 용 디렉토리를 만드는 것입니다.

[module]
   + src/main/java/[com/foo/bar]
   + src/test/java/[com/foo/bar]

The above structure will be recognized by Android Studio and your files underneath will be included into the module.

I assume that that structure is a recommended layout for code and tests.

참고URL : https://stackoverflow.com/questions/1540324/java-unit-tests-directory-layout

반응형