IT박스

Junit : 분할 통합 테스트 및 단위 테스트

itboxs 2020. 7. 10. 08:10
반응형

Junit : 분할 통합 테스트 및 단위 테스트


Junit 테스트를 상속 받았지만이 테스트 (실제로 작동하지 않는 것)는 실제 단위 테스트와 통합 테스트 (외부 시스템, db 등 필요)가 혼합되어 있습니다.

따라서 실제로 단위 테스트를 훌륭하고 신속하게 수행하고 그 후에 통합 테스트를 실행할 수 있도록 실제로 분리하는 방법을 생각하고 있습니다.

옵션은 ..

  1. 별도의 디렉토리로 분할하십시오.

  2. Junit4 (v3에서)로 이동하고 클래스에 주석을 달아 분리하십시오.

  3. 파일 명명 규칙을 사용하여 클래스가 무엇인지 (예 : AdapterATest 및 AdapterAIntergrationTest) 알 수 있습니다.

3에는 Eclipse에 "선택한 프로젝트 / 패키지 또는 폴더에서 모든 테스트 실행"옵션이 있습니다. 따라서 통합 테스트를 실행하기가 매우 어렵습니다.

2 : 개발자가 단위 테스트 클래스에서 통합 테스트 작성을 시작할 위험이 있으며 지저분 해집니다.

1 : 가장 까다로운 솔루션처럼 보이지만 내 직감은 더 나은 솔루션이 있어야한다고 말합니다.

그래서 제 질문입니다. 통합 테스트와 적절한 단위 테스트를 어떻게 분리합니까?


나는 현재 조직 정책 (및 Junit 3 레거시)으로 인해 별도의 디렉토리를 사용하고 있지만 지금은 Junit 4에 있습니다.

단위 테스트 클래스에 통합 테스트를하는 개발자에 대해서는 크게 걱정하지 않을 것입니다. 필요한 경우 코딩 표준에 규칙을 추가하십시오.

주석이나 클래스를 물리적으로 분리하는 것 외에 어떤 다른 솔루션이 있는지 알고 싶습니다.


JUnit 카테고리와 Maven을 사용하여 매우 쉽게 분할 할 수 있습니다.

이것은 단위 및 통합 테스트를 분할하여 아래에 매우 간략하게 표시됩니다.

마커 인터페이스 정의

카테고리를 사용하여 테스트를 그룹화하는 첫 번째 단계는 마커 인터페이스를 만드는 것입니다.

이 인터페이스는 통합 테스트로 실행하려는 모든 테스트를 표시하는 데 사용됩니다.

public interface IntegrationTest {}

테스트 클래스를 표시하십시오

테스트 클래스 상단에 카테고리 주석을 추가하십시오. 새 인터페이스의 이름을 사용합니다.

import org.junit.experimental.categories.Category;
@Category(IntegrationTest.class)
public class ExampleIntegrationTest{
  @Test
  public void longRunningServiceTest() throws Exception {
  }
}

메이븐 유닛 테스트 구성

이 솔루션의 장점은 사물의 단위 테스트 측면에서 실제로 변화가 없다는 것입니다.

우리는 통합 테스트를 무시하도록 구성을 maven surefire 플러그인에 추가하기 만하면됩니다.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.11</version>
  <dependencies>
   <dependency>
     <groupId>org.apache.maven.surefire</groupId>
     <artifactId>surefire-junit47</artifactId>
     <version>2.12</version>
   </dependency>
  </dependencies>
  <configuration>
    <includes>
      <include>**/*.class</include>
    </includes>
    <excludedGroups>com.test.annotation.type.IntegrationTest</excludedGroups>
  </configuration>
</plugin>

mvn clean 테스트를 수행하면 표시되지 않은 단위 테스트 만 실행됩니다.

Maven 통합 테스트 구성

다시 이것에 대한 구성은 매우 간단합니다.

통합 테스트 만 실행하려면 다음을 사용하십시오.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.11</version>
  <dependencies>
   <dependency>
     <groupId>org.apache.maven.surefire</groupId>
     <artifactId>surefire-junit47</artifactId>
     <version>2.12</version>
   </dependency>
  </dependencies>
  <configuration>
    <groups>com.test.annotation.type.IntegrationTest</groups>
  </configuration>
</plugin>

If you wrap this in a profile with id IT, you can run only the fast tests using mvn clean install. To run just the integration/slow tests, use mvn clean install -P IT.

But most often, you will want to run the fast tests by default and all tests with -P IT. If that's the case, then you have to use a trick:

<profiles>
    <profile>
        <id>IT</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <configuration>
                        <excludedGroups>java.io.Serializable</excludedGroups> <!-- An empty element doesn't overwrite, so I'm using an interface here which no one will ever use -->
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

As you can see, I'm excluding tests that are annotated with java.io.Serializable. This is necessary because the profile will inherit the default config of the Surefire plugin, so even if you say <excludedGroups/> or <excludedGroups></excludedGroups>, the value com.test.annotation.type.IntegrationTest will be used.

You also can't use none since it has to be an interface on the classpath (Maven will check this).

Notes:

  • The dependency to surefire-junit47 is only necessary when Maven doesn't switch to the JUnit 4 runner automatically. Using the groups or excludedGroups element should trigger the switch. See here.
  • Most of the code above was taken from the documentation for the Maven Failsafe plugin. See the section "Using JUnit Categories" on this page.
  • During my tests, I found that this even works when you use @RunWith() annotations to run suites or Spring-based tests.

We use Maven Surefire Plugin to run unit tests and Maven Failsafe Plugin to run integration tests. Unit tests follow the **/Test*.java **/*Test.java **/*TestCase.java naming conventions, integration tests - **/IT*.java **/*IT.java **/*ITCase.java. So it's actually your option number three.

In a couple of projects we use TestNG and define different test groups for integration/unit tests, but this is probably not suitable for you.


I would move up to Junit4 just for having it :)

You could separate them into different test suites. I don't know how they are organised in Junit3 but it should be easy in Junit4 just to build up test suites and put all the real unit tests in one of them and then use a second suite for the integration tests.

Now define a run configuration for both suites in eclipse and you can easily run a single suite. These suites also could be launched from an automated process allowing you to run the unit tests every time the source changes and maybe the integration tests (if they are really large) only once a day or once an hour.


Using IfProfileValue spring annotation makes it possible to achieve this without a maven plugin or configuration required.

Annotate the integration test classes or methods using the IfProfileValue

import org.springframework.test.annotation.IfProfileValue;

@IfProfileValue(name="test-groups", value="integration")
public class ExampleIntegrationTest{
    @Test
    public void longRunningServiceTest() throws Exception {
    }
} 

To run using unit tests only:

mvn clean test

To run using integration test and unit tests:

mvn clean test -Dtest-groups=integration

Also, "Run all test" in an IDE would run only unit test. Add -Dtest-groups=integration to VM arguments to run both integration and unit tests.


There's not one right answer. As you've explained, there are several ways to do it which will work. I've done both the file naming scheme and splitting things into different directories.

It sounds like splitting thing up into different directories might work better for you, and that seems a little clearer to me, so I'd lean towards that.

I don't think I would try annotations because that seems more fine-grained to me. Do you really want these two types of tests mixed together in the same file? I wouldn't.

참고URL : https://stackoverflow.com/questions/2606572/junit-splitting-integration-test-and-unit-tests

반응형