1.關(guān)于Allure
? ? Allure框架是一個(gè)靈活輕量級(jí)多語(yǔ)言測(cè)試報(bào)告工具,它不僅可以以WEB的方式展示簡(jiǎn)介的測(cè)試結(jié)果,而且允許參與開發(fā)過(guò)程的每個(gè)人從日常執(zhí)行的測(cè)試中最大限度的提取有用信息。
? ? Allure報(bào)告簡(jiǎn)化了常見缺陷的統(tǒng)計(jì):失敗的測(cè)試可以分為BUG和被中斷的測(cè)試,還可以配置日志、步驟、fixture、附件、計(jì)時(shí)、執(zhí)行歷史以及與BUG管理系統(tǒng)集成,所以,通過(guò)以上配置,所有負(fù)責(zé)的開發(fā)人員和測(cè)試人員可以盡可能的掌握測(cè)試信息。
2.Allure安裝
- 1.下載JDK,下載地址如下所示:
https://www.oracle.com/java/technologies/downloads/
- 2.設(shè)置環(huán)境變量
? ? 以Windows為例,如下所示:
JAVA_HOME=D:\Program Files\Java
Path中添加%JAVA_HOME%\bin
? ? 在命令行中分別輸入以下命令,不報(bào)錯(cuò),即代表設(shè)置成功
C:\Users\admin>java -version
java version "17.0.1" 2021-10-19 LTS
Java(TM) SE Runtime Environment (build 17.0.1+12-LTS-39)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.1+12-LTS-39, mixed mode, sharing)
C:\Users\admin>javac -version
javac 17.0.1
- 3.下載Allure命令行,下載地址如下所示:
https://github.com/allure-framework/allure2/releases/
- 4.將下載到本地的allure壓縮包解壓到指定目錄,并添加相應(yīng)的環(huán)境變量
Path=D:\Program Files\Allure\allure-2.16.0\bin
? ? 在命令行中輸入allure,不出現(xiàn)報(bào)錯(cuò)即可
Usage: allure [options] [command] [command options]
Options:
--help
Print commandline help.
-q, --quiet
Switch on the quiet mode.
Default: false
...
3.Allure用法
3.1 語(yǔ)法格式
allure [options] [command] [command options]
3.2 常用option和command
Options
- -q, --quiet:切換到靜默模式,默認(rèn)關(guān)閉
- -v, --verbose:切換詳細(xì)日志模式,默認(rèn)關(guān)閉
Commands
- generate:生成allure的HTML報(bào)告
- -c, --clean:在生成新報(bào)告前,清理之前生成報(bào)告的目錄,默認(rèn)關(guān)閉
- --config:Allure命令行配置文件路徑,如果指定將覆蓋--profile和--configDirectory所設(shè)定的值
- --configDirectory:Allure命令行配置文件目錄,默認(rèn)值為: ALLURE_HOME目錄
- --profile:Allure命令行配置文件
- -o, --report-dir, --output:指定生成報(bào)告的目錄,默認(rèn)allure-report
- serve:?jiǎn)?dòng)serve并查看報(bào)告
- 基本語(yǔ)法:serve [options] allure結(jié)果目錄
- --config:Allure命令行配置文件路徑,如果指定將覆蓋--profile和--configDirectory所設(shè)定的值
- --configDirectory:Allure命令行配置文件目錄,默認(rèn)值為: ALLURE_HOME目錄
- --profile:Allure命令行配置文件
- -h, --host:指定訪問(wèn)報(bào)告的web服務(wù)器地址
- -p, --port:指定訪問(wèn)報(bào)告的web服務(wù)器地端口,默認(rèn)為0
- open:查看報(bào)告
- 基本語(yǔ)法:open [options] allure報(bào)告目錄
- -h, --host:指定訪問(wèn)報(bào)告的web服務(wù)器地址
- -p, --port:指定訪問(wèn)報(bào)告的web服務(wù)器地端口,默認(rèn)為0
1.generate常用參數(shù)主要為-c和-o
2.open常用參數(shù)主要為-h和-p
4.Allure報(bào)告結(jié)構(gòu)
- Overview
? ? 報(bào)告總覽
- Categories
? ? 類別,允許用戶創(chuàng)建自定義的類別。默認(rèn)分為失敗和錯(cuò)誤,在執(zhí)行結(jié)果是其中一類時(shí)則被歸到相應(yīng)的類中。
- Suites
? ? 測(cè)試套件,即所有用例的層級(jí)關(guān)系,可以按package/module/class/method進(jìn)行查找
- Graphs
? ? 測(cè)試結(jié)果圖形化,包含測(cè)試用例的運(yùn)行結(jié)果分布圖、耗時(shí)、優(yōu)先級(jí)等
- Timeline
? ? 時(shí)序圖,將測(cè)試用例的執(zhí)行順序和測(cè)試時(shí)間以可視化形式展現(xiàn)出來(lái)
- Behaviors
? ? 行為驅(qū)動(dòng),根據(jù)Epic、Feature、Story來(lái)對(duì)測(cè)試用例進(jìn)行分組
- Packages
? ? 用例按Package進(jìn)行分組,根據(jù)測(cè)試結(jié)果按不同的Package進(jìn)行分組,并以樹形結(jié)構(gòu)進(jìn)行展示
5.Allure特性
5.1 Flaky
? ? 該特性用來(lái)標(biāo)識(shí)不夠穩(wěn)定的測(cè)試用例集,即有些用例運(yùn)行時(shí),時(shí)而成功時(shí)而失敗。其用意主要如下所示:
- 當(dāng)用例失敗的情況下,能夠獲取足夠詳細(xì)的信息
- 不標(biāo)記為Flaky的話,可能就要禁用這些測(cè)試
? ? 用法如下所示:
@Flaky
public void aTestWhichFailsFromTimeToTime {
...
}
5.2 Environment
? ? Environment表示環(huán)境變量參數(shù),用來(lái)顯示本次測(cè)試運(yùn)行環(huán)境的參數(shù)。在生成allure-result結(jié)果前,通過(guò)創(chuàng)建environment.properties或environment.xml文件,并把文件放置到allure-result目錄中。
environment.properties
Browser=Chrome
Browser.Version=95.0
Stand=Production
environment.xml
<environment>
<parameter>
<key>Browser</key>
<value>Chrome</value>
</parameter>
<parameter>
<key>Browser.Version</key>
<value>95.0</value>
</parameter>
<parameter>
<key>Stand</key>
<value>Production</value>
</parameter>
</environment>
environment.properties和environment.xml不允許存在中文。
5.3 Categories
? ? 默認(rèn)分類分為兩種,如下所示:
- Product defects:產(chǎn)品缺陷,測(cè)試結(jié)果為失?。╢ailed tests)
- Test defects:測(cè)試缺陷,測(cè)試結(jié)果為錯(cuò)誤(broken tests)
? ? 除了默認(rèn)分類之外,也可以自定義創(chuàng)建分類。通過(guò)創(chuàng)建categories.json文件,在生成allure-result結(jié)果前,提前放置到該目錄即可。
categories.json
[
{
"name": "Ignored tests",
"matchedStatuses": ["skipped"]
},
{
"name": "Infrastructure problems",
"matchedStatuses": ["broken", "failed"],
"messageRegex": ".*bye-bye.*"
},
{
"name": "Outdated tests",
"matchedStatuses": ["broken"],
"traceRegex": ".*FileNotFoundException.*"
},
{
"name": "Product defects",
"matchedStatuses": ["failed"]
},
{
"name": "Test defects",
"matchedStatuses": ["broken"]
}
]
- name(必填項(xiàng)):分類名稱
- matchedStatuses(可選項(xiàng)):測(cè)試用例的運(yùn)行結(jié)果,默認(rèn)值["failed", "broken", "passed", "skipped", "unknown"]
- messageRegex(可選項(xiàng)):測(cè)試用例運(yùn)行的錯(cuò)誤信息,默認(rèn)是 .* ,通過(guò)正則進(jìn)行匹配
- traceRegex(可選項(xiàng)):測(cè)試用例運(yùn)行的錯(cuò)誤堆棧信息,默認(rèn)是 .* ,通過(guò)正則進(jìn)行匹配
6.Allure與Pytest集成
6.1 Allure行為驅(qū)動(dòng)
? ? allure除了支持Pytest自帶的特性之外(fixture、parametrize、xfail、skip),自身也有非常強(qiáng)大的特性,下面來(lái)詳細(xì)介紹。
6.1.1 @allure.step
? ? allure報(bào)告允許對(duì)每個(gè)測(cè)試用例的執(zhí)行步驟進(jìn)行詳細(xì)說(shuō)明,該功能通過(guò)@allure.step()裝飾器來(lái)實(shí)現(xiàn)
@allure.step()只有一個(gè)參數(shù),就是title
6.1.2 @allure.attach
? ? allure報(bào)告支持添加附件并進(jìn)行展示,可用以補(bǔ)充測(cè)試結(jié)果,第一種基本語(yǔ)法如下所示:
allure.attach(body, name, attachment_type, extension)
- body:要顯示的附件內(nèi)容
- name:附件名稱
- attachment_type:附件類型,屬于allure.attachment_type里面的一種
- extension:附件擴(kuò)展名
allure.attachment_type主要有TEXT、CSV、HTML、XML、JSON、YAML、PCAP、PNG、JPG、SVG、GIF、BMP、MP4、OGG、WEBM、PDF等
? ? 第二種基本語(yǔ)法如下所示:
allure.attach.file(source, name, attachment_type, extension)
- source:上傳文件所在路徑
- 其他參數(shù)和上面參數(shù)一致
6.1.3 @allure.description
? ? 給用例添加詳細(xì)的描述,常見語(yǔ)法有三種:
1.@allure.description(str)
2.在測(cè)試用例函數(shù)聲明下方添加 """ """
3.@allure.description_html(str)
相當(dāng)于傳一個(gè)HTML代碼組成的字符串,類似 allure.attach()中傳HTML
方式一和方式二作用和效果是一樣的
6.1.4 @allure.title
? ? 添加測(cè)試用例標(biāo)題,支持占位符傳遞關(guān)鍵字參數(shù)(動(dòng)態(tài)標(biāo)題,結(jié)合(@pytest.mark.parametrize使用)
如果沒有添加 @allure.title()的話,測(cè)試用例的標(biāo)題默認(rèn)就是函數(shù)名
6.1.5 @allure.link&@allure.issue&@allure.testcase
? ? 三個(gè)裝飾器源碼如下所示:
def link(url, link_type=LinkType.LINK, name=None):
return safely(plugin_manager.hook.decorate_as_link(url=url, link_type=link_type, name=name))
def issue(url, name=None):
return link(url, link_type=LinkType.ISSUE, name=name)
def testcase(url, name=None):
return link(url, link_type=LinkType.TEST_CASE, name=name)
- issue()和testcase()調(diào)用的也是link(),只是link_type不一樣
- url:跳轉(zhuǎn)的鏈接,必傳參數(shù)
- name:顯示在allure報(bào)告的名字,如果不傳就是顯示完整的鏈接
出現(xiàn)三個(gè)裝飾器的原因是為了更好地將鏈接分類訪問(wèn)連接、Bug鏈接、測(cè)試用例鏈接
6.1.6 BDD標(biāo)記裝飾器
? ? 在pytest中,可以使用@pytest.mark進(jìn)行標(biāo)識(shí),但并不會(huì)顯示在allure報(bào)告上,而allure也提供了三種類型的標(biāo)記裝飾器,它們則是可以顯示在allure報(bào)告上的,如下所示:
- @allure.epic:敏捷里面的概念,往下是 feature
- @allure.feature:功能點(diǎn)的描述,理解成模塊往下是 story
- @allure.story:故事,往下是 title
1.story 是 feature 的子集,當(dāng)測(cè)試用例有 @allure.feature、@allure.story 時(shí),在報(bào)告上會(huì)先顯示 feature,點(diǎn)開之后再顯示 story
2.如果不加 @allure.feature、@allure.story 時(shí),在Behaviors欄目下,測(cè)試用例都不會(huì)分類顯示
? ? 用命令行方式運(yùn)行時(shí),可以指定運(yùn)行某個(gè)story、feature、epic
--allure-epics
--allure-features
--allure-stories
6.1.7 @allure.severity
? ? allure提供了用例級(jí)別,因此在allure報(bào)告可以清晰看到不同級(jí)別用例的缺陷數(shù)量。詳細(xì)等級(jí)如下所示:
| 級(jí)別 | 含義 | 詳細(xì)解釋 |
|---|---|---|
| blocker | 阻塞缺陷 | 無(wú)法執(zhí)行下一步操作等 |
| critical | 嚴(yán)重缺陷 | 功能點(diǎn)缺失或直接崩潰等 |
| normal | 一般缺陷 | 邊界值問(wèn)題,格式錯(cuò)誤等 |
| minor | 次要缺陷 | UI類錯(cuò)誤等 |
| trivial | 輕微缺陷 | 必填項(xiàng)無(wú)提示或提示信息不規(guī)范和統(tǒng)一等 |
6.2 Allure和Pytest安裝
? ? 執(zhí)行以下命令安裝即可:
pip install -U allure-pytest pytest
6.3 Allure與Pytest集成示例
6.3.1 allure.step示例
? ? 示例代碼如下所示:
import pytest
import allure
import os
@allure.step("這是第一步")
def inputUrl(url:str):
print(f"輸入的網(wǎng)址為:{url}")
@allure.step(title="這是第二步")
def locateElement(xpath:str):
print(f"查找元素的xpath是{xpath}")
@allure.step("這是第三步")
def sendElement():
inputUsernameAndPasswd("Surpass","password")
@allure.step("這是第四步,{username},{password}")
def inputUsernameAndPasswd(username:str,password:str):
print(f"輸入的用戶名和密碼分別為:{username},{password}")
@allure.step("這是第五步")
def test_login():
inputUrl("https://www.baidu.com")
locateElement('//*[@id="su"]')
sendElement()
? ? 生成結(jié)果如下所示:

6.3.2 allure.attach示例
? ? 示例代碼如下所示:
import pytest
import allure
import os
def attach01(body,name,attachment_type=allure.attachment_type.TEXT):
"""
附件為內(nèi)容
"""
allure.attach(body,name,attachment_type=attachment_type)
def attach02(filePath,name,attachment_type=allure.attachment_type.TEXT):
"""
附件為文件
"""
allure.attach.file(filePath,name,attachment_type=attachment_type)
def test_attach01():
body = "<h3>方法一:測(cè)試allure附件內(nèi)容為HTML</h3>"
name = "attach-01-test"
attach01(body,name,attachment_type=allure.attachment_type.HTML)
def test_attach02():
filePath=os.path.join(os.getcwd(),"attach","sample.png")
name="attach-02-test"
attach02(filePath,name,attachment_type=allure.attachment_type.PNG)
? ? 生成結(jié)果如下所示:

6.3.3 allure.description示例
? ? 示例代碼如下所示:
import pytest
import allure
def test_allureDescription01():
"""這是一個(gè)allure.description示例01"""
assert (7+8)==15
@allure.description("這是一個(gè)allure.description示例02")
def test_allureDescription02():
assert (7+8)==15
@allure.description_html("""
<h2>這是一個(gè)
<font size=15>allure.description </font>示例03
</h2>
""")
def test_allureDescription03():
assert (7+8)==15
? ? 生成結(jié)果如下所示:

6.3.4 allure.title示例
? ? 示例代碼如下所示:
import pytest
import allure
@allure.title("登錄")
@pytest.fixture(scope="session")
def loginData(request):
params=request.param
name=params.get("name","")
password=params.get("password","")
code=params.get("code","")
print(f"param is {name},{password},{code}")
yield name,password,code
@allure.title(f"登錄成功")
@pytest.mark.parametrize("loginData",[
{"name":"Surpass","password":"123456","code":"SHCQ"},
{"name":"Diana","password":"20210227","code":"FKDT"}
],indirect=True)
def test_loginSucces(loginData):
name,password,code=loginData
body=f"用戶名:{name},密碼:{password},驗(yàn)證碼:{code}"
name="allure.title.test"
allure.attach(body,name,attachment_type=allure.attachment_type.TEXT)
? ? 生成結(jié)果如下所示:

6.3.5 allure.link&allure.issue&allure.testcase示例
? ? 示例代碼如下所示:
import pytest
import allure
@allure.link("https://www.google.com")
def test_basicLink():
pass
@allure.link(url="https://www.surpassme.com",name="basicLink")
def test_basicLinkWithName():
pass
@allure.issue(url="https://www.baidu.com",name="issueLink")
def test_issueLink():
pass
@allure.testcase(url="https://www.zentao.net",name="testcaseLink")
def test_testcaseLink():
pass
? ? 生成結(jié)果如下所示:

6.3.6 BDD標(biāo)記裝飾器示例
? ? 示例代碼如下所示:
import pytest
import allure
@allure.step("第一步")
def firstStep():
print("這是第一步")
@allure.step("第二步")
def secondStep():
print("這是第二步")
@allure.step("第N步")
def nStep():
print("第N步")
@allure.epic("總體描述")
@allure.feature("測(cè)試模塊A")
class TestEpicAndFeatureAndStory():
@allure.issue("http://www.surpamssme.com/issue/id=0227")
@allure.testcase("http://www.surpassme.com/testcase/id=0227")
@allure.title("功能A-用例-01")
@allure.story("測(cè)試功能A")
@allure.description("Surpassme 測(cè)試驗(yàn)證")
def test_CaseA01(self):
print("test_Case01")
firstStep()
secondStep()
@allure.story("測(cè)試功能A")
@allure.title("功能A-用例-02")
def test_CaseA02(self):
pass
@allure.story("測(cè)試功能A")
@allure.title("功能A-用例-03")
def test_CaseA03(self):
pass
@allure.story("測(cè)試功能B")
@allure.title("功能B用例-01")
def test_CaseB01(self):
pass
@allure.story("測(cè)試功能B")
@allure.title("功能B用例-03")
def test_CaseB02(self):
pass
? ? 生成結(jié)果如下所示:

6.3.7 allure.severity
? ? 示例代碼如下所示:
import allure
@allure.title("blocker")
@allure.severity("blocker")
def test_Case01():
pass
@allure.title("critical")
@allure.severity("critical")
def test_Case02():
pass
@allure.title("normal")
@allure.severity("normal")
def test_Case03():
pass
@allure.title("minor")
@allure.severity("minor")
def test_Case04():
pass
@allure.title("trivial")
@allure.severity("trivial")
def test_Case05():
pass
? ? 生成結(jié)果如下所示:
