명령 줄을 사용하여 JUnit 클래스에서 단일 테스트 실행


95

명령 줄과 자바 만 사용하여 JUnit 클래스에서 단일 테스트를 실행할 수있는 접근 방식을 찾으려고합니다.

다음을 사용하여 클래스에서 전체 테스트 세트를 실행할 수 있습니다.

java -cp .... org.junit.runner.JUnitCore org.package.classname

제가 정말로하고 싶은 것은 다음과 같습니다.

java -cp .... org.junit.runner.JUnitCore org.package.classname.method

또는:

java -cp .... org.junit.runner.JUnitCore org.package.classname#method

JUnit 주석을 사용하여이 작업을 수행하는 방법이있을 수 있지만 테스트 클래스의 소스를 수동으로 수정하지 않는 것이 좋습니다 (이 작업을 자동화하려고 시도 함). 나는 또한 Maven이 이것을 할 수있는 방법을 가지고 있다는 것을 알았지 만, 가능하다면 Maven에 의존하는 것을 피하고 싶다.

그래서 이것을 할 방법이 있는지 궁금합니다.


내가 찾고있는 요점 :

  • JUnit 테스트 클래스에서 단일 테스트를 실행하는 기능
  • 명령 줄 (JUnit 사용)
  • 테스트 소스 수정 방지
  • 추가 도구 사용 방지

4
멋지다. 또 다른 "Unix는 나의 IDE"유형 애호가. 나는 에디터 (특히 NetBeans 용 vim 플러그인)에 IDE를 사용하는 것을 좋아하지만, "영원히"지속되고 임의의 구성으로 조합 할 수있는 작고 예리한 도구가 계속되는 난해한 기능을 지속적으로 재 학습하는 것보다 낫다는 데 동의합니다. 일련의 IDE 브랜드 및 버전. 잘 됐네요!
Roboprog 2012

2
당신은 maven을 피하고 싶다고 말했습니다. 여기 모습을 볼 수 받는다는 사용하여이 작업을 수행하고자하는 사람들을위한 maven.apache.org/plugins/maven-surefire-plugin/examples/...
reevesy

답변:


79

사용자 정의 베어 본 JUnit 러너를 상당히 쉽게 만들 수 있습니다. 다음은 다음과 같은 형식으로 단일 테스트 메서드를 실행하는 것입니다 com.package.TestClass#methodName.

import org.junit.runner.JUnitCore;
import org.junit.runner.Request;
import org.junit.runner.Result;

public class SingleJUnitTestRunner {
    public static void main(String... args) throws ClassNotFoundException {
        String[] classAndMethod = args[0].split("#");
        Request request = Request.method(Class.forName(classAndMethod[0]),
                classAndMethod[1]);

        Result result = new JUnitCore().run(request);
        System.exit(result.wasSuccessful() ? 0 : 1);
    }
}

다음과 같이 호출 할 수 있습니다.

> java -cp path/to/testclasses:path/to/junit-4.8.2.jar SingleJUnitTestRunner 
    com.mycompany.product.MyTest#testB

JUnit 소스를 간략히 살펴본 후 JUnit이 기본적으로이를 지원하지 않는다는 결론에 도달했습니다. IDE에는 모두 다른 작업 중에서 커서 아래에서 테스트 메서드를 실행할 수있는 사용자 지정 JUnit 통합이 있기 때문에 이것은 나에게 문제가되지 않았습니다. 명령 줄에서 직접 JUnit 테스트를 실행 한 적이 없습니다. 나는 항상 IDE 또는 빌드 도구 (Ant, Maven)가 처리하도록했습니다. 특히 기본 CLI 진입 점 (JUnitCore)은 테스트 실패시 0이 아닌 종료 코드 이외의 결과 출력을 생성하지 않기 때문입니다.

참고 : JUnit 버전> = 4.9의 경우 클래스 경로에 hamcrest 라이브러리가 필요합니다.


2
사실, 나는 테스트에서 어설 션이 실패했을 때 로그에 전체 스택 추적을 얻는 것을 기억하는 것 같으며, 실현되지 않은 기대를 설명하는 각 어설 션에서 (선택적, 정의 된 경우) 메시지를 얻었습니다. 해결 방법에 감사드립니다.
Roboprog 2012

48

저는 Maven을 사용하여 프로젝트를 빌드하고 SureFire maven 플러그인을 사용하여 junit 테스트를 실행합니다. 이 설정이 있으면 다음을 수행 할 수 있습니다.

mvn -Dtest=GreatTestClass#testMethod test

이 예에서는 "GreatTestClass"클래스 내에서 "testMethod"라는 테스트 메서드를 실행합니다.

자세한 내용은 http://maven.apache.org/surefire/maven-surefire-plugin/examples/single-test.html을 확인하세요 .


-2

우리는 IntelliJ를 사용했고 그것을 알아 내기 위해 많은 시간을 보냈습니다.

기본적으로 두 단계로 구성됩니다.

1 단계 : 테스트 클래스 컴파일

% javac -cp .:"/Applications/IntelliJ IDEA 13 CE.app/Contents/lib/*" SetTest.java

2 단계 : 테스트 실행

% java -cp .:"/Applications/IntelliJ IDEA 13 CE.app/Contents/lib/*" org.junit.runner.JUnitCore SetTest


6
이것은 하나의 테스트가 아닌 클래스의 모든 테스트를 실행합니다.
Robber
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.