Allure快速入門

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.propertiesenvironment.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é)果如下所示:

01allure.step.png

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é)果如下所示:

02allure.attach.png

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é)果如下所示:

03allure.description.png

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é)果如下所示:

04allure.title.png

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é)果如下所示:

05allute.link.png

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é)果如下所示:

06allute.epic-feature-story.png

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é)果如下所示:

07allure.severity.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容