在 TestExecutionListener 中获取 ParameterizedTests 的参数值

Getting the values of parameters for ParameterizedTests in TestExecutionListener

在我的测试框架中,我必须手动生成 TestSuite.xml。在 Junit4 中,监听器传递的 "Description" 对象包含参数化测试传递的参数值,因此 XML 看起来像这样。

<testcase
  11     classname="com.workday.scramble.datagen.generator.regex.generator.RegexGenTest"
  12     name="testTransformAndGenerate[77: RegexGenTest: [0-9]{1,28}]"
  13     time="9.1E-4"/>
  14   <testcase
  15     classname="com.workday.scramble.datagen.generator.regex.generator.RegexGenTest"
  16     name="testTransformAndGenerate[123: RegexGenTest: [A-Za-z0-9 -]{1,64}]"
  17     time="0.0020299999999999997"/>
  18   <testcase
  19     classname="com.workday.scramble.datagen.generator.regex.generator.RegexGenTest"
  20     name="testTransformAndGenerate[112: RegexGenTest: [A-Za-z0-9 -]{1,31}]"
  21     time="0.00171"/>
  22   <testcase
  23     classname="com.workday.scramble.datagen.generator.regex.generator.RegexGenTest"
  24     name="testTransformAndGenerate[318: RegexGenTest: \d{37}]"
  25     time="7.3E-4"/>

在 JUnit5 中,我使用 TestExecutionListener 回调,我得到的方法名称如下:

    @Override
    public void executionFinished(final TestIdentifier testIdentifier, final TestExecutionResult testExecutionResult) {
        super.executionFinished(testIdentifier, testExecutionResult);
        logWithThrowable("Execution Finished: %s - %s - %s", testExecutionResult.getThrowable().orElse(null),
                testIdentifier.getDisplayName(), testIdentifier.getUniqueId(), testExecutionResult);
        final Optional<TestSource> source = testIdentifier.getSource();
        if (source.isPresent()) {
            final TestSource testSource = source.get();
            if (testSource instanceof ClassSource) {
               ...
            }
            else if (testSource instanceof MethodSource) {
                final MethodSource methodSource = (MethodSource) testSource;
                LOG.info("MethodSource: executionFinished for class: " + methodSource.getClassName() + " and method: "
                        + methodSource.getMethodName());
                final OmsTestMethod testMethod = getOmsTestMethod(methodSource);
                if (testMethod == null) {
                    return;
                }
                testMethod.setResult(testExecutionResult);
            }
        }
    }

这个方法名不包含传入的参数,所以XML是这样的:

<testcase
 12     classname="com.workday.scramble.datagen.generator.regex.generator.RegexGenTest"
 13     name="testTransformAndGenerate"
 14     time="0.00366"/>

我将方法名称视为唯一的,因此只有一个条目。

TeamCity 按照 XML 文件中 testcase 的数量进行计算,因此报告是错误的。 SummaryGeneratingListener 有测试信息的数量,但我无法让 TeamCity 使用它。

知道怎么做吗?

我已经尝试了MethodSource中的各种API。

    @Override
    public void executionFinished(final TestIdentifier testIdentifier, final TestExecutionResult testExecutionResult) {
        super.executionFinished(testIdentifier, testExecutionResult);
        logWithThrowable("Execution Finished: %s - %s - %s", testExecutionResult.getThrowable().orElse(null),
                testIdentifier.getDisplayName(), testIdentifier.getUniqueId(), testExecutionResult);
        final Optional<TestSource> source = testIdentifier.getSource();
        if (source.isPresent()) {
            final TestSource testSource = source.get();
            if (testSource instanceof ClassSource) {
               ...
            }
            else if (testSource instanceof MethodSource) {
                final MethodSource methodSource = (MethodSource) testSource;
                LOG.info("MethodSource: executionFinished for class: " + methodSource.getClassName() + " and method: "
                        + methodSource.getMethodName());
                final OmsTestMethod testMethod = getOmsTestMethod(methodSource);
                if (testMethod == null) {
                    return;
                }
                testMethod.setResult(testExecutionResult);
            }
        }
    }

我希望看到方法名称也包含参数化值,这样我就可以区分各种测试。

如果您没有自定义显示名称,@ParameterizedTest 的显示名称应包含参数。

如果这对您来说还不够,请随时在这里提出问题:https://github.com/junit-team/junit5/issues/new/choose