之前两个章节已经写完再extentreports报告插件与testng 的集成,但是发现 每次测试完后,生成的报告都要在单独发送,每个项目都有一份报告,如果项目多的话,管理起来就会很冗余。
这个给大家推荐一个extent另一个服务 extentX,这是一个web程序,可以读取数据库(mongodb、redis)中的数据,来生成报告,只要我们把测试的数据都存储在数据库中,就会看到一个很完美的集合报告。
首先,说一下服务的搭建,我这里用的是mongodb:
方法一、MongoDB & NodeJS 在同一台服务器上
- 下载安装node.js
- 下载安装mongodb
- 配置mongodb并运行
- 下载extentX,解压到某一目录
- 进入解压目录中,使用命令 npm install
- 使用命令 sails lift 启动服务
- 打开浏览器,使用 IP+端口访问服务,服务默认端口为 1337
方法二、MongoDB & NodeJS 不在同一台服务器上
其他方法同上,只需在方法一中步骤5之前执行操作,
在extentx 中配置一下mongodb 数据库的地址
配置方法如下:
- 进入extentx目录下的config 文件夹中
- 打开connections.js 文件
- 更改host 或者port 即可
extent: {
adapter: 'sails-mongo',
host: 'localhost', // change to host where MongoDB is running
port: 27017, // change toport where MongoDB is running
database: 'extent'
}
4. 后面同方法一
注:使用npm安装的过程中,可能会需要FQ下载某些模块
监听中配置,将测试数据写入到数据库中,红色字体为extent报告配置,其中extent.x(…..)为写入数据库配置。若没有此方法,请将报告插件版本升级至 2.41.1
Maven依赖:
<dependency>
<groupId>com.relevantcodes</groupId>
<artifactId>extentreports</artifactId>
<version>2.41.1</version>
</dependency>
监听代码:
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.testng.IReporter;
import org.testng.IResultMap;
import org.testng.ISuite;
import org.testng.ISuiteResult;
import org.testng.ITestContext;
import org.testng.ITestResult;
import org.testng.xml.XmlSuite;
import com.relevantcodes.extentreports.DisplayOrder;
import com.relevantcodes.extentreports.ExtentReports;
import com.relevantcodes.extentreports.ExtentTest;
import com.relevantcodes.extentreports.LogStatus;
import com.relevantcodes.extentreports.NetworkMode;
import com.relevantcodes.extentreports.ReporterType;
public class ExtentReporterNGListener implements IReporter{
private ExtentReports extent;
@Override
public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String outputDirectory){
extent = new ExtentReports("report/ExtentReport.html", //生成报告文件名
true // true为覆盖已经生成的报告,false 在已有的报告上面生成,不会覆盖旧的结果
,DisplayOrder.NEWEST_FIRST // 最新运行的用例结果在第一个
,NetworkMode.OFFLINE //online 报告的一些样式文件需从网络下载,生成的报告文件小 offline 样式及js文件不会从网络下载,生成在文件中
);
extent.x("10.202.2.1",27017);
extent.addSystemInfo("Host Name", "Anshoo");
extent.addSystemInfo("Environment", "QA");
extent.startReporter(ReporterType.DB, "report/"); //生成本地的DB数据文件
for (ISuite suite : suites) {
Map<String, ISuiteResult> result = suite.getResults();
for (ISuiteResult r : result.values()) {
ITestContext context = r.getTestContext();
buildTestNodes(context.getPassedTests(), LogStatus.PASS);
buildTestNodes(context.getFailedTests(), LogStatus.FAIL);
buildTestNodes(context.getSkippedTests(), LogStatus.SKIP);
}
}
extent.flush();
extent.close();
}
private void buildTestNodes(IResultMap tests, LogStatus status) {
ExtentTest test;
if (tests.size() > 0) {
for (ITestResult result : tests.getAllResults()) {
test = extent.startTest(result.getMethod().getMethodName());
test.setStartedTime(getTime(result.getStartMillis()));
test.setEndedTime(getTime(result.getEndMillis()));
for (String group : result.getMethod().getGroups())
test.assignCategory(group);
if (result.getThrowable() != null) {
// test.log(status, test.addScreenCapture("../img/"+result.getMethod().getMethodName()+".png"));
test.log(status, result.getThrowable());
}
else {
test.log(status, "Test " + status.toString().toLowerCase() + "ed");
}
extent.endTest(test);
}
}
}
private Date getTime(long millis) {
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(millis);
return calendar.getTime();
}
最后将此监听器添加入testng配置中,添加方法如下:
至此配置已经完毕,每次运行完测试后,请访问一下地址查看报告。
报告效果请看官方网站:
http://extentx.herokuapp.com/#/
就不上贴图了。大家自己去看。