用Ant批量运行TestNG测试用例,并配合Reportng实现报告美化

简介: 用Ant批量运行TestNG测试用例,并配合Reportng实现报告美化

reportng 是一个简单的testng 的生成html格式报告插件,是为了取代testng 默认的生成的报告,reportng提供简单的,多彩的测试结果的视图.

1.首先安装testng

2.下载reportng jar包

http://pan.baidu.com/s/1i3KdlQH

3.添加到project

build path

注意:需要同时引入google guice  http://pan.baidu.com/s/1pJkFezT

4.配置reportng

·  禁用testng default listeners

· 在define listener中添加:org.uncommons.reportng.HTMLReporter

image.png


最后run as test suite

在html目录就能看到漂亮的report

如果咋ant里使用,需要这样 :

<testng  classpathref="runpath"  outputDir="test-output" 
            haltonfailure="true"
            useDefaultListeners="false"   
            listeners="org.uncommons.reportng.HTMLReporter,org.testng.reporters.FailedReporter" >  
            <xmlfileset dir="${basedir}" includes="Parametertestng.xml"/>
            <jvmarg value="-Dfile.encoding=UTF-8" />
            <sysproperty key="org.uncommons.reportng.title" value="AutoMation TestReport" /> 
        </testng>


如何修改自定义emailable-report.html


emailable-report.html是Testng运行完成后自动生成的,经常运行结束后我们会把这个文件作为邮件正文发送给收件人,如果我们要修改这个文件内容怎么办呢?

1、首先emailable-report.html文件的生成TestNG是实现了IReporter接口,那我们可以直接从源代码中取出这个文件源代码

https://github.com/cbeust/testng/blob/master/src/main/java/org/testng/reporters/EmailableReporter.java

2、针对源代码进行自己修改

3、把修改后的源代码加入自己的工程

4、在build.xml文件中新增自定义的监听器,运行时就会调用自定义的监听器生成想要的html文件了

<testng outputDir="test-output" classpathref="http://qa.blog.163.com/blog/runpath" haltonfailure="false" listeners="com.****.CustomerEmailableReport" > 
<xmlfileset dir="." includes="${testngxml}.xml" />
</testng>

使用Testng框架搭建自动测试框架,经常会需要增加失败自动截图,以及失败重跑功能,下面介绍一下不修改Testng的源码,通过监听器的方式来实现自动截图、重跑、以及自定义生成的Html结果文件功能。


自动截图功能


1、新建一个Java类继承TestListenerAdapter

2、重写onTestFailure、onTestSkipped等方法,在这些方法中加入截图操作

3、在testng.xml文件中配置自己编写的监听器类

<listeners>
     <listener class-name="***.testng.TestngListener" /></listeners>
public class TestngListener extends TestListenerAdapter { private static Logger logger = Logger.getLogger(TestngListener.class); public static final String CONFIG = "config.properties";
@Override public void onTestFailure(ITestResult tr) { super.onTestFailure(tr); logger.info(tr.getName() + " Failure"); takeScreenShot(tr); }
@Override public void onTestSkipped(ITestResult tr) { super.onTestSkipped(tr); logger.info(tr.getName() + " Skipped");                takeScreenShot(tr); }
@Override public void onTestSuccess(ITestResult tr) { super.onTestSuccess(tr); logger.info(tr.getName() + " Success"); }
@Override public void onTestStart(ITestResult tr) { super.onTestStart(tr); logger.info(tr.getName() + " Start"); }
@Override public void onFinish(ITestContext testContext) { super.onFinish(testContext);
}
/** * 自动截图,保存图片到本地以及html结果文件中 * * @param tr */ private void takeScreenShot(ITestResult tr) { SimpleDateFormat formatter = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss"); String mDateTime = formatter.format(new Date()); String fileName = mDateTime + "_" + tr.getName(); String filePath = OrangeiOS.driver.getScreenshotAs(fileName); Reporter.setCurrentTestResult(tr); Reporter.log(filePath);
               //这里实现把图片链接直接输出到结果文件中,通过邮件发送结果则可以直接显示图片 Reporter.log("<img src=\"../" + filePath + "\"/>");
}


失败自动重跑功能


1、新建Java类实现IRetryAnalyzer接口

public class TestngRetry implements IRetryAnalyzer { private static Logger logger = Logger.getLogger(TestngRetry.class); private int retryCount = 1; private static int maxRetryCount; private static ConfigReader config; static {
//外围文件配置最大运行次数
config = new ConfigReader(TestngListener.CONFIG); maxRetryCount = config.getMaxRunCount(); logger.info("maxRunCount=" + (maxRetryCount)); }
@Override public boolean retry(ITestResult result) {
if (retryCount <= maxRetryCount) {
String message = "running retry for  '" + result.getName() + "' on class " + 
                                       this.getClass().getName() + " Retrying " + retryCount + " times"; logger.info(message); Reporter.setCurrentTestResult(result);
Reporter.log("RunCount=" + (retryCount + 1));
retryCount++; return true; } return false;
}
}


2、新建Java类实现IAnnotationTransformer接口

public class RetryListener implements IAnnotationTransformer {
@Override public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) { IRetryAnalyzer retry = annotation.getRetryAnalyzer();
        if (retry == null) {            
annotation.setRetryAnalyzer(TestngRetry.class); 
 }
}
}


3、在build.xml或者testng.xml文件中添加RetryListener监听器

上面三步就可以实现失败自动重跑了,是不是比较方便,不过添加了重跑功能后会发现测试结果的邮件中用例的个数增加了,比如我只有一个用例,失败重跑了2次,一共运行3次,测试结果中显示的用例个数会是3个,那接下来就需要解决这个问题了。


首先解决TestNg生成的index.html文件中个数不对的问题,这个问题只需要在Testng监听器的onFinish方法中,等所有用例运行完之 后,检查用例,按照class+method+dataprodiver的名称生成hashcode获取唯一id,如果fail的用例中存在重复的则在 fail的用例中剔除掉,具体代码如下:

@Override public void onFinish(ITestContext testContext) {
  super.onFinish(testContext);
// List of test results which we will delete later
ArrayList<ITestResult> testsToBeRemoved = new ArrayList<ITestResult>();
// collect all id's from passed test Set<Integer> passedTestIds = new HashSet<Integer>();
for (ITestResult passedTest : testContext.getPassedTests().getAllResults()) {
logger.info("PassedTests = " + passedTest.getName());
 passedTestIds.add(getId(passedTest));
}
Set<Integer> failedTestIds = new HashSet<Integer>();
for (ITestResult failedTest : testContext.getFailedTests().getAllResults()) {
logger.info("failedTest = " + failedTest.getName());
// id = class + method + dataprovider int failedTestId = getId(failedTest);
// if we saw this test as a failed test before we mark as to be deleted
// or delete this failed test if there is at least one passed version if (failedTestIds.contains(failedTestId) || passedTestIds.contains(failedTestId)) {
testsToBeRemoved.add(failedTest);
 } else { failedTestIds.add(failedTestId); } }
// finally delete all tests that are marked
for (Iterator<ITestResult> iterator = testContext.getFailedTests().getAllResults().iterator(); iterator.hasNext();) {
ITestResult testResult = iterator.next();
if (testsToBeRemoved.contains(testResult)) {
  logger.info("Remove repeat Fail Test: " + testResult.getName());
  iterator.remove(); } }
}
private int getId(ITestResult result) {
int id = result.getTestClass().getName().hashCode();
  id = id + result.getMethod().getMethodName().hashCode();
  id = id + (result.getParameters() != null ? Arrays.hashCode(result.getParameters()) : 0);
  return id;
}


当前失败重跑也存在一些小问题:

1、setup中出现的错误直接是skip的,不会重跑

2、如果存在dataprodiver,则第二组数据以后的用例是不会重跑的

3、testng自带生成的emailable-report.html文件中用例的个数也不对了,这个问题可以自行修改EmailableReporter.java文件


相关文章
|
7月前
|
Java 测试技术 Python
《手把手教你》系列基础篇(八十)-java+ selenium自动化测试-框架设计基础-TestNG依赖测试-番外篇(详解教程)
【6月更文挑战第21天】本文介绍了TestNG中测试方法的依赖执行顺序。作者通过一个实际的自动化测试场景展示了如何设计测试用例:依次打开百度、搜索“selenium”、再搜索“selenium+java”。代码示例中,`@Test`注解的`dependsOnMethods`属性用于指定方法间的依赖,确保执行顺序。如果不设置依赖,TestNG会按方法名首字母排序执行。通过运行代码,验证了依赖关系的正确性。
77 4
|
2月前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
206 1
|
3月前
|
测试技术 Python
自动化测试项目学习笔记(一):unittest简单运行(初始化,清除,设置测试行为)
本文介绍了Python的unittest框架的基础用法,包括测试初始化(setup)、清除(tearDown)函数的使用,以及assertEqual和assertGreaterEqual等断言方法,并展示了如何创建测试用例,强调了测试函数需以test_开头才能被运行。
73 1
自动化测试项目学习笔记(一):unittest简单运行(初始化,清除,设置测试行为)
|
3月前
|
SQL 分布式计算 NoSQL
大数据-170 Elasticsearch 云服务器三节点集群搭建 测试运行
大数据-170 Elasticsearch 云服务器三节点集群搭建 测试运行
64 4
|
5月前
|
Cloud Native 数据处理
项目环境测试问题之当异步任务在运行过程中抛出非预期的异常会导致后果如何解决
项目环境测试问题之当异步任务在运行过程中抛出非预期的异常会导致后果如何解决
|
6月前
|
Java 测试技术 数据库
单元测试问题之LoginServiceImpl以避免对IpUtil的依赖问题如何解决
单元测试问题之LoginServiceImpl以避免对IpUtil的依赖问题如何解决
|
5月前
|
Linux C#
【Azure App Service】C#下制作的网站,所有网页本地测试运行无误,发布至Azure之后,包含CHART(图表)的网页打开报错,错误消息为 Runtime Error: Server Error in '/' Application
【Azure App Service】C#下制作的网站,所有网页本地测试运行无误,发布至Azure之后,包含CHART(图表)的网页打开报错,错误消息为 Runtime Error: Server Error in '/' Application
|
6月前
|
测试技术 持续交付
单元测试问题之确保单元测试自动化运行中的问题如何解决
单元测试问题之确保单元测试自动化运行中的问题如何解决
|
6月前
|
SQL DataWorks Java
DataWorks操作报错合集之在本地任务和冒烟测试中可以正常运行,但在调度任务中报错,是什么原因
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
6月前
|
XML 测试技术 数据格式
《手把手教你》系列基础篇(八十五)-java+ selenium自动化测试-框架设计基础-TestNG自定义日志-下篇(详解教程)
【7月更文挑战第3天】TestNG教程展示了如何自定义日志记录。首先创建一个名为`TestLog`的测试类,包含3个测试方法,其中一个故意失败以展示日志。使用`Assert.assertTrue`和`Reporter.log`来记录信息。接着创建`CustomReporter`类,继承`TestListenerAdapter`,覆盖`onTestFailure`, `onTestSkipped`, 和 `onTestSuccess`,在这些方法中自定义日志输出。
63 6