TestNGの+ extentReports + log4j2完全な自動テストフレームワーク - 美しいレポートとログファイルが保存されます

1:インポートのMaven依存
<依存性>
<のgroupId> com.aventstack </のgroupId>
<たartifactId> extentreports </たartifactId>
<バージョン> 3.0.3 </バージョン>
</依存>
2:ExtentTestNGIReporterListenerリスナーの調製
ExtentTestNGIReporterListenerリスナー主HTMLReport生成するために使用されます

パッケージリスナー。

輸入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。
輸入org.testng *。;
輸入org.testng.xml.XmlSuite。

インポートのjava.io.File;
輸入java.utilの。*;

/ **
* 18/12/10にyangbinによって作成されます。
* /
publicクラスExtentTestNGIReporterListenerはIReporter {実装
//生成的路径以及文件名を
最終的な静的な文字列= OUTPUT_FOLDERプライベート「テスト-出力/」;
//のindex.htmlを使用して、それをカバーするレポートをTestNGの原因となることに注意してください
民間最終静的な文字列FILE_NAME =「report.htmlを」;

プライベートExtentReports範囲を、

@Overrideの
公共generateReportボイド(一覧<XmlSuite> xmlSuites、リスト<iSUITE>スイーツ、OUTPUTDIRECTORY文字列){
INIT();
falseにブール= createSuiteNode;
IF(suites.size()> 1){
createSuiteNode = trueに;
}
(iSUITE Suiteの:スイート){
地図<文字列、ISuiteResult> suite.getResultsは=結果();
//ないユースケーススイートが存在しない場合、スキップ、生成されたレポートではない
IF(result.size()== 0){
続行;
}
//成功、スイート、スキップを持つケースの総数の下で障害統計情報
のint suiteFailSize = 0;
suitePassSize = 0 INT;
INT suiteSkipSize = 0;
ExtentTest suiteTest = NULLを、
クラスとして分類の同じスイートで報告される試験結果の複数//スイートがある場合は、ノードを作成します。
IF(createSuiteNode){
suiteTest = extent.createTest(suite.getName())assignCategory(suite.getName());.
}
偽のブール= createSuiteResultNode;
IF(result.size()> 1){
createSuiteResultNode = trueに;
}
ため(R&LT ISuiteResult:result.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()。
}

プライベートボイドのinit(){
//文件夹不存在的话进行创建
reportDir =新しいファイル(OUTPUT_FOLDER)をファイル;
(!!reportDir.exists()&& reportDir.isDirectory()){場合
reportDir.mkdir();
}
ExtentHtmlReporter htmlReporter =新しいExtentHtmlReporter(OUTPUT_FOLDER + FILE_NAME)。
//设置静态文件的DNS
//訪れないcdn.rawgit.comケースを解決するためにどのように
htmlReporter.config()setResourceCDN(ResourceCDN.EXTENTREPORTS);.
HtmlReporter.config()setDocumentTitle( "API自動テストレポート");.
。HtmlReporter.config()setReportName ( "APIの自動テストレポート");
(真の)htmlReporter.config()setChartVisibilityOnOpen ;.
//レポートの場所
htmlReporter.config()setTestViewChartLocation(ChartLocation.TOP);.
。// htmlReporter.config()setTheme(Theme.STANDARD );
htmlReporter.config()setCSS( "UL {node.level 1表示:なし;} {UL-1.active表示.node.level:ブロック;}。。");
エクステントExtentReports新しい新=();
エクステント.attachReporter(htmlReporter);
extent.setReportUsesManualConfiguration(真の);
}

プライベート無効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)を比較
o1.getStartMillisリターン()<o2.getStartMillis()-1:1;?。
}
});
treeSet.addAll(tests.getAllResults());
(ITestResult結果:TreeSetの){
オブジェクト[] = result.getParametersパラメータ( );
文字列名= "";
//パラメータの場合、パラメータは、のtoStringレポート名の組み合わせの代わりに使用されている
ため(オブジェクトPARAM:パラメータ){
名前= param.toString +();
}
(IF(name.length) > 0){
(name.length()> 50){IF
名称= name.substring(0、49)+ "...";
}
} {他
result.getMethod名=()getMethodNameに();
}
IF (extenttest == NULL){
テスト= 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を返します);
}
}
3:書き込みテストコード
パッケージのTestCase;

インポートorg.testng.Assert;
インポートorg.testng.Reporter;
インポートorg.testng.annotations.Test;

/ **
*ケースのデモ
* * /
publicクラスケース1 {

@テスト
公衆TestCase1ボイド(){
//レコードのTestNGのレポートをログログはコンソールにオブジェクトとして表示することができます組み込まれて付属しています
Reporter.log(trueに、「TestCase1を実行する」);
Assert.assertTrue(真の);
}

@Test
無効testCase2公開(){

Reporter.log(trueに、 "testCase2を実行");
Assert.assertTrue(偽の);
}

@Test
公共ボイドtestCase3(){

Reporter.log(trueに、 "testCase3を実行");
アサート。 (真)にいるassertTrue;
}
}
4:書き込みファイルtestNG.xml。
4.1:単一の複数のテストスイートの実行タグ
testng.xmlプロファイルは、以下

<?xml version = "1.0"エンコード= "UTF-8"?>
<!DOCTYPEスイートSYSTEM "http://testng.org/testng-1.0.dtd">
<スイート名は= "スイート">
<リスナー>
<リスナークラス名= "Listeners.ExtentTestNGIReporterListener"> </リスナー>
</リスナー>
<テスト名= "Test1を">
<クラス>
<! -クラス需要拆开不然没法写方法- >
<クラス名= "TestCase.case1">
<メソッド>は
<含める名= "testCase1"> </ include>の
</メソッド>
</クラス>
</クラス>
</テスト> <! -テスト- >
<テスト名=」 Test2"を>
<クラス>
<! -クラス分解する必要があるかのメソッドを記述することはできません。 - >
<クラス名= "TestCase.case1">
<方法>
<含める名= "testCase2"> </ include>の
</方法>
</クラス>
</クラス>
</テスト> <! -テスト- >
<テスト名= "Test3は">
<クラス>
<! -クラス需要拆开不然没法写方法- >
<クラス名= "TestCase.case1">
<メソッド>
<名前= "testCase3"> </ include>の含める
</メソッド>
</クラス>
</クラス>
</テスト> <を! -テスト- >
</スイート> <! -スイート- >
HTMLReport报告样式

 

 

 

4.2:他には、
あなたもここに入らない、より多くのテストスイートの仕方を書くことができます
----------------
免責事項:この記事では、元の記事CSDNブロガーの「AnndyTuo」でありますBY-SAの再現著作権契約、CC 4.0に従って、元のソースのリンクと、この文を添付してください。
オリジナルリンクします。https://blog.csdn.net/hujyhfwfh2/article/details/84950119

おすすめ

転載: www.cnblogs.com/liyunfeng111/p/11497900.html