Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 同步测试套件执行期间复制的Selenium屏幕截图_Java_Selenium_Jenkins_Testng - Fatal编程技术网

Java 同步测试套件执行期间复制的Selenium屏幕截图

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中。

请考虑以下设置:

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()
侦听器在任何给定时间侦听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是否根据其所在套件的名称触发?