简体   繁体   中英

run a junit test for a single method only

Can you run a test for a single method only, not a whole class? Ideally from the command line.

eg for a class:

public class TestClass extends Unittest {
  @Test
  public void test1_shouldbeRun() {

  }

  @Test
  public void test2_shouldNotBeRun() {

  } 
}

I only want to run the method "test1_shouldBeRun".

I do not think if that is natively supported by JUnit. However, you have some alternatives:

  1. Put the required tests in different classes so you can run them separately
  2. Maybe using the @Ignore annotation helps you.
  3. If you're using some IDE, it may support this approach. For instance in Eclipse, unfold the test class in the Package Explorer , select the method you want to run, and click Run As -> JUnit test .
  4. Here's a quite extensive tutorial on how to create a custom TestSuit and an Ant task that can make this for you.
  5. UPDATE In this thread the guys say that " The old junit.textui.TestRunner utility provides a way to run a single method on the command-line, via the runSingleMethod(), but it doesn't support JUnit4 annotated test classes. "

It is possible when you use the surefire plugin [1]:

mvn -Dtest=TestClass#test1_shouldbeRun test

[1] http://maven.apache.org/surefire/maven-surefire-plugin/examples/single-test.html

I made a post about this a little while back.

This is possible using JUnit 4 and Ant. The trick is pass the method name[s] as a property on the command line and use a different task if that property was passed.

Given this test class:

import org.junit.Test;

public class FooTests {

  @Test
  public void firstTest() {
    System.out.println("test 1");
  }

  @Test
  public void secondTest() {
    System.out.println("test 2");
  }

  @Test
  public void thirdTest() {
    System.out.println("test 3");
  }

}

Create this ant file:

<project default="test">

    <!-- Tell Ant where to find JUnit -->
    <path id="classpath.test">
        <pathelement location="junit-4.11.jar" />
        <pathelement location="hamcrest-core-1.3.jar" />
        <pathelement location="." /> <!-- or where ever your test class file is -->
    </path>
    <target name="test" description="Runs the tests">
        <!-- Set a new Ant property "use-methods" to true if the "test-methods" Ant property - which we'll pass in from the command line - exists and is not blank.-->
        <condition property="use-methods" else="false">
            <and>
                <isset property="test-methods"/>
                <not>
                    <equals arg1="${test-methods}" arg2=""/>
                </not>
            </and>
        </condition>

        <!-- Sanity check -->
        <echo message="use-methods = ${use-methods}"/>
        <echo message="test-methods = ${test-methods}"/>

        <!-- Run the tests -->
        <junit>
            <classpath refid="classpath.test" />
            <formatter type="brief" usefile="false" />
            <!-- The "if" tells JUnit to only run the test task if the use-methods property is true.-->
            <test if="${use-methods}" name="FooTests" methods="${test-methods}"/>
            <!-- The "unless" tells JUnit to not run the test task if the use-methods property is true.-->
            <test unless="${use-methods}" name="FooTests"/>
        </junit>
    </target>
</project>

Examples

Run all tests.

$ ant
Buildfile: build.xml

test:
     [echo] use-methods = false
     [echo] test-methods = ${test-methods}
    [junit] Testsuite: FooTests
    [junit] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.016 sec
    [junit]
    [junit] ------------- Standard Output ---------------
    [junit] test 3
    [junit] test 1
    [junit] test 2
    [junit] ------------- ---------------- ---------------

BUILD SUCCESSFUL
Total time: 0 seconds

Run only the second test by specifying the “test-methods” Ant property on the command line.

$ ant -Dtest-methods=secondTest
Buildfile: build.xml

test:
     [echo] use-methods = true
     [echo] test-methods = secondTest
    [junit] Testsuite: FooTests
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.009 sec
    [junit]
    [junit] ------------- Standard Output ---------------
    [junit] test 2
    [junit] ------------- ---------------- ---------------

BUILD SUCCESSFUL
Total time: 0 seconds

Run only the second and third tests.

$ ant -Dtest-methods=secondTest,thirdTest
Buildfile: build.xml

test:
     [echo] use-methods = true
     [echo] test-methods = secondTest,thirdTest
    [junit] Testsuite: FooTests
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.01 sec
    [junit]
    [junit] ------------- Standard Output ---------------
    [junit] test 3
    [junit] test 2
    [junit] ------------- ---------------- ---------------

BUILD SUCCESSFUL
Total time: 0 seconds

Jute 插件,发布在 maven central 中,该插件允许将 JUnit 测试方法作为外部分离的 Java 进程执行,您可以定义将包含和排除在测试进程中的方法,如果只定义一个测试方法作为包含则只有测试方法将被执行

不知道这是否适用于您的机器/库版本,但是在我不想测试的方法上使用private modifier对我有用

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM