詳解用Pytest+Allure生成漂亮的HTML圖形化測(cè)試報(bào)告
對(duì)于軟件測(cè)試工作來(lái)說(shuō),測(cè)試報(bào)告是非常重要的工作產(chǎn)出。一個(gè)漂亮、清晰、格式規(guī)范、內(nèi)容完整的測(cè)試報(bào)告,既能最大化我們的測(cè)試工作產(chǎn)出,又能夠減少開發(fā)人員和測(cè)試人員的溝通成本。
本篇文章將介紹如何使用開源的測(cè)試報(bào)告生成框架Allure生成規(guī)范、格式統(tǒng)一、美觀的測(cè)試報(bào)告。
通過(guò)這篇文章的介紹,你將能夠:
- 將Allure與Pytest測(cè)試框架相結(jié)合;
- 如何定制化測(cè)試報(bào)告內(nèi)容
- 執(zhí)行測(cè)試之后,生成Allure格式的測(cè)試報(bào)告。
- 如何與Jenkins集成。
- 將測(cè)試環(huán)境信息展示到測(cè)試報(bào)告中。
1、Allure測(cè)試報(bào)告介紹
Allure是一款輕量級(jí)并且非常靈活的開源測(cè)試報(bào)告框架。 它支持絕大多數(shù)測(cè)試框架, 例如TestNG、Pytest、JUint等。它簡(jiǎn)單易用,易于集成。下面就Pytest如何與Allure集成做詳細(xì)介紹。
2、Pytest框架集成Allure
Pytest是Python的單元測(cè)試框架,非常方便和易用。強(qiáng)烈推薦對(duì)于用Python進(jìn)行測(cè)試工作的小伙伴使用這個(gè)測(cè)試框架,相比與Python自帶的UnitTest好用太多太多。這篇文章我不會(huì)介紹太多Pytest測(cè)試框架的使用,今天主要是介紹如何將測(cè)試報(bào)告生成工具Allure集成到Pytest中。
2.1 安裝Allure Pytest Plugin
allure-pytest是Pytest的一個(gè)插件,通過(guò)它我們可以生成Allure所需要的用于生成測(cè)試報(bào)告的數(shù)據(jù)。安裝allure-pytest插件方法:
$ pip install allure-pytest
2.2 改造基于Pytest的測(cè)試用例
allure-pytest的官方文檔中詳細(xì)介紹了allure-pytest所具有的功能。本篇文章不會(huì)再翻譯一遍,而是從實(shí)際入手,給大家介紹如何將其應(yīng)用到自己的框架中。
為了使用Allure生成報(bào)告,需要在測(cè)試腳本中加入Allure特性。而這個(gè)操作并不會(huì)對(duì)原有的測(cè)試用例邏輯產(chǎn)生任何變動(dòng)。
直接看下面的腳本,我通過(guò)在腳本中添加注釋的方式給大家解釋allure特性的用途。比如測(cè)試腳本是test_shopping_trolley.py:
#!/usr/bin/env python # coding=utf-8 import pytest import allure @allure.feature('購(gòu)物車功能') # 用feature說(shuō)明產(chǎn)品需求,可以理解為JIRA中的Epic class TestShoppingTrolley(object): @allure.story('加入購(gòu)物車') # 用story說(shuō)明用戶場(chǎng)景,可以理解為JIRA中的Story def test_add_shopping_trolley(self): login('劉春明', '密碼') # 步驟1,調(diào)用“step函數(shù)” with allure.step("瀏覽商品"): # 步驟2,step的參數(shù)將會(huì)打印到測(cè)試報(bào)告中 allure.attach('筆記本', '商品1') # attach可以打印一些附加信息 allure.attach('手機(jī)', '商品2') with allure.step("點(diǎn)擊商品"): # 步驟3 pass with allure.step("校驗(yàn)結(jié)果"): # 步驟4 allure.attach('添加購(gòu)物車成功', '期望結(jié)果') allure.attach('添加購(gòu)物車失敗', '實(shí)際結(jié)果') assert 'success' == 'failed' @allure.story('修改購(gòu)物車') def test_edit_shopping_trolley(self): pass @pytest.mark.skipif(reason='本次不執(zhí)行') @allure.story('刪除購(gòu)物車中商品') def test_delete_shopping_trolley(self): pass @allure.step('用戶登錄') # 將函數(shù)作為一個(gè)步驟,調(diào)用此函數(shù)時(shí),報(bào)告中輸出這個(gè)步驟,我把這樣的函數(shù)叫“step函數(shù)” def login(user, pwd): print(user, pwd)
上面使用了Allure的幾個(gè)特性:
- @allure.feature # 用于描述被測(cè)試產(chǎn)品需求
- @allure.story # 用于描述feature的用戶場(chǎng)景,即測(cè)試需求
- with allure.step # 用于描述測(cè)試步驟,將會(huì)輸出到報(bào)告中
- allure.attach # 用于向測(cè)試報(bào)告中輸入一些附加的信息,通常是一些測(cè)試數(shù)據(jù),截圖等
- @pytest.allure.step # 用于將一些通用的函數(shù)作為測(cè)試步驟輸出到報(bào)告,調(diào)用此函數(shù)的地方會(huì)向報(bào)告中輸出步驟
3、生成Allure測(cè)試報(bào)告
測(cè)試腳本中添加了Allure特性之后,可以通過(guò)兩步,就可以展示出測(cè)試報(bào)告了。
第一步,生成測(cè)試報(bào)告數(shù)據(jù)
在py.test執(zhí)行測(cè)試的時(shí)候,指定–alluredir選項(xiàng)及結(jié)果數(shù)據(jù)保存的目錄:
$ py.test test/ --alluredir ./result/
./result/中保存了本次測(cè)試的結(jié)果數(shù)據(jù)。另外,還可以執(zhí)行指定features或者stories執(zhí)行一部分測(cè)試用例,比如執(zhí)行”購(gòu)物車功能“下的”加入購(gòu)物車“子功能的測(cè)試用例:
$ py.test test/ --allure_features='購(gòu)物車功能' --allure_stories='加入購(gòu)物車'
第二步,生成測(cè)試報(bào)告頁(yè)面
通過(guò)下面的命令將./result/目錄下的測(cè)試數(shù)據(jù)生成測(cè)試報(bào)告頁(yè)面:
$ allure generate ./result/ -o ./report/ --clean
–clean選項(xiàng)目的是先清空測(cè)試報(bào)告目錄,再生成新的測(cè)試報(bào)告。
這一步需要提前安裝allure命令行,如果是Mac電腦,推薦使用Homebrew安裝。
$ brew install allure
4、解讀測(cè)試報(bào)告
打開生成的測(cè)試報(bào)告后,瀏覽器被自動(dòng)調(diào)起,展示測(cè)試報(bào)告。下面我們分別看看測(cè)試報(bào)告的幾個(gè)頁(yè)面。
4.1、首頁(yè)
首頁(yè)中展示了本次測(cè)試的測(cè)試用例數(shù)量,成功用例、失敗用例、跳過(guò)用例的比例,測(cè)試環(huán)境,SUITES,F(xiàn)EATURES BY STORIES等基本信息,當(dāng)與Jenkins做了持續(xù)置成后,TREND區(qū)域還將顯示,歷次測(cè)試的通過(guò)情況。
首頁(yè)的左邊欄,還從不同的維度展示測(cè)試報(bào)告的其他信息,大家可以自己點(diǎn)進(jìn)去看看。
4.2、Behaviors頁(yè)面
進(jìn)入Behaviors頁(yè)面,這個(gè)頁(yè)面按照FEATURES和 STORIES展示測(cè)試用例的執(zhí)行結(jié)果:
從這個(gè)頁(yè)面可以看到“購(gòu)物車功能”這個(gè)FEATURES包含的三個(gè)STORIES的測(cè)試用例執(zhí)行情況。
4.3、Suites頁(yè)面
Allure測(cè)試報(bào)告將每一個(gè)測(cè)試腳本,作為一個(gè)Suite。在首頁(yè)點(diǎn)擊Suites區(qū)域下面的任何一條Suite,都將進(jìn)入Suites頁(yè)面。
這個(gè)頁(yè)面,以腳本的目錄結(jié)構(gòu)展示所有測(cè)試用例的執(zhí)行情況。
4.4、Graphs頁(yè)面
這個(gè)頁(yè)面展示了本次測(cè)試結(jié)果的統(tǒng)計(jì)信息,比如測(cè)試用例執(zhí)行結(jié)果狀態(tài)、測(cè)試用例重要等級(jí)分布、測(cè)試用例執(zhí)行時(shí)間分布等。
4.5、測(cè)試用例詳情頁(yè)面
在Suites頁(yè)面上點(diǎn)擊任何一條測(cè)試用例,Suites頁(yè)面的右側(cè)將展示這條用例的詳細(xì)執(zhí)行情況。
從這個(gè)頁(yè)面可以看到測(cè)試用例執(zhí)行的每一個(gè)步驟,以及每個(gè)步驟的執(zhí)行結(jié)果,每一個(gè)步驟都可以添加附件,作為重要信息補(bǔ)充。從這里,對(duì)于失敗的測(cè)試用例,可以一目了然看到原因。
5、Jenkins中生成Allure報(bào)告
5.1、安裝 Allure Plugin
首先需要給Jenkins安裝Allure Plugin。在Jenkins的插件管理頁(yè)面,搜索“allure”,在搜索結(jié)果頁(yè),選擇“Allure Jenkins Plugin”進(jìn)行安裝。
安裝完成之后重啟一下Jenkins。
在Jenkins的“全局工具管理”頁(yè)面,找到Allure Commandline模塊進(jìn)行安裝:
點(diǎn)擊后,彈出下面的頁(yè)面,輸入Allure的命令別名和版本后,點(diǎn)擊Apply 和Save。
5.2、修改Pipeline
在Pipeline的定義中,在執(zhí)行測(cè)試用例的環(huán)節(jié)增加--alluredir ./allure-results
保存測(cè)試結(jié)果數(shù)據(jù),并在構(gòu)建后的步驟中增加allure includeProperties: false, jdk: '', report: 'jenkins-allure-report', results: [[path: 'allure-results']]
將測(cè)試結(jié)果數(shù)據(jù)生成測(cè)試報(bào)告頁(yè)面,完整的Jenkinsfile如下:
pipeline { // ... stages { //... stage('執(zhí)行測(cè)試用例') { steps { sh "py.test tests/ --alluredir ./allure-result" } } } post { always{ script { allure includeProperties: false, jdk: '', report: 'jenkins-allure-report', results: [[path: 'allure-result']] } } } }
這樣,我們的Jenkins Job執(zhí)行完測(cè)試用例時(shí)候,將在Job的主頁(yè)面上看到Allure Report圖標(biāo),點(diǎn)擊進(jìn)去就看到了Allure Report報(bào)告。
如果你現(xiàn)在依然使用的是Freestyle風(fēng)格的job。那么需要在構(gòu)建后步驟中,添加Allure Report步驟,將allure的報(bào)告數(shù)據(jù)添加到Path中:
這樣當(dāng)job執(zhí)行完成后,也可以看到allure測(cè)試報(bào)告了。
6、增加測(cè)試環(huán)境到Allure報(bào)告中
在4.1小節(jié)展示的報(bào)告首頁(yè)中,有一個(gè)區(qū)域可以展示測(cè)試執(zhí)行的環(huán)境信息。但是目前allure-pytest插件中并沒有實(shí)現(xiàn)。不過(guò)在之前我用過(guò)的另外一個(gè)插件pytest-allure-adaptor是支持的??上ytest-allure-adaptor插件項(xiàng)目已經(jīng)被標(biāo)記為Deprecated了。
將測(cè)試環(huán)境信息輸出到報(bào)告中,對(duì)于測(cè)試報(bào)告來(lái)講是非常有意義的。我們有沒有什么變通的辦法可以實(shí)現(xiàn)呢?在網(wǎng)上進(jìn)行了一番查詢,發(fā)現(xiàn)stackoverflow上也有很多關(guān)于這個(gè)話題的討論。其中一個(gè)話題還給出了Workaround方法,這里給大家貼上鏈接:
https://stackoverflow.com/questions/52030518/recommend-workaround-for-the-missing-environmental-support-in-pytest-allure
這個(gè)Workaround的方法也比較簡(jiǎn)單方便,就是在allure-results目錄中,新建environment.properties文件,并以key=value形式,在其中寫入環(huán)境相關(guān)的信息,比如:
browser=chrome backend=staging domain=http://baidu.com
這樣,在執(zhí)行allure generate ./result/ -o ./report/ --clean
生成測(cè)試報(bào)告時(shí),將能將測(cè)試環(huán)境信息融合到測(cè)試報(bào)告的頁(yè)面中了。
這樣看,測(cè)試報(bào)告是不是更顯得完整了呢?
不過(guò),這種手動(dòng)方式還是比較麻煩,下面我們看看如何在pytest框架中,自動(dòng)實(shí)現(xiàn)上面的workaround。
在Pytest中,有一個(gè)hook函數(shù)叫作pytest_sessionfinish,根據(jù)官方文檔的描述,這個(gè)函數(shù)是在整個(gè)測(cè)試完成后被調(diào)用的,我們可以在其內(nèi)部實(shí)現(xiàn)我們自己的邏輯。
我們將生成environment.properties文件放到pytest_sessionfinish中實(shí)現(xiàn),再適合不過(guò)了。在測(cè)試項(xiàng)目的根目錄下創(chuàng)建conftest.py文件,在其中實(shí)現(xiàn)pytest_sessionfinish函數(shù),代碼如下。
#!/usr/bin/env python # coding=utf-8 def pytest_sessionfinish(session): with open("{}/result/environment.properties".format(session.config.rootdir), "w") as f: f.write("browser=chrome\nbackend=staging\ndomain=http://baidu.com")
這樣,我們每次測(cè)試完成后,就自動(dòng)將我們的測(cè)試環(huán)境信息添加到測(cè)試報(bào)告中了。
7、總結(jié)
團(tuán)隊(duì)內(nèi)部可能不同項(xiàng)目使用的測(cè)試框架不一樣,每個(gè)測(cè)試框架生成的測(cè)試報(bào)告也不一樣。但由于Allure報(bào)告支持很多測(cè)試框架,通過(guò)Allure可以生成格式一致的測(cè)試報(bào)告,這就對(duì)外提供格式一致的測(cè)試報(bào)告提供了方便。
目前測(cè)試工程實(shí)踐中,另外一個(gè)常用的自動(dòng)化測(cè)試工具組合是采用的Java+TestNG的架構(gòu),TestNG框架如何集成Allure也非常簡(jiǎn)單。大家可以嘗試參考官方文檔來(lái)實(shí)現(xiàn)集成一下。
到此這篇關(guān)于詳解用Pytest+Allure生成漂亮的HTML圖形化測(cè)試報(bào)告的文章就介紹到這了,更多相關(guān)Pytest+Allure生成HTML圖形化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在Python中操作列表之list.extend()方法的使用
這篇文章主要介紹了在Python中操作列表之list.extend()方法的使用,是Python入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-05-05用Python編寫一個(gè)簡(jiǎn)單的FUSE文件系統(tǒng)的教程
這篇文章主要介紹了用Python編寫一個(gè)簡(jiǎn)單的FUSE文件系統(tǒng)的教程,對(duì)于數(shù)據(jù)的備份很有幫助,需要的朋友可以參考下2015-04-04Python實(shí)現(xiàn)微信中找回好友、群聊用戶撤回的消息功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)微信中找回好友、群聊用戶撤回的消息功能,結(jié)合實(shí)例形式分析了Python基于微信itchat模塊實(shí)現(xiàn)針對(duì)撤回消息的查看功能相關(guān)操作技巧,需要的朋友可以參考下2019-08-08使用Python通過(guò)QQ郵箱發(fā)送電子郵件的示例代碼
本文介紹如何使用 Python 的 smtplib 和 email 庫(kù)通過(guò) QQ 郵箱發(fā)送電子郵件,文中有詳細(xì)的代碼示例供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下2023-10-10Python NumPy數(shù)組裁切和數(shù)據(jù)類型的實(shí)現(xiàn)即原理詳解
這篇文章主要介紹了Python NumPy數(shù)組裁切和數(shù)據(jù)類型的實(shí)現(xiàn)即原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-05-05利用Python實(shí)現(xiàn)讀取照片的Exif信息
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)讀取照片的Exif信息,文中的示例代碼簡(jiǎn)潔易懂,具有一定的參考價(jià)值,有需要的小伙伴可以參考下2023-10-10