testNG.xmlが待機するように設定しました
レポート\テスト出力パス
代码执行如下:
インポートのjava.io.File;
インポートのjava.util.Calendar;
輸入はjava.util.Comparator。
輸入java.util.Date;
輸入はjava.util.List;
輸入java.util.Map;
輸入java.util.Set;
輸入java.util.TreeSet。
輸入org.testng.IReporter。
輸入org.testng.IResultMap;
輸入org.testng.ISuite。
輸入org.testng.ISuiteResult;
輸入org.testng.ITestContext;
輸入org.testng.ITestResult;
輸入org.testng.Reporter。
輸入org.testng.xml.XmlSuite。
輸入com.aventstack.extentreports.ExtentReports。
輸入com.aventstack.extentreports.ExtentTest;
輸入com.aventstack.extentreports.ResourceCDN;
輸入com.aventstack.extentreports.Status。
輸入com.aventstack.extentreports.model.TestAttribute。
輸入com.aventstack.extentreports.reporter.ExtentHtmlReporter。
輸入com.aventstack.extentreports.reporter.configuration.ChartLocation。
パブリッククラスExtentTestNGIReporterListenerはIReporter {実装
=「テスト出力/」プライベート静的最終的な文字列をOUTPUT_FOLDER。
プライベート静的最終文字列のFILE_NAME =「report.htmlを」;
プライベートExtentReports程度;
@Override
公共ボイドgenerateReport(一覧<XmlSuite> xmlSuites、リスト<ISuite>スイート、文字列OUTPUTDIRECTORY){
//给程度初始化、设置初值
initExtent()。
ブールcreateSuiteNode =偽;
IF(suites.size()> 1){
createSuiteNode = trueに;
}
(iSUITEスイート:スイート)用{
地図<文字列、ISuiteResult> suite.getResultsは=()は、結果、
いかなるユース・ケース・スイートが存在しない場合、スキップ// 、生成されたレポートではない
IF(result.size()== 0){
;続行
}
//スイート下成功、失敗統計、ケースの総数をスキップして
INT suiteFailSize = 0;
int型suitePassSize = 0;
INT = 0 suiteSkipSizeを;
ExtentTest suiteTest = NULL;
存在する場合は、試験結果の複数//スイートは、ノードを作成し、クラスとして分類の同じスイートで報告されています。
IF(createSuiteNode){
。suiteTest = extent.createTest(suite.getName())assignCategory(suite.getName());
}
偽のブール= createSuiteResultNode;
IF(result.size()> 1){
createSuiteResultNode = trueに;
}
R&LT ISuiteResult(のために:結果.values()){
ExtentTest resultNode;
ITestContext r.getTestContextコンテキスト=();
IF(createSuiteResultNode){
場合//作成されていないスイートは、ノードのSuiteResult、またはスイートの子ノードの作成を作成します。
IF(suiteTest == NULL){
resultNode = extent.createTest(r.getTestContext()のgetName());
}他{
resultNode = suiteTest.createNode(r.getTestContext()のgetName()。)。
}
}他{
resultNode = suiteTest。
}
(!resultNode = NULL)であれば{
resultNode.getModel()のsetName(suite.getName()+ ":" + r.getTestContext()のgetName()。)。
IF(resultNode.getModel()hasCategory()){
resultNode.assignCategory(r.getTestContext()のgetName()。)。
}他{
resultNode.assignCategory(suite.getName()、r.getTestContext()のgetName()。)。
}
。resultNode.getModel()setStartTime(r.getTestContext()getStartDate()。)。
。resultNode.getModel()setEndTime(r.getTestContext()getEndDate()。)。
//统计SuiteResult下的数据
。INT passSize = r.getTestContext()getPassedTests()サイズ()。
。。INT failSize = r.getTestContext()getFailedTests()サイズ()。
。。INT skipSize = r.getTestContext()getSkippedTests()サイズ()。
suitePassSize + = passSize。
suiteFailSize + = failSize。
suiteSkipSize + = skipSize。
IF(failSize> 0){
resultNode.getModel()のsetStatus(Status.FAIL)。
}
。resultNode.getModel()のsetDescription(String.Formatの( "パス:%S;失敗:%S;スキップ:%S;"、passSize、failSize、skipSize))。
}
buildTestNodes(resultNode、context.getFailedTests()、Status.FAIL)。
buildTestNodes(resultNode、context.getSkippedTests()、Status.SKIP)。
buildTestNodes(resultNode、context.getPassedTests()、Status.PASS)。
}
IF(!suiteTest = NULL){
。suiteTest.getModel()のsetDescription(String.Formatの( "パス:%S;失敗:%S;スキップ:%S;"、suitePassSize、suiteFailSize、suiteSkipSize))。
IF(suiteFailSize> 0){
suiteTest.getModel()のsetStatus(Status.FAIL)。
}
}
}
//ため(文字列S:Reporter.getOutput()){
// extent.setTestRunnerOutput(S);
//}
extent.flush();
// extent.close();
}
プライベートボイドinitExtent(){
//フォルダは、次に作成存在しない
ファイルreportDir =新しい新規ファイル(OUTPUT_FOLDER)を、
IF(!! reportDir.exists()&& reportDir .isDirectory()){
reportDir.mkdir();
}
ExtentHtmlReporter htmlReporter =新しい新しいExtentHtmlReporter(OUTPUT_FOLDER + FILE_NAME);
// TODO時間追加
htmlReporter.config()setDocumentTitle( "胡暁明テストレポートを");
。htmlReporter.config()setReportName( "胡晓明的测试报告");
htmlReporter.config()setChartVisibilityOnOpen(真)。
htmlReporter.config()setTestViewChartLocation(ChartLocation.TOP)。
// htmlReporter.config()setTheme(Theme.STANDARD)。
htmlReporter.config()setResourceCDN(ResourceCDN.EXTENTREPORTS)。
htmlReporter.config()setCSS( "node.level-1のUL {表示:なし;} .node.level-1.active UL {表示:ブロック;}。")。
エクステント=新しいExtentReports()。
extent.attachReporter(htmlReporter)。
extent.setReportUsesManualConfiguration(真の);
// TODO传入モバイル的信息
extent.setSystemInfo(、 "UUID" "?");
}
プライベート無効buildTestNodes(ExtentTest extenttest、IResultMapテスト、ステータスの状態){
//親ノードが存在する場合、親ノードは、ラベル取得
のString [] =新しい新しいStringカテゴリ[0];
IF(!extenttest = NULL){
一覧<TestAttribute> CategoryList 。= extenttest.getModel()getCategoryContext()のgetAll();.
;カテゴリー=新しい新しいString [categoryList.size()]
のための(INTインデックス= 0、インデックス<categoryList.size();インデックス++){
カテゴリ[インデックス] = categoryList.get(インデックス).getName();
}
}
ExtentTest試験;
IF(tests.size()> 0){
//調整、実施例で注文時間によってソート
セット<ITestResult> TreeSetの=新しいTreeSetの (<ITestResult>新しいコンパレータ<ITestResult>(){
@Override
公共int型の比較(ITestResult O1、O2 ITestResult){
;: - 。?。1 1 o1.getStartMillis()<o2.getStartMillis()を返す
}
});
treeSet.addAll(tests.getAllResults());
のため(ITestResultの検索結果を:TreeSetの){
オブジェクト[] =のresult.getParametersパラメータ();
文字列の名前は= "";
//パラメータの場合、パラメータは、のtoStringレポート名の組み合わせの代わりに使用されている
(オブジェクトPARAM用:パラメータ){
名前= PARAMの+。 toString();
}
IF(name.length()> 0){
IF(name.length()> 50){
= name.substring名(0.49)+ "...";
}
}他{
名前= result.getMethod()getMethodNameに();.
}
(extenttest == NULL){IF
テスト= extent.createTest(名) ;
}他{
子ノードとして作成したとき//、親ノードは検索レポートを容易にするために、同じラベルを備えています。
= extenttest.createNodeテスト(名).assignCategory(カテゴリ);
}
//test.getModel()のsetDescription(description.toString());.
//テストextent.createTest =(result.getMethod()getMethodNameに())。 ;
用(文字列グループ:result.getMethod()getGroups()。)
test.assignCategory(群)
リストの<string> outputList = Reporter.getOutput(結果)。
(文字列出力:outputList)用{
//将用例的ログ输出报告中
test.debug(出力)。
}
IF(!result.getThrowable()= NULL){
test.log(ステータス、result.getThrowable())。
}
他{
test.log(ステータス、 "テスト" + status.toString()toLowerCaseメソッド()+ "ED");
}
test.getModel()setStartTime(getTime(result.getStartMillis()))。
。test.getModel()setEndTime(getTime(result.getEndMillis()))。
}
}
}
プライベート日getTime(長いミリ秒){
カレンダーカレンダー= Calendar.getInstance();
calendar.setTimeInMillis(ミリ秒)。
calendar.getTimeを返します();
}
}