在本文中,我將詳細介紹如何將 ExtentReports 測試報告與TestNG集成。
主要特點:
TestNG 原生報告有點丑,信息整理有點亂。ExtentReports 是用于替換TestNG 原生報告。當然也可以使用 ReportNg,個人偏好 ExtentReports 樣式。
官網已經給了很多demo了,大家可以參考練習,這里根據個人經驗進行了配置。
引入pom.xml
<!--引入extentreports相關包-->
<dependency>
<groupId>com.aventstack</groupId>
<artifactId>extentreports</artifactId>
<version>3.1.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.vimalselvam</groupId>
<artifactId>testng-extentsreport</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>com.relevantcodes</groupId>
<artifactId>extentreports</artifactId>
<version>2.41.2</version>
</dependency>
<!--引入testng測試框架-->
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
<scope>compile</scope>
</dependency>
主要基于以下兩項原因:
下載 ExtentReportes 源碼,找到 ExtentTestNgFormatter 類,Listener 目錄下創建 MyExtentTestNgFormatter.java 類直接繼承 ExtentTestNgFormatter 類。
public class MyExtentTestNgFormatter extends ExtentTestNgFormatter {
構造方法加入
htmlReporter.config().setResourceCDN(ResourceCDN.EXTENTREPORTS);
具體代碼如下:
ublic MyExtentTestNgFormatter() {
setInstance(this);
testRunnerOutput=new ArrayList<>();
String reportPathStr=System.getProperty("reportPath");
File reportPath;
try {
reportPath=new File(reportPathStr);
} catch (NullPointerException e) {
reportPath=new File(TestNG.DEFAULT_OUTPUTDIR);
}
if (!reportPath.exists()) {
if (!reportPath.mkdirs()) {
throw new RuntimeException("Failed to create output run directory");
}
}
File reportFile=new File(reportPath, "report.html");
File emailReportFile=new File(reportPath, "emailable-report.html");
htmlReporter=new ExtentHtmlReporter(reportFile);
EmailReporter emailReporter=new EmailReporter(emailReportFile);
reporter=new ExtentReports();
// 如果cdn.rawgit.com訪問不了,可以設置為:ResourceCDN.EXTENTREPORTS或者ResourceCDN.GITHUB
htmlReporter.config().setResourceCDN(ResourceCDN.EXTENTREPORTS);
reporter.attachReporter(htmlReporter, emailReporter);
}
重寫onstart 方法功能。新建一個類名為MyReporter,一個靜態ExtentTest的引用。
Listener 包下 MyReporter.java
public class MyReporter {
public static ExtentTest report;
}
MyExtentTestNgFormatter.java
public void onStart(ITestContext iTestContext) {
ISuite iSuite=iTestContext.getSuite();
ExtentTest suite=(ExtentTest) iSuite.getAttribute(SUITE_ATTR);
ExtentTest testContext=suite.createNode(iTestContext.getName());
// 將MyReporter.report靜態引用賦值為testContext。
// testContext是@Test每個測試用例時需要的。report.log可以跟隨具體的測試用例。另請查閱源碼。
MyReporter.report=testContext;
iTestContext.setAttribute("testContext", testContext);
}
測試報告默認是在工程根目錄下創建 test-output/ 文件夾下,名為report.html、emailable-report.html。可根據各自需求在構造方法中修改。
public MyExtentTestNgFormatter() {
setInstance(this);
testRunnerOutput=new ArrayList<>();
// reportPath報告路徑
String reportPathStr=System.getProperty("reportPath");
File reportPath;
try {
reportPath=new File(reportPathStr);
} catch (NullPointerException e) {
reportPath=new File(TestNG.DEFAULT_OUTPUTDIR);
}
if (!reportPath.exists()) {
if (!reportPath.mkdirs()) {
throw new RuntimeException("Failed to create output run directory");
}
}
// 報告名report.html
File reportFile=new File(reportPath, "report.html");
// 郵件報告名emailable-report.html
File emailReportFile=new File(reportPath, "emailable-report.html");
htmlReporter=new ExtentHtmlReporter(reportFile);
EmailReporter emailReporter=new EmailReporter(emailReportFile);
reporter=new ExtentReports();
reporter.attachReporter(htmlReporter, emailReporter);
}
report.log 支持多種玩法
// 根據狀態不同添加報告。型如警告
MyReporter.report.log(Status.WARNING, "接口耗時(ms):" + String.valueOf(time));
直接從TestClass 中運行時會報 MyReporter.report 的空指針錯誤,需做判空處理。
在測試集合 testng.xml 文件中導入 Listener 監聽類。
<listeners>
<listener class-name="com.zuozewei.extentreportdemo.listener.MyExtentTestNgFormatter"/>
</listeners>
extent reporters支持報告的配置。目前支持的配置內容有title、主題等。 先在src/resources/目錄下添加 config/report/extent-config.xml。
<?xml version="1.0" encoding="UTF-8"?>
<extentreports>
<configuration>
<timeStampFormat>yyyy-MM-dd HH:mm:ss</timeStampFormat>
<!-- report theme -->
<!-- standard, dark 個人喜好暗色 -->
<theme>dark</theme>
<!-- document encoding -->
<!-- defaults to UTF-8 -->
<encoding>UTF-8</encoding>
<!-- protocol for script and stylesheets -->
<!-- defaults to https -->
<protocol>https</protocol>
<!-- title of the document -->
<documentTitle>QA-接口自動化測試報告</documentTitle>
<!-- report name - displayed at top-nav -->
<reportName>QA-接口自動化測試報告</reportName>
<!-- report headline - displayed at top-nav, after reportHeadline -->
<reportHeadline>接口自動化測試報告</reportHeadline>
<!-- global date format override -->
<!-- defaults to yyyy-MM-dd -->
<dateFormat>yyyy-MM-dd</dateFormat>
<!-- global time format override -->
<!-- defaults to HH:mm:ss -->
<timeFormat>HH:mm:ss</timeFormat>
<!-- custom javascript -->
<scripts>
<![CDATA[
$(document).ready(function() {
});
]]>
</scripts>
<!-- custom styles -->
<styles>
<![CDATA[
]]>
</styles>
</configuration>
</extentreports>
config下新建 MySystemInfo類繼承 SystemInfo 接口
public class MySystemInfo implements SystemInfo {
@Override
public Map<String, String> getSystemInfo() {
Map<String, String> systemInfo=new HashMap<>();
systemInfo.put("測試人員", "zuozewei");
return systemInfo;
}
}
可用于添加系統信息,例如:db的配置信息,人員信息,環境信息等。根據項目實際情況添加。 至此,extentreports 美化報告完成。
public class TestMethodsDemo {
@Test
public void test1(){
Assert.assertEquals(1,2);
}
@Test
public void test2(){
Assert.assertEquals(1,1);
}
@Test
public void test3(){
Assert.assertEquals("aaa","aaa");
}
@Test
public void logDemo(){
Reporter.log("這是故意寫入的日志");
throw new RuntimeException("故意運行時異常");
}
}
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="測試demo" verbose="1" preserve-order="true">
<parameter name="report.config" value="src/main/resources/report/extent-config.xml"/>
<parameter name="system.info" value="com.zuozewei.extentreportdemo.config.MySystemInfo"/>
<test name="測試demo" preserve-order="true">
<classes>
<class name="com.zuozewei.extentreportdemo.testCase.TestMethodsDemo"/>
</classes>
</test>
<listeners>
<listener class-name="com.zuozewei.extentreportdemo.listener.MyExtentTestNgFormatter"/>
</listeners>
</suite>
2、Email Report 示例
五、工程目錄
源碼地址:
輯:桃子 時光
今天,斯坦福大學發布了2022年人工智能指數報告。
李飛飛教授在報告發布后第一時間轉發。
今年的報告主要分為5大章節:研究及發展,技術表現,人工智能應用的道德挑戰,經濟和教育,人工智能政策和國家戰略。
以下將為你提取7項報告要點:
過去的10年,全球AI論文發表量實現翻番,從2010年的162444篇增長到334497篇,且逐年遞增。
具體而言,模式識別和機器學習領域的論文,僅2015年至2021年的6年間,就實現了倍增,其它諸如計算機視覺、數據挖掘和自然語言處理等領域,保持了比較平穩的發展。
另外,從論文的刊載情況來看,期刊文章占比最大,51.5%;21.5%是頂會論文,17.0%來自存儲庫。
可以看出,在過去12年中,期刊和儲存庫的論文分別增長了2.5倍和30倍,但頂會論文的數量自2018年以來有所下降。
論文跨國合作來看,從2010年到2021年,中國和美國共同發表的人工智能論文數量全球最多,自2010年以來就增加了5倍。中美合作的出版物數量是中英的2.7,世界排名第二。
2021年,中國在人工智能期刊、頂會和知識庫出版物的數量上繼續領先世界。這三種出版物類型的總和比美國高出63.2%。
與此同時,美國在人工智能頂會論文數量和存儲庫引用的數量上處于領先地位。
就AI期刊論文發表數量來看,過去12年人工智能期刊論文發表數量占比,中國始終霸榜,2021年為31.0%(2020年占比18.0%),其次是歐盟和英國,為19.1%,美國為13.7%。
2021年,中國在AI期刊的全球引用量依舊領先。
值得注意的是,不論是AI期刊論文發表數量、引用數量,美國從去年第2名降至第3名。
那么中美在頂會發表論文的情況如何?
2021年,中國以27.6%的比例在全球AI頂會發表的論文數所占份額最大,比2020年的領先優勢更大,而歐盟和英國以19.0%緊隨其后,美國以16.9%位居第3。
然而,美國一直在AI頂會論文引用量上居高不下,2021年引用總量占比29.52%,排名第2和第3的分別是歐盟英國(23.32%)和中國(15.32%)。
中國從去年第2名跌倒第3名,從側面可以看出,中國論文發表數量最多,但質量不如美國高。
總體來看,2021年人工智能專利申請量是2015年的30多倍,年復合增長率為76.9%。
具體講,中國申請了全球一半以上的AI專利,并獲得了約6%的授權,與歐盟和英國大致相同。
與不斷增長的人工智能專利申請和授權數量相比,中國的專利申請數量(2021年為87343件)遠高于授權數量(2021年為1407件)。
從2015年至2021年GitHub開源AI軟件庫的用戶數量可以看出,TensorFlow仍然是2021年最受歡迎的,GitHub累計星數約為161,000,比2020年略有增加。
排在第2名的便是OpenCV,緊隨其后的是Keras、PyTorch 和 Scikit-learn
先來看一組照片,這展示了AI人臉識別水平的年序發展。
對比2014年,我們僅能將原本膚色表情豐富的真人,識別成一張黑白且模糊的人臉,但是到了2021年,計算機對黑色皮膚也能揭示更多細節,我們看到了圖像人物皮膚的黑里帶棕,以及表情的露齒帶笑。
報告展示了計算機圖像如何分類,下圖包括飛機、自動汽車、鳥、貓、鹿、狗、青蛙、馬、船、卡車等各種類別,通過給定圖像的分類模型與目標標簽,提高了圖像識別的智能化程度。
報告指出,隨著深度學習運用于AI圖像識別,圖像識別的準確性有了很大提升。
以下是AI圖像識別準確性的對比圖,藍色線條代表沒有使用訓練數據,綠色線條代表使用了訓練數據。很明顯,綠色線條(準確率99.02%)超越了藍色線條(準確率97.9%),這意味著,AI圖像識別經數據訓練后準確性提高。
而無論是否使用深訓練數據,AI圖像識別(99.02%&97.90%)在2017年后均表現出了高于常人(94.9%準確率)的水平。
看來,「臉盲癥」只存在于人類,AI幾乎不會患。
報告使用了一份來自北京郵電大學的口罩人臉圖片集,這6000個人臉識別數據集,提升了疫情期間人臉識別的準確率。
口罩遮擋住面部,這使得人臉識別系統收集到的面部信息大量減少,然而,來自中國的AI團隊將人臉識別的關鍵信息集中于眉毛和眼睛,并采用正確的模型進行訓練,實現了「戴著口罩也能刷臉」。
來看一下,計算機如何進行視覺常識推理的。
視覺常識推理,Visual Commonsense Reasoning(VCR)是AI領域的前沿熱點問題,這是一項非常富有挑戰的任務,包括認知、學習、推理,從單一的視覺問答、圖像識別、動作捕捉等數據處理,上升到「跨媒體智能」,代表了計算機視覺理解的新基準。
報告指出,目前,計算機視覺常識推理能力遠遠落后于人類,人類的視覺常識推理水平一直維持在85分,而2021年機器的最佳得分只有72分。
看來,這確實有點Low,不過相較于2018年的不及格水平(43分),機器用3年時間提高了29分,顯然是在大步向前了。
近年來,得益于語音識別技術的發展,完全機器翻譯的服務應用大幅提升,占比46%。
相較于其它的應用,機器翻譯的商業應用增速明顯,商用規模從2019年的21%擴大到2021年的38%,近2倍。
報告使用了2015年由斯坦福大學Bowman等人提供的自然語言處理的問題和標簽。
自然語言處理是在給定確定任務的前提下,假設4種邏輯,即錯誤(contradiction矛盾)、未決定(neutral中性)2種、是否為真(entailment蘊涵),機器對進行合理與不合理的推論。
報告顯示,2021年自然語言處理的精準度已達93.1%,而在2017年初就已經達到90%,這是在高起點的基礎上實現緩增長。
斯坦福自然語言推理(SNLI)數據集包含約60萬對被標記的句子,其性能精度是基于答對問題的百分比。
從今年報告的總體體量上而言,較之于去年的7章,今年報告濃縮至5章,減少了「AI的多樣性」部分,并將「AI經濟」和「AI教育」合為「經濟和教育」1章。
雖然總章數減少了,但是體量卻變大了,目錄頁碼由177頁增加到了196頁。
Burning Glass數據涵蓋的六個國家對人工智能勞動力的需求在過去九年中顯著增長。其中新加坡AI招聘崗位在總招聘崗位中占比2.33%,排名第一,美國0.90%排名第二。
就人工智能領域投資來講,從2013年到2021年,美國對人工智能公司的私人投資是中國的2倍多。
中國的AI投資出現了增長,從2020年的10%上升到了2021年的17.21%。
報告下載地址:
https://aiindex.stanford.edu/wp-content/uploads/2022/03/2022-AI-Index-Report_Master.pdf
單頁應用程序的概念正在尋找越來越多的支持者。最著名的單頁框架之一是Angular,它是一個單頁 的JavaScript應用程序框架。Angular的第一個版本基于JavaScript,但是所有后續版本都已經在使用TypeScript,并且與第一個版 本完全不同。在AngularJS上創建新應用程序沒有任何意義,因此我們將使用當前版本的Angular 7。
Microsoft成功地將Angular和ASP結合起來。Net Core MVC。因此,使用ASP .Net Core MVC的實現 ,在單頁面應用程序中顯示報表相對容易。
Node.js安裝
要在Angular框架上開始開發,您需要預先安裝一個平臺,以便在服務器端執行JavaScript代碼。它 叫做Node.js。
您還需要安裝.Net Core SDK 2.0或更新版本。但是,如果您安裝了Microsoft Visual Studio 2017 ,則無需執行此操作。
如何創建應用程序?
有兩種方法 - 在Visual Studio中創建新項目或從命令行運行命令。
對于第一個選項,您必須在Visual Studio擴展中安裝Angular應用程序模板。
第二個更簡單。為您的應用程序創建一個文件夾 在Windows命令行中,使用cd命令轉到創建的文件 夾并執行以下命令:
dotnet new angular -o AngularFRCore
如您所知,AngularFRCore是項目的名稱。創建應用程序后,您需要安裝typescript庫。我們將使用 Node.js npm平臺庫安裝程序執行此操作。在控制臺執行了創建應用程序的命令,在應用程序目錄中運行另一個命令:
npm install -g typescript
現在,打開項目,沒有解決方案文件,它將在您第一次啟動項目時創建。
我們的演示應用程序的目標是展示如何在單頁應用程序中使用FastReport.Core。讓我們將 FastReport庫添加到我們的項目中。打開NuGet包管理器。在右上角,您可以選擇數據包的來源。我們對本地源感興趣,但首先需要 配置它。為此,請單擊右上角的齒輪圖標。我們使用包設置本地文件夾的路徑:
默認情況下,此文件夾是:C:\ Program Files(x86)\ FastReports \ FastReport.Net \ Nugets。
通過安裝FastReport.Net,您可以獲得上述包裝中的現成包裝。讓我們回到包管理器:
現在有兩個包,安裝它們。 要在應用程序中使用FastReport,需要在Startup.cs文件中添加 一行代碼:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { … app.UseFastReport(); …}
如果您瀏覽項目樹,可以從MVC應用程序中看到我們熟悉的控制器和模型目錄。可以使用幾乎未改變 的MVC .Net Core應用程序作為后端。Controllers文件夾中已有一個 - SampleDataController。隨意清除課程內容 - 我們將創建 自己的方法:
[HttpGet("[action]")] public IActionResult ShowReport(string name) { WebReport WebReport=new WebReport(); WebReport.Width="1000"; WebReport.Height="1000"; WebReport.Report.Load(String.Format("App_Data/{0}.frx", name)); // Load the report into the WebReport object System.Data.DataSet dataSet=new System.Data.DataSet(); // Create a data source dataSet.ReadXml("App_Data/nwind.xml"); // Open the xml database WebReport.Report.RegisterData(dataSet, "NorthWind"); // Registering the data source in the report ViewBag.WebReport=WebReport; // pass the report to View return View(); }
如果您已經熟悉FastReport.Core,那么此方法沒有任何新內容。我們創建了Web報表對象,將報表 模板加載到其中,創建并注冊了數據源并將報表傳遞給視圖。此方法有一個參數 - 我們用于加載所需報表模板的報表的名稱。
FastReport.Net集包含一個帶有演示報表的文件夾:
C:\ Program Files(x86)\ FastReports \ FastReport.Net \ Demos \ Reports
我們將從中獲取幾個模板和一個nwind.xml數據庫。但首先,在項目根目錄中創建App_Data文件夾。 現在從上面的文件夾中將文件拖入其中:
Barcode.frx,Master-Detail.frx,Matrix.frx,nwind.xml。
下一步是為此方法創建一個視圖。
我們的項目中沒有Views文件夾。在項目根目錄中創建它。在此文件夾中,添加另一個名為 SampleData的文件夾。最后,在此文件夾中,我們創建了一個新視圖 - ShowReport.chtml,其中包含以下內容:
@await ViewBag.WebReport.Render()
在異步模式下,我們正在等待生成報表的HTML版本。
所以,我們準備了一個與Angular一起提供的后端。我們來看看ClientApp文件夾。這是一個單頁的 應用程序。我們對src - > app目錄感興趣。以下是負責顯示內容的主要文件 - 頁面模板及其類型腳本處理程序。主頁模板是 app.component.html。我們將完全編輯它:
FastReport.Core Demo Select a report and click the button Matrix Master-Detail Barcode
首先,我們為不同的報表顯示三個單選按鈕。每個按鈕都訂閱了Click事件,我們通過該事件設置報 表變量的值。該函數將報表的名稱作為參數。通過這種方式,我們組織了所需報表模板的選擇。這是一個相當原始的實現,但為了 演示報表,不再需要它。
下面,我們展示了一個名為ShowReport的按鈕,它也使用Clicked()處理程序訂閱了click事件。 注意條件* ngIf=“show”的div。如果show變量為true,則將執行內部變量中的代碼。在我們的例子中,將顯示框架。這樣做是為 了在最初加載頁面時不顯示空框架。此外,當我們選擇報告并單擊“顯示報表”按鈕時,將顯示包含報表的框架。
在框架屬性中,我們從變量url設置源。有趣的是,我們在safeUrl函數的幫助下“規范化”這個變 量,并通過管道應用它。此函數將檢查URL的安全性和有效字符,并將其顯示為正確的格式。我們稍后會詳細介紹它。
現在,查看app.component.ts組件腳本,該腳本負責處理上面討論的模板:
import { Component } from '@angular/core'; @Component( { selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css']}) export class AppComponent { title='app'; show: boolean=false; url: string; report: string; Clicked() { if (this.report !=null) { this.show=true; this.url="api/SampleData/ShowReport?name=" + this.report; } }}
以下是我們在頁面模板中看到的show和url變量。以及變量報表,其中包含所選報表的名稱。 Clicked()函數將show變量設置為true,并在url變量中設置報表的路徑。
現在我們將創建safeUrl函數,我們在管道中使用變量url。在app目錄文件safeUrl.pipe.ts中:
import { Pipe, PipeTransform } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; @Pipe({ name: 'safeUrl' }) export class SafeUrlPipe implements PipeTransform { constructor(private sanitizer: DomSanitizer) { } transform(url) { return this.sanitizer.bypassSecurityTrustResourceUrl(url); }}
要在頁面模板中使用此函數,請在app.module.ts中添加此管道模塊的聲明:
import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { HttpClientModule } from '@angular/common/http'; import { RouterModule } from '@angular/router'; import { SafeUrlPipe } from "./safeUrl.pipe"; import { AppComponent } from './app.component'; @NgModule({ declarations: [ AppComponent, SafeUrlPipe ], imports: [ BrowserModule.withServerTransition({ appId: 'ng-cli-universal' }), HttpClientModule, FormsModule ], providers: [], bootstrap: [AppComponent] }) export class AppModule { }
這樣就完成了演示應用程序的工作。運行應用程序:
首先,您需要選擇其中一個報表,然后單擊按鈕:
現在選擇另一個報表并單擊按鈕:
因此,您已經看到在Angular單頁面應用程序中使用FastReport.Core報告生成器并不比通常的ASP .Net Core應用程序困難得多 。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。