考虑以下设置:
1)一个Jenkins节点J
来运行测试套件的Java代码
2)两个测试套件a
& b
。
3)两个硒网格A
& B
。
4)一个FTP服务器F
将屏幕截图托管在为每次执行唯一命名的单独文件夹中aa
和bb
。
假设我们同时运行两个套件。
J
在网格a
上运行套件A
,并应在f:\aa
中保存屏幕截图。
J
在网格b
上运行套件B
,并应在f:\bb
中保存屏幕截图。
实际发生的情况:在只有套件a
正在运行的时间内,a的屏幕截图仅保存在f:\aa
中。在仅b
套件运行期间,屏幕截图仅保存在f:\bb
中。但是在两个套件运行期间,套件a
的屏幕截图都保存在 f:\aa
和 f:\bb
中反之亦然。
代码中没有任何内容可以直接暗示为什么会发生这种情况,但我可能会猜测 - onTestFailure()
侦听器在任何给定时间监听J
上JVM中发生的所有事件,因此a
的听众会发现b
中发生的失败,反之亦然。但这并不能完全解答ITestResult
未正确识别套件/输出文件夹的原因。
受此问题影响的两个文件夹 (从下午5:04和下午5:06开始):
f:\Smoke_chrome_2017-01-03-17-06-53_rnd_866/Smoke/screenshot
f:\Smoke_chrome_2017-01-03-17-04-37_rnd_444/Smoke/screenshot
有没有办法解决这个问题,以改善同步测试执行的结果?
我们的屏幕截图保存代码的简化版本:
class TestCaseListener {
@Override
public void onTestFailure(ITestResult result) {
super.onTestFailure(result);
TakesScreenshot driver = getDriver(~);
File screenshot = driver.getScreenshotAs(FILE);
FileUtils.copyFile(screenshot, new File(getFilePath(result)));
}
private String getFilePath(ITestResult result) {
String fileName = foo(result);
String outputDirectory = result.getTestContext().getOutputDirectory()
+sep + SCREENSHOT_FOLDER;
return outputDirectory + sep + fileName;
}
}
编辑:示例测试套件XML文件:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Smoke" parallel="methods" thread-count="28" configfailurepolicy="continue" preserve-order="true">
<test name="Smoke">
<groups>
<run>
<include name="SMOKE" />
</run>
</groups>
<classes>
<class name="FooTest"/>
</classes>
</test>
<listeners>
<listener class-name="~RetryListener"></listener>
<listener class-name="~TestCaseListener"></listener>
<listener class-name="~SuiteListener"></listener>
</listeners>
</suite>
(我认为套件可能都在其XML文件中被命名为“冒烟”。)