有没有办法让Eclipse多次运行JUnit测试直到失败?
我们偶尔会在每次X次运行中出现一次错误。 在人们检查内容(它自动为JUnit)之前,我们的开发人员需要通过Eclipse在本地传递JUnit。
是否有一些方便的方法(内置或高质量的插件)使Eclipse运行X次相同的测试并在出现故障时停止? 只需单击Run X次的替代方法?
请注意,我正在寻找UI中的内容(例如,右键单击并说“Run X times”而不是“Run”)。
如果for循环有效,那么我同意nos。
如果您需要重复整个setup-test-teardown,那么您可以使用TestSuite:
- 右键单击包含要重复的测试的包
- 转到New并选择创建JUnit测试SUITE
- 确保仅选择要重复的测试并单击完成。
- 编辑文件以多次运行它。
在文件中,您只需找到
addTestSuite(YourTestClass.class)
line,并将其包装在for循环中。
我很确定你可以使用addTest而不是addTestSuite来让它只从该类运行一个测试,如果你只想重复一个测试方法。
如果您真的想在失败前运行测试类,则需要自己的跑步者。
@RunWith(RunUntilFailure.class) public class YourClass { // .... }
可以按如下方式实施……
package com.example; import org.junit.internal.runners.*; import org.junit.runner.notification.*; import org.junit.runner.*; public class RunUntilFailure extends Runner { private TestClassRunner runner; public RunUntilFailure(Class> klass) throws InitializationError { this.runner = new TestClassRunner(klass); } @Override public Description getDescription() { Description description = Description.createSuiteDescription("Run until failure"); description.addChild(runner.getDescription()); return description; } @Override public void run(RunNotifier notifier) { class L extends RunListener { boolean fail = false; public void testFailure(Failure failure) throws Exception { fail = true; } } L listener = new L(); notifier.addListener(listener); while (!listener.fail) runner.run(notifier); } }
…发布未经测试的代码,感觉TDD内疚:)
我知道它没有直接回答这个问题,但是如果测试没有在每次运行时都没有通过,那么它就是一种称为不稳定测试的测试气味。 有几种可能的原因(来自xUnit测试模式 ):
- 互动测试
- 互动测试套件
- 孤独的考验
- 资源泄漏
- 资源乐观
- 不可重复的测试
- 试运行战争
- 不确定性测试
xUnit测试模式的第16章介绍了每个细节。
这是我写的一篇文章,其中显示了使用代码示例重复运行测试的几种方法: http : //codehowtos.blogspot.com/2011/04/run-junit-test-repeatedly.html
您可以使用@Parametrized运行器,或使用post中包含的特殊运行器。还有对@Retry实现的引用
根据@ akuhn的回答,这是我想出的 – 而不是永远运行,这将运行50次或直到失败,以先到者为准。
package com.foo import org.junit.runner.Description; import org.junit.runner.Runner; import org.junit.runner.notification.Failure; import org.junit.runner.notification.RunListener; import org.junit.runner.notification.RunNotifier; import org.junit.runners.BlockJUnit4ClassRunner; import org.junit.runners.model.InitializationError; public class RunManyTimesUntilFailure extends Runner { private static final int MAX_RUN_COUNT = 50; private BlockJUnit4ClassRunner runner; @SuppressWarnings("unchecked") public RunManyTimesUntilFailure(final Class testClass) throws InitializationError { runner = new BlockJUnit4ClassRunner(testClass); } @Override public Description getDescription() { final Description description = Description.createSuiteDescription("Run many times until failure"); description.addChild(runner.getDescription()); return description; } @Override public void run(final RunNotifier notifier) { class L extends RunListener { boolean shouldContinue = true; int runCount = 0; @Override public void testFailure(@SuppressWarnings("unused") final Failure failure) throws Exception { shouldContinue = false; } @Override public void testFinished(@SuppressWarnings("unused") Description description) throws Exception { runCount++; shouldContinue = (shouldContinue && runCount < MAX_RUN_COUNT); } } final L listener = new L(); notifier.addListener(listener); while (listener.shouldContinue) { runner.run(notifier); } } }
可以使用TestRule
实现这样的循环(因为JUnit 4.9)
一个非常简单的实现,每次运行10次:
import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; public class SimpleRepeatRule implements TestRule { private static class SimpleRepeatStatement extends Statement { private final Statement statement; private SimpleRepeatStatement(Statement statement) { this.statement = statement; } @Override public void evaluate() throws Throwable { for (int i = 0; i < 10; i++) { statement.evaluate(); } } } @Override public Statement apply(Statement statement, Description description) { return new SimpleRepeatStatement(statement); } }
用法:
public class Run10TimesTest { @Rule public SimpleRepeatRule repeatRule = new SimpleRepeatRule(); @Test public void myTest(){...} }
有关基于注释的更有用的实现 ,定义了必须执行的测试方法,请经常查看此博客: http : //www.codeaffine.com/2013/04/10/running-junit-tests-repeatedly -without-循环/
我不相信有一个内置的方式让junit完全按照你的要求去做。
如果多次运行产生不同的结果,您应该对该情况进行unit testing测试。 可能就像在相关测试用例中运行for循环一样简单。
- 如何在selenium上传多个文件?
- 如何使用Eclipse JFace中的IDecorationContext api
- eclipse中的Maven错误(pom.xml):无法转移org.apache.maven.plugins:maven-surefire-plugin:pom:2.12.4
- RuntimeException:在注册表中找不到应用程序“”。
- Eclipse无法识别JVM 1.8
- java eclipse创建可执行jar
- intellij-idea系统找不到指定的文件,
- maven-jaxb2-plugin用于多个模式的VS jaxb2-maven-plugin
- 修复Eclipse java引用数据库损坏?