JUnit 5中的系统属性和并行测试执行

时间:2018-10-19 19:38:58

标签: java junit junit5

我们的一个类使用系统属性来加载配置文件。在特定的测试案例中,我们将此属性设置为无效值,以检查这种情况下被测类(CUT)的行为。

同一类也可用于各种集成测试中。由于我们使用的是JUnit Jupiter的parallel test execution capabilities,因此在引擎盖下使用CUT的那些集成测试中,我们正在见证比赛条件。由于系统属性有时仍然无效,因此失败了。

并行性本身是通过Maven Surefire插件全局配置的:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.0</version>
    <configuration>
        <properties>
            <configurationParameters>
                junit.jupiter.execution.parallel.enabled=true
                junit.jupiter.execution.parallel.config.dynamic.factor=1
            </configurationParameters>
        </properties>
    </configuration>
</plugin>

因此,默认情况下,所有测试都并行运行。 CUT看起来像这样:

class AttributesProviderTest {

    @Test
    @ResourceLock( value = SYSTEM_PROPERTIES, mode = READ_WRITE )
    void invalid_attributes_file_should_yield_UncheckedIOException() throws Exception {
        final Properties backup = new Properties();
        backup.putAll( System.getProperties() );

        final String attributesFile = "foo";
        System.setProperty( AttributesProvider.ATTRIBUTES_FILE_PROPERTY, attributesFile );

        assertThatThrownBy( AttributesProvider::getTestInstance )
                .isExactlyInstanceOf( UncheckedIOException.class )
                .hasMessage( "Cannot read attributes file '" + attributesFile + "'." );

        System.setProperties( backup );
    }

    // Some other tests...

}

可以看出,我们正在尝试synchronize系统属性访问。但是,如果我理解正确,那么这仅适用于其他带有@ResourceLock注释的测试,并且通常无法神奇地同步系统属性访问吗?

有没有一种方法可以解决竞赛条件(不注释所有其他测试)?一些想法:

  • 确保在开始时(或其他某种同步方式)顺序执行CUT。
  • 重构CUT并直接使用参数调用相应的文件读取方法。
  • 扔掉测试用例。

0 个答案:

没有答案