手动创建JUnit结果对象

时间:2019-04-25 06:03:19

标签: unit-testing testing junit junit4

要执行自动UI测试,我在an external cloud service which requires the upload of our test suite上触发了测试(出于这个问题的目的,请考虑使用给定的方法)。

我仍然希望将此过程封装到JUnit运行器中,以与利用不同云服务或本地执行的运行保持一致。我用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提供的方法类似于fireTestFinishedfireTestFailure,但我不确定如何构建对象(ResultDescription,{{ 1}})这些方法作为参数。我怀疑我需要利用测试侦听器,但是我无法弄清楚细节。

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

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

现在,我得到:

Failure

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

如果测试失败,如何使构建失败并以其他方式通过(测试数量为1)?我可以想到一些骇人听闻的方法,但我敢肯定有一种适当的方法。

1 个答案:

答案 0 :(得分: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")));
    }

}

然后getDescription()run()都需要包装:

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);
    }
}

(假设可以预先知道someCondition,而通常只是默认的JUnit4运行者)。

这将按预期进行到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

然后,如果需要更结构化的响应,则Description.addChild()可用于嵌套套件和/或测试,例如:

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")));
    }

}

实际上addChild()并不是至关重要的,但如果没有它,结构就不太明显-例如诸如Eclipse之类的内容只会显示Unrooted tests