TestNG Listeners:使用XML,使用Annotation失败

时间:2015-07-31 00:49:57

标签: java testng

我正在尝试向我的TestNG测试类添加一个Listener。

听众MyListener是:

package somepackage.util;
import org.testng.ITestContext;
import org.testng.TestListenerAdapter;

public class MyListener extends TestListenerAdapter {
    @Override
    public void onFinish(ITestContext testContent) {
        System.out.println("onFinish");
    }
}

对于测试类SimpleTest,我有:

package somepackage;

import somepackage.util.MyListener;
import org.testng.Assert;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;

@Listeners({ MyListener.class })
public class SimpleTest {
    @Test
    public void test() {
        System.out.println("Running test...");
        Assert.assertTrue(true);
    }
}

XML是:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

<suite name="SomeTests">
    <listeners>
        <!--listener class-name="somepackage.util.MyListener" /-->
    </listeners>
    <test name="SimpleTest">
        <classes>
            <class name="somepackage.SimpleTest" />
        </classes>
    </test>
</suite>

输出是(很多路径切割):

<snip>
[Parser] Running:
   <snip>/test.xml
Running test...

===============================================
SomeTests
Total tests run: 1, Failures: 0, Skips: 0
===============================================

Process finished with exit code 0

当我将XML中的注释更改为实际元素时:

<listener class-name="somepackage.util.MyListener" />

有效:

<snip>
[Parser] Running:
   <snip>/test.xml
Running test...
onFinish

===============================================
SomeTests
Total tests run: 1, Failures: 0, Skips: 0
===============================================

Process finished with exit code 0

在XML工作正常的情况下,为什么会忽略Annotation的任何想法?我可以使用XML,但我也希望能够使用注释。

如果重要,我正在使用IntelliJ IDEA 14和Java 7运行测试。

2 个答案:

答案 0 :(得分:2)

问题是依赖性问题。在我的pom.xml中,我依赖于一些本身依赖于TestNG 5.11的类。这个工作非常好,直到我发现我无法使用@Listeners注释。

使用命令

mvn dependency:tree

我能够弄清楚我有错误的依赖关系。为了摆脱它们,我必须根据TestNG 5.11更改工件周围的pom.xml

<dependency>
    <groupId>some.group.id</groupId>
    <artifactId>the.artifact.id</artifactId>
    <vers‌​ion>1.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.testng</groupId>
            <artifactId>‌​testng</artifactId>
        </exclusion>
    </exclusions>
</dependency>

之后,正确的TestNG依赖工作正常,我可以使用我的Listener。

旁注:例如,对于从5.11到6.9.6的版本,retryAnalyzers和Listeners的调用发生了显着变化,我猜它已经这么做了很多次。例如,关于STO处理&#34;如何修复最终通过&#34;的重试测试的报告,有很多问题。 - 我发现这些方法都不适合我,所以我自己想出了一个。这与问题并不完全相关,但我只是希望您确保仔细检查是否按预期调用了侦听器和分析器,并在修复依赖项后按预期工作。

答案 1 :(得分:0)

使用网络驱动程序测试失败时拍摄屏幕截图的示例

public class DriverEventListener extends TestListenerAdapter {


    @Override
    public void onTestFailure(ITestResult testResult) {
        if(testResult.getInstance() instanceof  AutomationSupport){
        AutomationSupport instance = (AutomationSupport) testResult.getInstance();
        Driver driver = instance.getDriver();
        File scrFile = ((TakesScreenshot) driver.getDriver()).getScreenshotAs(OutputType.FILE);
        String name = testResult.getMethod().getMethodName()+"__"+System.currentTimeMillis();
        try {
            FileUtils.copyFile(scrFile, new File("\\\\127.0.0.1\\MetadorScreenShot\\\\"+name+".jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        }

    }

    @Override
    public void onTestSuccess(ITestResult testResult) {
        super.onTestSuccess(testResult);
    }



}