之前兩個章節已經寫完再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安裝的過程中,可能會需要翻牆下載某些模塊
監聽中配置,將測試數據寫入到數據庫中,紅色字體為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/#/
就不上貼圖了。大家自己去看。