Java 同步测试套件执行期间复制的Selenium屏幕截图
请考虑以下设置: 1) 一个Jenkins节点Java 同步测试套件执行期间复制的Selenium屏幕截图,java,selenium,jenkins,testng,Java,Selenium,Jenkins,Testng,请考虑以下设置: 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中。
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()
侦听器在任何给定时间侦听JVM中J
上发生的所有事件,因此a
的侦听器会拾取b
中发生的故障,反之亦然。但这并不能完全解释为什么ITestResult
不能正确识别套件/输出文件夹
受此问题影响的两个文件夹
(下午5:04和5:06开始):
f:\Smoke\u chrome\u 2017-01-03-17-06-53\u rnd\u 866/Smoke/screenshot
f:\Smoke\u chrome\u 2017-01-03-17-04-37\u rnd\u 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文件中可能都被命名为“smoke”)为什么不将它们分别称为smokeA和smokeB?不过,这能解决问题吗?TestNG failure listener是否根据其所在套件的名称触发?