当前位置: 首页 > 面试题库 >

运行JUnit @Test方法的子集

居焱
2023-03-14
问题内容

我们正在使用JUnit
4进行测试:我们的类不是的子类TestCase,并且它们的公共方法带有注释@Test。一个文件有很多@Test方法。能够通过命令行从Ant运行它们的一个子集,就像JUnit
3的本食谱一样,这将是很好的:

ant runtest -Dtest=MyTest -Dtests=testFoo,testBar

http://today.java.net/pub/a/today/2003/09/12/individual-test-
cases.html

我一直在尝试用Java反射等方法来实现此目的。由于似乎没有任何方法可以@Test在运行时“隐藏”
方法或删除其注释,因此唯一的选择似乎是使用ClassLoader的defineClass方法,这似乎相当困难。

PS在这种情况下正确的事情是将文件分割开,但是还有其他选择吗?

谢谢你的时间。


问题答案:

guerda的解决方案很好。这就是我最终要做的事情(这是我以前联系过的卢克·弗朗克食谱的混合物,还有我在网上看到的其他东西):

import org.junit.runner.manipulation.Filter;
import org.junit.runner.Description;

public final class AntCLFilter extends Filter {
    private static final String TEST_CASES = "tests";
    private static final String ANT_PROPERTY = "${tests}";
    private static final String DELIMITER = "\\,";
    private String[] testCaseNames;

    public AntCLFilter() {
        super();
        if (hasTestCases()) testCaseNames = getTestCaseNames();
    }

    public String describe() {
        return "Filters out all tests not explicitly named in a comma-delimited list in the system property 'tests'.";
    }

    public boolean shouldRun(Description d) {
        String displayName = d.getDisplayName();
        // cut off the method name:
        String testName = displayName.substring(0, displayName.indexOf('('));
        if (testCaseNames == null) return true;

        for (int i = 0; i < testCaseNames.length; i++)
            if (testName.equals(testCaseNames[i]))
                return true;
        return false;
    }

    /**
     * Check to see if the test cases property is set. Ignores Ant's
     * default setting for the property (or null to be on the safe side).
     **/
    public static boolean hasTestCases() {
        return
            System.getProperty( TEST_CASES ) == null ||
            System.getProperty( TEST_CASES ).equals( ANT_PROPERTY ) ?
            false : true;
    }

    /**
     * Create a List of String names of test cases specified in the
     * JVM property in comma-separated format.
     *
     * @return a List of String test case names
     *
     * @throws NullPointerException if the TEST_CASES property
     * isn't set
     **/
    private static String[] getTestCaseNames() {

        if ( System.getProperty( TEST_CASES ) == null ) {
            throw new NullPointerException( "Test case property is not set" );
        }

        String testCases = System.getProperty( TEST_CASES );
        String[] cases = testCases.split(DELIMITER);

        return cases;
    }
}

import org.junit.internal.runners.*;
import org.junit.runner.manipulation.Filter;
import org.junit.runner.manipulation.NoTestsRemainException;

public class FilteredRunner extends TestClassRunner {

    public FilteredRunner(Class<?> clazz) throws InitializationError {
        super(clazz);
        Filter f = new AntCLFilter();
        try {
            f.apply(this);
        } catch (NoTestsRemainException ex) {
            throw new RuntimeException(ex);
        }
    }
}

然后,我用以下注释了测试类:

@RunWith(FilteredRunner.class)
public class MyTest {

并将以下内容放入我的ant buildfile中:

<target name="runtest"
        description="Runs the test you specify on the command line with -Dtest="
        depends="compile, ensure-test-name">
    <junit printsummary="withOutAndErr" fork="yes">
        <sysproperty key="tests" value="${tests}" />
        <classpath refid="classpath" />
        <formatter type="plain" usefile="false" />
        <batchtest>
            <fileset dir="${src}">
                <include name="**/${test}.java" />
            </fileset>
        </batchtest>
    </junit>
</target>

关键行是sysproperty标签。

现在我可以跑步

ant runtest -Dtest=MyTest -Dtests=testFoo,testBar

如预期的。这适用于JUnit 4.1
—在4.4中是JUnit4ClassRunner的子类,在4.5及更高版本中是BlockJUnit4ClassRunner的子类。



 类似资料:
  • 我有一些Selenium Webdriver测试,希望使用mvn-test从命令行运行。问题是,我可以清理,构建和编译没有问题,但没有测试运行。我没有收到任何与测试有关消息,如“There are no tests to run”。 我的junit测试遵循*Test类命名约定。 编辑:好的,我发现这是一个配置文件的问题-修复!

  • 问题内容: 比方说,我有一个名为测试类有几种方法,,,等,每个注释。 现在让我们说我将子类归类为,并且我不会覆盖任何内容。目前是空的。 当我从运行测试,方法,以及因为测试运行不从类和基类的测试方法区分是通过测试运行执行。 如何强制测试运行程序放弃基类的测试? 问题答案: 重组您的测试类。 如果您不想使用基类中的测试,则不要扩展它 如果您需要基类的其他功能,请将该类一分为二-测试和其他功能

  • 我试图运行一个测试来比较用户输入的单词量是否与指定的预期长度(4)相同,但出于某种原因,我总是得到错误:“没有可运行的方法”,而显然有一个?有人能给我解释一下这是怎么回事吗?

  • 问题内容: 我通过几个测试来设置一个类,而不是使用一个我想拥有一个在所有测试之前仅执行一次的设置方法的类。Junit 4.8有可能吗? 问题答案: 尽管我同意@assylias的观点,即使用是经典的解决方案,但并不总是很方便。带有注释的方法必须是静态的。对于某些需要测试用例实例的测试而言,这非常不便。例如,基于Spring的测试可用于在Spring上下文中定义的服务。 在这种情况下,我个人使用带有

  • 我用几个测试来设置一个类,而不是使用,我希望有一个在所有测试之前只执行一次的setup方法。这在JUnit4.8中是可能的吗?

  • 问题内容: 我做了一些单元测试(在测试课中)。我读过的教程说我应该为单元测试制作一个TestSuite。 奇怪的是,当我直接运行单元测试(选择测试类- 以jUnit测试运行)时,一切都工作正常,而当我在测试套件中尝试相同的操作时,总会有一个例外:java.lang。例外:没有可运行的方法。 这是测试套件的代码: 任何想法为什么这不起作用? 问题答案: 我没有使用过蚂蚁的经验-所以我现在不使用它来测