Unit testing 手动创建JUnit结果对象 < >执行自动UI测试时,我触发测试(为了这个问题,请考虑给定的方法)。

Unit testing 手动创建JUnit结果对象 < >执行自动UI测试时,我触发测试(为了这个问题,请考虑给定的方法)。,unit-testing,testing,junit,junit4,Unit Testing,Testing,Junit,Junit4,我仍然希望将此过程封装到JUnit runner中,以便与使用不同云服务或本地执行的运行保持一致。我用Maven执行测试 mvn clean install -Dtest=TestRunner -Dproperties=/path/to/settings.file 我希望无论使用哪个测试提供者,这个流都是一致的 我想出的解决办法是在本地机器上触发类似这样的测试: @Override public void run(RunNotifier notifier) { if (someCondit

我仍然希望将此过程封装到JUnit runner中,以便与使用不同云服务或本地执行的运行保持一致。我用Maven执行测试

mvn clean install -Dtest=TestRunner -Dproperties=/path/to/settings.file
我希望无论使用哪个测试提供者,这个流都是一致的

我想出的解决办法是在本地机器上触发类似这样的测试:

@Override
public void run(RunNotifier notifier) {
  if (someCondition) {
    new DelegateRunner().run(notifier);
  } else {
    super.run(notifier);
  }
}
然后,
DelegateRunner
调用第三方服务,该服务触发云上的测试。如何将从该服务接收到的结果(我可以查询它们的API)映射回本地JUnit执行

RunNotifier
提供了类似
fireTestFinished
fireTestFailure
的方法,但我不确定如何构建这些方法作为参数的对象(
Result
Description
Failure
)。我怀疑我需要使用测试侦听器,但我不知道细节

从更广泛的意义上讲,当实际测试在远程机器上运行或甚至没有作为JUnit测试执行时,我可以选择哪些选项来创建JUnit测试结果?这是以前有人遇到过的用例吗。这可能有点异国情调,但我也不认为我是第一个

首先,我只想以一种不会破坏任何JUnit集成(如Maven surefire插件)的方式提供一个二进制结果—测试通过或至少一个测试失败

现在,我得到:

Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 501.287 sec


在测试失败的情况下,如何使构建失败,否则如何通过它(测试数量为1)?我可以想出一些骇人的方法,但我肯定有一个合适的。

最基本的是,只有一个测试结果,
DelegateRunner
可能是这样的:

public class DelegateRunner extends Runner {

    private Description testDescription = Description
            .createTestDescription("groupName", "testName");

    public DelegateRunner(Class<?> testClass) {
    }

    @Override
    public Description getDescription() {
        return testDescription;
    }

    @Override
    public void run(RunNotifier notifier) {
        notifier.fireTestStarted(testDescription);
        ... trigger remote test ...
        if (passed)
            notifier.fireTestFinished(testDescription);
        else
            notifier.fireTestFailure(new Failure(testDescription,
                    new AssertionError("Details of the failure")));
    }

}
(假设可以预先知道
someCondition
,并且通常需要默认的
JUnit4
runner)

正如预期的那样,Maven构建将实现这一点:

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running ...FrontRunnerTest
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.078 sec <<< FAILURE!
testName(groupName)  Time elapsed: 0.015 sec  <<< FAILURE!
java.lang.AssertionError: Details of the failure
        at so.ownrunner.DelegateRunner.run(DelegateRunner.java:28)
        at so.ownrunner.FrontRunner.run(FrontRunner.java:27)
        at ...

Results :

Failed tests:   testName(groupName): Details of the failure

Tests run: 1, Failures: 1, Errors: 0, Skipped: 0

事实上,
addChild()
并不重要,但如果没有它,结构可能不那么明显-例如,Eclipse之类的东西将只显示
无根测试

感谢您指出
无根测试
问题。我也遇到了这个问题,应该把它包括在我最初的问题中。
public class FrontRunner extends Runner {
    private Runner runner;

    public FrontRunner(Class<?> testClass) throws InitializationError {
        if (someCondition)
            runner = new DelegateRunner(testClass);
        else
            runner = new JUnit4(testClass);
    }

    @Override
    public Description getDescription() {
        return runner.getDescription();
    }

    @Override
    public void run(RunNotifier notifier) {
        runner.run(notifier);
    }
}
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running ...FrontRunnerTest
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.078 sec <<< FAILURE!
testName(groupName)  Time elapsed: 0.015 sec  <<< FAILURE!
java.lang.AssertionError: Details of the failure
        at so.ownrunner.DelegateRunner.run(DelegateRunner.java:28)
        at so.ownrunner.FrontRunner.run(FrontRunner.java:27)
        at ...

Results :

Failed tests:   testName(groupName): Details of the failure

Tests run: 1, Failures: 1, Errors: 0, Skipped: 0
public class NestedDelegateRunner extends Runner {

    private Description suiteDescription = Description
            .createSuiteDescription("groupName");
    private Description test1Description = Description
            .createTestDescription("groupName", "test1");
    private Description test2Description = Description
            .createTestDescription("groupName", "test2");

    public NestedDelegateRunner(Class<?> testClass) {
        suiteDescription.addChild(test1Description);
        suiteDescription.addChild(test2Description);
    }

    @Override
    public Description getDescription() {
        return suiteDescription;
    }

    @Override
    public void run(RunNotifier notifier) {
        notifier.fireTestStarted(test1Description);
        notifier.fireTestStarted(test2Description);

        notifier.fireTestFinished(test1Description);
        notifier.fireTestFailure(new Failure(test2Description,
                new AssertionError("Details of the failure")));
    }

}