Maven Surefire 并行测试中跳过测试的非确定性行为
Non-deterministic behavior of skipped tests in parallel testing on Maven Surefire
我有一个 Maven 项目,在执行测试时具有以下预期结果 (mvn test
):
Tests run: 543, Failures: 0, Errors: 0, Skipped: 8
我正在探索 运行 这些并行测试的好处,看看我是否可以减少构建过程的总耗时。
将以下设置添加到 Surefire 后:
<parallel>methods</parallel>
<threadCount>5</threadCount>
<perCoreThreadCount>true</perCoreThreadCount>
<forkCount>3C</forkCount>
<reuseFork>true</reuseFork>
跳过的测试 的数量各不相同。请参阅下面 50 次执行的摘要:
01. Tests run: 543, Failures: 2, Errors: 176, Skipped: 8
... 34 runs with similar outputs...
35. Tests run: 543, Failures: 6, Errors: 173, Skipped: 8
36. **Tests run: 543, Failures: 2, Errors: 182, Skipped: 11**
37. **Tests run: 543, Failures: 2, Errors: 176, Skipped: 12**
38. Tests run: 543, Failures: 4, Errors: 177, Skipped: 8
39. Tests run: 543, Failures: 3, Errors: 175, Skipped: 8
40. Tests run: 543, Failures: 4, Errors: 174, Skipped: 8
41. Tests run: 543, Failures: 3, Errors: 172, Skipped: 8
42. Tests run: 543, Failures: 3, Errors: 172, Skipped: 8
43. **Tests run: 543, Failures: 2, Errors: 176, Skipped: 12**
44. Tests run: 543, Failures: 3, Errors: 176, Skipped: 8
... 5 runs with similar outputs...
50. Tests run: 543, Failures: 3, Errors: 172, Skipped: 8
虽然它发生在 3/50 的案例中,但我期望只在 Errors
和 Failures
中看到不同的数字,但在 Skipped
.
中从来没有
对这个主题有什么想法吗?提前致谢。
编辑:
- 联合版本:4.12
- 万无一失版本:2.18.1
发现:
在运行时执行时可以忽略测试:
确实,在这个特定的测试套件中有带有假设的测试:
Assume.assumeTrue(InetAddress.getAllByName(host).length > 1);
Assume.assumeNoException(x);
Assume.assumeTrue(sslContextFactory == null);
Assume.assumeNoException(x);
Assume.assumeTrue(OS.IS_LINUX);
Assume.assumeTrue(OS.IS_LINUX);
Assume.assumeTrue(!OS.IS_WINDOWS);
Assume.assumeTrue(!OS.IS_WINDOWS);
Assume.assumeThat(Integer.parseInt(nano), Matchers.greaterThan(21));
Assume.assumeTrue(false);
Assume.assumeTrue(true);
Assume.assumeTrue(false);
在这种情况下,我认为不确定性是由于 运行 并行测试时可能违反的假设。
我有一个 Maven 项目,在执行测试时具有以下预期结果 (mvn test
):
Tests run: 543, Failures: 0, Errors: 0, Skipped: 8
我正在探索 运行 这些并行测试的好处,看看我是否可以减少构建过程的总耗时。
将以下设置添加到 Surefire 后:
<parallel>methods</parallel>
<threadCount>5</threadCount>
<perCoreThreadCount>true</perCoreThreadCount>
<forkCount>3C</forkCount>
<reuseFork>true</reuseFork>
跳过的测试 的数量各不相同。请参阅下面 50 次执行的摘要:
01. Tests run: 543, Failures: 2, Errors: 176, Skipped: 8
... 34 runs with similar outputs...
35. Tests run: 543, Failures: 6, Errors: 173, Skipped: 8
36. **Tests run: 543, Failures: 2, Errors: 182, Skipped: 11**
37. **Tests run: 543, Failures: 2, Errors: 176, Skipped: 12**
38. Tests run: 543, Failures: 4, Errors: 177, Skipped: 8
39. Tests run: 543, Failures: 3, Errors: 175, Skipped: 8
40. Tests run: 543, Failures: 4, Errors: 174, Skipped: 8
41. Tests run: 543, Failures: 3, Errors: 172, Skipped: 8
42. Tests run: 543, Failures: 3, Errors: 172, Skipped: 8
43. **Tests run: 543, Failures: 2, Errors: 176, Skipped: 12**
44. Tests run: 543, Failures: 3, Errors: 176, Skipped: 8
... 5 runs with similar outputs...
50. Tests run: 543, Failures: 3, Errors: 172, Skipped: 8
虽然它发生在 3/50 的案例中,但我期望只在 Errors
和 Failures
中看到不同的数字,但在 Skipped
.
对这个主题有什么想法吗?提前致谢。
编辑:
- 联合版本:4.12
- 万无一失版本:2.18.1
发现:
在运行时执行时可以忽略测试:
确实,在这个特定的测试套件中有带有假设的测试:
Assume.assumeTrue(InetAddress.getAllByName(host).length > 1);
Assume.assumeNoException(x);
Assume.assumeTrue(sslContextFactory == null);
Assume.assumeNoException(x);
Assume.assumeTrue(OS.IS_LINUX);
Assume.assumeTrue(OS.IS_LINUX);
Assume.assumeTrue(!OS.IS_WINDOWS);
Assume.assumeTrue(!OS.IS_WINDOWS);
Assume.assumeThat(Integer.parseInt(nano), Matchers.greaterThan(21));
Assume.assumeTrue(false);
Assume.assumeTrue(true);
Assume.assumeTrue(false);
在这种情况下,我认为不确定性是由于 运行 并行测试时可能违反的假设。