六窗骑、Allure測(cè)試報(bào)告定制

Allure介紹

  • allure是一個(gè)輕量級(jí)但惶,靈活的,支持多語言的測(cè)試報(bào)告工具;多平臺(tái)的,奢華的report框架;
  • 可以為dev/qa提供詳盡的的測(cè)試報(bào)告耳鸯、測(cè)試步驟、log;也可以為管理理層提供high level統(tǒng)計(jì)報(bào)告;
  • Java語言開發(fā)的,支持pytest膀曾,JaveScriipt县爬,PHP, ruby等
  • 可以集成到Jenkins

Allure報(bào)表預(yù)覽

image.png
image.png

Allure安裝


針對(duì) Pytest 測(cè)試框架安裝

  • 針對(duì) Pytest 測(cè)試框架還需安裝 allure-pytest 第三方庫(kù):pip install allure-pytest
  • 用法:pytest --alluredir=/tmp/my_allure_results添谊,將測(cè)試報(bào)告文件存放到/tmp/my_allure_results 目錄下
  • 查看報(bào)告:allure serve /tmp/my_allure_results
  1. 測(cè)試文件 test_pytest.py 文件如下:
import pytest

def test_success():
    """this test succeeds"""
    assert True


def test_failure():
    """this test fails"""
    assert False


def test_skip():
    """this test is skipped"""
    pytest.skip('for a reason!')


def test_broken():
    raise Exception('oops')
  1. 在pycharm的terminal中切換到當(dāng)前路徑财喳,運(yùn)行pytest test_allure.py --alluredir=./results/1,就能在目錄中生成測(cè)試報(bào)告文件如下,一個(gè)測(cè)試用例對(duì)應(yīng)一個(gè) .json 文件:
    image.png
  2. 在terminal中運(yùn)行allure_practice>allre serve ./results/1 就能自動(dòng)打開網(wǎng)頁(yè)查看報(bào)告
    image.png

使用 Allure2 生成精美報(bào)告

  • 安裝allure-pytest插件
    • pip install allure-pytest
  • 運(yùn)行:
    • 在測(cè)試執(zhí)行期間收集結(jié)果
      • pytest [測(cè)試文件] -s -q --alluredir=./ result/(--alluredir 這個(gè)選項(xiàng)用于指定存儲(chǔ)測(cè)試結(jié)果的路徑)
  • 查看測(cè)試報(bào)告
    • 方式一:測(cè)試完成后查看實(shí)際報(bào)告耳高,在線看報(bào)告扎瓶,會(huì)直接打開默認(rèn)瀏覽器展示當(dāng)前報(bào)告
      • allure serve ./result/ (注意這里的serve書寫)
    • 方式二:從結(jié)果生成報(bào)告,這是一個(gè)啟動(dòng) tomcat 的服務(wù)泌枪,可以永久打開概荷,需要兩個(gè)步驟:生成報(bào)告,打開報(bào)告
      • 生成報(bào)告
        • allure generate ./result/ -o ./report/ --clean(注意:覆蓋路徑加 --clean )
      • 打開報(bào)告
        • `alure open -h 127.0.0.1 -p 8883 ./report/
  • 關(guān)閉報(bào)告:在terminal中使用ctrl+c
使用上面的例子
  1. 在pycharm的terminal中切換到當(dāng)前路徑碌燕,運(yùn)行pytest test_allure.py --alluredir=./results/1
  2. 在terminal 中運(yùn)行allure generate ./results/1 -o ./report/1 --clean误证,會(huì)在report目錄下生成報(bào)告文件如下,包括了.json .txt .html .js .css .ico等文件:
    image.png

Allure常用特性

  • 場(chǎng)景:
    • 希望在報(bào)告中看到測(cè)試功能陆蟆,子功能或場(chǎng)景雷厂,測(cè)試步驟,包括測(cè)試附加信息
  • 解決:
    • @Feature叠殷,@story改鲫,@step,@attach
  • 步驟:
    • import allure
    • 功能上加 @allure.feature('功能名稱')
    • 子功能上加@allure.story('子功能名稱')
    • 步驟上加@allure.step('步驟細(xì)節(jié)')
    • @allure.attach('具體文本信息)林束,需要附加的信息像棘,可以是數(shù)據(jù),文本壶冒,圖片缕题,視頻,網(wǎng)頁(yè)
    • 如果只測(cè)試登錄功能運(yùn)行的時(shí)候可以加限制過濾:
      • pytest [文件名] --allure_features '購(gòu)物車功能' --allure-stories '加入購(gòu)物車' (注意這里—allure_features中間是下劃線)
  • 實(shí)例test_feature_story.py代碼如下
import pytest
import allure

# 標(biāo)識(shí)整個(gè)模塊都用來進(jìn)行登錄
@allure.feature('登錄模塊')
class TestLogin():

    @allure.story('登錄成功')
    def test_login_success(self):
        print("這是登錄:測(cè)試用例胖腾,登陸成功")
        pass

    @allure.story('登錄失敗')
    def test_login_fail(self):
        print("這是登錄:測(cè)試用例烟零,登陸失敗")
        pass

    @allure.story('用戶名缺失')
    def test_login_lostname(self):
        print("用戶名缺失")
        pass

    @allure.story('密碼缺失')
    def test_login_lostsec(self):

        # 對(duì)一些關(guān)鍵步驟進(jìn)行標(biāo)記
        with allure.step("點(diǎn)擊用戶名"):
            print("輸入用戶名")
        with allure.step("點(diǎn)擊密碼"):
            print("輸入密碼")
        print("點(diǎn)擊登錄")
        with allure.step("點(diǎn)擊登錄之后登錄失敗"):
            assert "1" == 1
            print("登錄失敗")
        pass

    @allure.story("登錄失敗")
    def test_login_failure(self):
        pass
  1. Terminal中輸入pytest test_feature_story.py --alluredir=./results/2,生成報(bào)告文件
  2. Terminal中輸入allure serve ./results/2咸作,打開測(cè)試報(bào)告
    image.png

    image.png
  3. 指定 feature 運(yùn)行锨阿,執(zhí)行pytest -v test_feature_story.py --allure-features '登錄模塊'-v 為打印詳細(xì)信息
  4. 指定 story 運(yùn)行记罚,執(zhí)行pytest -v test_feature_story.py --allure-stories '登錄成功'

Allure特性-feature/story

  • 注解@allure.feature 與@allure.store的關(guān)系
    • feature相當(dāng)于一個(gè)功能墅诡,一個(gè)大的模塊,將case分類到某個(gè)feature中桐智,報(bào)告中Behaviors 中顯示末早,相當(dāng)于testsuite
  • story相當(dāng)于對(duì)應(yīng)這個(gè)功能或者模塊下的不同場(chǎng)景、分支功能说庭,屬于feature之下的結(jié)構(gòu)然磷,報(bào)告在
    features中顯示,相當(dāng)于testcase
  • feature與story類似于父子關(guān)系

Allure特性-step

  • 測(cè)試過程中每個(gè)步驟刊驴,一般放在具體邏輯方法中
  • 可以放在關(guān)鍵步驟中样屠,在報(bào)告中顯示
  • 在app, web自動(dòng)測(cè)試當(dāng)中,建議每切換到一個(gè)新的頁(yè)面當(dāng)做一個(gè)step用法:
    • @allure.step() 只能以裝飾器的形式放在類或者方法上面
    • with allure.step() 可以放在測(cè)試用例方法里面,但測(cè)試步驟的代碼需要被該語句包含

Allure特性-issue痪欲,testcase

  • 關(guān)聯(lián)測(cè)試用例(可以直接給測(cè)試用例的地址鏈接)
  • 關(guān)聯(lián)bug
  1. 加入鏈接示例:@allure.link("www.baidu.com")
import allure

@allure.link("www.baidu.com")
def test_with_link():
    print("這是一條加了鏈接的測(cè)試")
    pass
  • 執(zhí)行結(jié)果報(bào)告


    image.png
  1. 給鏈接取別名:@allure.link("www.baidu.com", name="百度一下")
import allure

@allure.link("www.baidu.com", name="百度一下")
def test_with_link():
    print("這是一條加了鏈接的測(cè)試")
    pass
  • 執(zhí)行結(jié)果報(bào)告


    image.png
  1. 加入測(cè)試用例的鏈接:@allure.testcase(TST_CASE_LINK, '登錄用例')
import allure

TST_CASE_LINK ='https://github.com/qameta/allure-integrations/issues/8#issuecomment-268313637'
@allure.testcase(TST_CASE_LINK, '登錄用例')
def test_with_testcase_link():
    print("這是一條測(cè)試用例的鏈接,鏈接到測(cè)試用例里面")
    pass
  • 執(zhí)行結(jié)果報(bào)告


    image.png
  1. 通過傳入的bugID生成bug鏈接:@allure.issue('BugID', 鏈接名')攻礼,運(yùn)行時(shí)指定鏈接地址
import allure

# 測(cè)試bug鏈接业踢,前面為bugID
"""
在運(yùn)行時(shí)加入bug鏈接: --allure-link-pattern=issue:http://www.mytesttracker.com/issue/{}
中括號(hào)里面就會(huì)傳bugID
"""
@allure.issue('140', '這是一個(gè)issue')
def test_with_issue_link():
    pass
  • 在terminal中運(yùn)行時(shí)需要加入bug鏈接:pytest test_link_issue.py --allure-link-pattern=issue:http://www.mytesttracker.com/issue/{} --alluredir=./results/6,花括號(hào)內(nèi)會(huì)自動(dòng)傳入BugID
  • 報(bào)告運(yùn)行結(jié)果


    image.png

按重要性級(jí)別進(jìn)行一定范圍的測(cè)試

  • 場(chǎng)景
    • 通常測(cè)試有P0礁扮、冒煙測(cè)試知举、驗(yàn)證上線測(cè)試。按重要性級(jí)別來分別執(zhí)行的太伊,比如上線要把主流程和重要模塊都跑一遍
  • 解決:
    • 通過附加py.test.mark標(biāo)記
    • 通過allure.feature雇锡,allure.story
    • 也可以通過allure.severity來附加標(biāo)記
      • 級(jí)別:Trivial不重要,Minor不太重要僚焦,Normal正常問題锰提,Critical嚴(yán)重,Blocker阻塞
  • 步驟:
    • 在方法芳悲、函數(shù)和類上面加
      • @allure.severity(allure.severity_level.TRIVIAL)
    • 執(zhí)行時(shí)
      • py.test -s -v [文件名] --allure-severities norma,critical
  • 缺陷等級(jí)
名稱 描述
Blocker級(jí)別 中斷缺陷(客戶端程序無響應(yīng)立肘,無法執(zhí)行下一步操作)
Critical級(jí)別 臨界缺陷(功能點(diǎn)缺失)
Normal級(jí)別 普通缺陷(數(shù)值計(jì)算錯(cuò)誤)
Minor級(jí)別 次要缺陷(界面錯(cuò)誤與UI需求不符)
Trivial級(jí)別 輕微缺陷(必輸項(xiàng)無提示,或者提示不規(guī)范)
  1. 執(zhí)行嚴(yán)重級(jí)別為 normal和critical的測(cè)試用例:pytest -v test_severity.py --allure-severities normal,critical --alluredir=./results/7
import allure
def test_with_no_severity_label():
    pass

@allure.severity(allure.severity_level.TRIVIAL)
def test_with_trivial_severity():
    pass

@allure.severity(allure.severity_level.NORMAL)
def test_with_normal_severity():
    pass

@allure.severity(allure.severity_level.NORMAL)
class TestClassWithNormalSeverity(object):
    def test_inside_the_normal_severity_test_class(self):
        pass

    @allure.severity(allure.severity_level.CRITICAL)
    def test_inside_the_normal_severity_test_class_with_overriding_critical_severity(self):
        pass
  • 執(zhí)行結(jié)果報(bào)告


    image.png

在pycharm中配置默認(rèn)的allure參數(shù)

配置以后直接鼠標(biāo)右鍵-> run 'pytest for ...' 即可


image.png

前端自動(dòng)化測(cè)試-截圖

  • 場(chǎng)景:
    • 前端自動(dòng)化測(cè)試經(jīng)常需要附加圖片或html名扛,在適當(dāng)?shù)牡胤搅履辏m當(dāng)?shù)臅r(shí)機(jī)截圖
  • 解決:
    • @allure.attach顯示許多不同類型的提供的附件,可以補(bǔ)充測(cè)試肮韧,步驟或測(cè)試結(jié)果融蹂。
  • 步驟:
    • 在測(cè)試報(bào)告里附加網(wǎng)頁(yè):
      • allure.attach(body(內(nèi)容), name, attachment_type, extension)
      • allure.attach('<head></head><body>首頁(yè)</body>,'這是錯(cuò)誤頁(yè)的結(jié)果信息',allure.attachment_type.HTML)
    • 在測(cè)試報(bào)告里附加圖片:
      • allure.attach.file(source, name, attachment_type, extension)
      • allure.attach.file("./ result/b.png" , attachment_type=allure.attachment_type.PNG)
  • 代碼示例
import allure
import pytest

def test_attach_text():
    allure.attach("這是一個(gè)純文本", attachment_type=allure.attachment_type.TEXT)

def test_attach_htlm():
    allure.attach("<body>這是一段html body塊</body>", 'html測(cè)試塊', attachment_type=allure.attachment_type.HTML)

def test_attach_photo():
    allure.attach(r"D:\Programs\DevOps\Python_Practice\allure_practice\resource\1.png",
                  name="這是一個(gè)圖片", attachment_type=allure.attachment_type.PNG)
  • 運(yùn)行結(jié)果報(bào)告


    image.png
  • 運(yùn)行結(jié)果圖片展示出來弄企,是因?yàn)檎{(diào)用的方法allure.attach(r"D:\Programs\DevOps\Python_Practice\allure_practice\resource\1.png", name="這是一個(gè)圖片", attachment_type=allure.attachment_type.PNG)有誤超燃,應(yīng)該調(diào)用allure.attach.file() 方法
  • 修改后的代碼:
import allure
import pytest

def test_attach_text():
    allure.attach("這是一個(gè)純文本", attachment_type=allure.attachment_type.TEXT)

def test_attach_htlm():
    allure.attach("<body>這是一段html body塊</body>", 'html測(cè)試塊', attachment_type=allure.attachment_type.HTML)

# 調(diào)用圖片要使用file方法
def test_attach_photo():
    allure.attach.file(r"D:\Programs\DevOps\Python_Practice\allure_practice\resource\1.png",
                  name="這是一個(gè)圖片", attachment_type=allure.attachment_type.PNG)
  • 修改后的運(yùn)行結(jié)果


    image.png

實(shí)戰(zhàn):pytest+allure+selenium

  • 代碼
import time
import allure
import pytest
from selenium import webdriver

@allure.testcase("http://www/github.com", "測(cè)試用例地址")
@allure.feature("百度搜索")
@pytest.mark.parametrize('test_data', ['allure', 'pytest', 'unittest'])
def test_steps_demo(test_data):

    with allure.step("打開百度網(wǎng)頁(yè)"):
        driver = webdriver.Chrome()
        driver.maximize_window() # 瀏覽器最大化
        driver.get("http://www.baidu.com")

    with allure.step("輸入搜索詞"):
        driver.find_element_by_id("kw").send_keys(test_data)
        time.sleep(2)
        driver.find_element_by_id("su").click()
        time.sleep(2)

    with allure.step("保存圖片"):
        driver.save_screenshot("./resource/b.png")
        allure.attach.file("./resource/b.png", attachment_type=allure.attachment_type.PNG)
        allure.attach('<head></head><body>首頁(yè)</body>','Attach with HTML type',allure.attachment_type.HTML)

    with allure.step("關(guān)閉瀏覽器"):
        driver.quit()
  • 運(yùn)行結(jié)果


    image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市桩蓉,隨后出現(xiàn)的幾起案子淋纲,更是在濱河造成了極大的恐慌,老刑警劉巖院究,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洽瞬,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡业汰,警方通過查閱死者的電腦和手機(jī)伙窃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來样漆,“玉大人为障,你說我怎么就攤上這事。” “怎么了鳍怨?”我有些...
    開封第一講書人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵呻右,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我鞋喇,道長(zhǎng)声滥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任侦香,我火速辦了婚禮落塑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘罐韩。我一直安慰自己憾赁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開白布散吵。 她就那樣靜靜地躺著龙考,像睡著了一般。 火紅的嫁衣襯著肌膚如雪错蝴。 梳的紋絲不亂的頭發(fā)上洲愤,一...
    開封第一講書人閱讀 51,231評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音顷锰,去河邊找鬼柬赐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛官紫,可吹牛的內(nèi)容都是我干的肛宋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼束世,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼酝陈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起毁涉,我...
    開封第一講書人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤沉帮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后贫堰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體穆壕,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年其屏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了喇勋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡偎行,死狀恐怖川背,靈堂內(nèi)的尸體忽然破棺而出贰拿,到底是詐尸還是另有隱情,我是刑警寧澤熄云,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布膨更,位于F島的核電站,受9級(jí)特大地震影響缴允,放射性物質(zhì)發(fā)生泄漏询一。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一癌椿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧菱阵,春花似錦踢俄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至虑稼,卻和暖如春琳钉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蛛倦。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工歌懒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人溯壶。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓及皂,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親且改。 傳聞我的和親對(duì)象是個(gè)殘疾皇子验烧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容