jmeter jtl 生成 allurereport

別的不說逛球,直接上代碼
主要邏輯:
通過jmeter 運行后生成的jtl(output=xml)格式的結(jié)果谒出,通過python腳本轉(zhuǎn)html報告痹籍。(output=csv格式的jmeter -o 自帶的可以生成)

準備python3環(huán)境+python+allure
vim JtlToReportHTML.py

# -*- coding: utf-8 -*-
# @Time    : 2022/4/11 下午6:06
# @Author  : sleeli
# @File    : JtlToReportHTML.py
# @Software: PyCharm


# -*- coding: utf-8 -*-
# @Time    : 2022/4/11 4:29 下午
import xml.etree.cElementTree as ET
import json, os, uuid
import sys


# xmlObject xml工程
# checkString 這個其實是固定值 httpSample氓仲,只不過后面想要獲取其他結(jié)構(gòu)參數(shù)化
# num 當(dāng)時想嵌套多層朗恳,后來發(fā)現(xiàn)allure只三層結(jié)構(gòu),其實這個也沒啥用
# result 傳遞解析的xml
# demoFile 生成的pytes文件
# featureIndex 用來排序參數(shù)用例蔚叨,按照jmeter中的樹結(jié)果
# storyIndex 同上床蜘,是第二層級的排序
def checkChildren(xmlObject, checkString, num, result, demoFile, featureIndex, storyIndex):
    for children in xmlObject:
        try:
            if num == 1 and children.attrib['sby'] != "0":
                featureIndexStr = '#' + str(featureIndex) + " " if featureIndex >= 10 else '#0' + str(
                    featureIndex) + " "
                result["feature"] = featureIndexStr + children.attrib['lb']
                featureIndex += 1
            if num >= 2 and children.tag == "sample":
                storyIndexStr = '#' + str(storyIndex) + " " if storyIndex >= 10 else '#0' + str(
                    storyIndex) + " "
                result["story"] = storyIndexStr + children.attrib['lb']
                storyIndex += 1
        except:
            pass
        if children.tag == checkString:
            result['case_name'] = children.attrib['lb']
            for httpSampleChildren in children:
                result[httpSampleChildren.tag] = httpSampleChildren.text
                if httpSampleChildren.tag == 'assertionResult':
                    for assertionResultChildren in httpSampleChildren:
                        result[assertionResultChildren.tag] = assertionResultChildren.text
            feature = result['feature'] if "feature" in result else None
            story = result['story'] if 'story' in result else None
            case_name = result['case_name'] if 'case_name' in result else None
            URL = result['java.net.URL'] if 'java.net.URL' in result else None
            method = result['method'] if 'method' in result else None
            requestHeader = result['requestHeader'] if 'requestHeader' in result else None
            queryString = result['queryString'] if 'queryString' in result else None
            responseData = result['responseData'] if 'responseData' in result else None
            failureMessage = result['failureMessage'] if 'failureMessage' in result else None
            failure = result['failure'] if 'failure' in result else "false"
            print(feature, story, case_name, failureMessage, URL)
            storyString = "@allure.story('" + result['story'] + "') # 二級目錄" if 'story' in result else ''
            pyString = '''
@allure.feature('{feature}') # 一級目錄{story}
@allure.title("{case_name}")
def test_allure_report_{num}():
    with allure.step('請求url:{URL}'):
        print('請求url:{URL}')
    with allure.step('請求方法:{method}' ):
        print('請求方法:{method}' )
    with allure.step('請求頭:{requestHeader}' ):
        print('請求頭:{requestHeader}' )
    with allure.step(\'''請求數(shù)據(jù):{queryString}\'''):
        print(\'''請求數(shù)據(jù):{queryString}\''')
    with allure.step(\'''接口返回:{responseData}\'''):
        print(\'''接口返回:{responseData}\''')
    with allure.step(\'''斷言結(jié)果:{failureMessage}\'''):
        print(\'''斷言結(jié)果:{failureMessage}\''')
    assert "{failure}" == 'false' '''.format(feature=feature, story=storyString, case_name=case_name,
                                             num=str(uuid.uuid1()).replace('-', ''),
                                             URL=URL, method=method,
                                             requestHeader=str(requestHeader).replace('\n', '').replace('\r', ''),
                                             queryString=str(json.dumps(queryString)).replace("'", "\""),
                                             responseData=str(json.dumps(responseData)).replace("'", "\""),
                                             failureMessage=str(failureMessage).replace("'", "\""), failure=failure)
            print(pyString)
            with open(demoFile, 'a') as c:
                c.write(pyString)
        else:
            checkChildren(children, checkString, num + 1, result, demoFile, featureIndex, storyIndex)


if __name__ == '__main__':
    # 通過命令行來執(zhí)行 ,例如python3 JtlToReportHTML.py test.jtl test_demo.py report
    commonndLines = sys.argv
    print(commonndLines)
    with open(commonndLines[2], "w") as demo:
        demo.write('''
# -*- coding: utf-8 -*-
import allure
''')
    report_resource = commonndLines[3]+"/resource"
    report_html = commonndLines[3] + "/html"

    tree = ET.parse(commonndLines[1])
    root = tree.getroot()
    checkChildren(root, "httpSample", 1, {}, commonndLines[2], 1, 1)
    pyString = 'pytest --capture=no ' + commonndLines[2] + ' --alluredir ' + report_resource
    os.system(pyString)
    alSring = "allure generate " + report_resource + " -o " + report_html + " --clean"
    os.system(alSring)

通過命令行來執(zhí)行 蔑水,例如

# 會自動創(chuàng)建報告目錄report2
python3 JtlToReportHTML.py test.jtl test_demo.py report2

報告目錄下有有資源和文檔邢锯,如下(我是在report2目錄下生成的報告)


image.png

然后啟動谷歌瀏覽器的本地模式(我的mac,其他系統(tǒng)的自己百度吧搀别,關(guān)鍵字搜索瀏覽器本地跨域 )

open -n /Applications/Google\ Chrome.app/ --args --disable-web-security  --user-data-dir=MyChromeDevUserData

最后將report/html/index.html拖到瀏覽器打開查看效果:(注意瀏覽器需要完全退出后在開本地模式丹擎,否則不生效)


image.png
htmlreport.gif
htmlreport2.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市领曼,隨后出現(xiàn)的幾起案子鸥鹉,更是在濱河造成了極大的恐慌蛮穿,老刑警劉巖庶骄,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毁渗,死亡現(xiàn)場離奇詭異,居然都是意外死亡单刁,警方通過查閱死者的電腦和手機灸异,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來羔飞,“玉大人肺樟,你說我怎么就攤上這事÷咛剩” “怎么了么伯?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長卡儒。 經(jīng)常有香客問我田柔,道長,這世上最難降的妖魔是什么骨望? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任硬爆,我火速辦了婚禮,結(jié)果婚禮上擎鸠,老公的妹妹穿的比我還像新娘缀磕。我一直安慰自己,他們只是感情好劣光,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布袜蚕。 她就那樣靜靜地躺著,像睡著了一般绢涡。 火紅的嫁衣襯著肌膚如雪廷没。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天垂寥,我揣著相機與錄音颠黎,去河邊找鬼。 笑死滞项,一個胖子當(dāng)著我的面吹牛狭归,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播文判,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼过椎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了戏仓?” 一聲冷哼從身側(cè)響起疚宇,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤亡鼠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后敷待,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體间涵,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年榜揖,在試婚紗的時候發(fā)現(xiàn)自己被綠了勾哩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡举哟,死狀恐怖思劳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情妨猩,我是刑警寧澤潜叛,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站壶硅,受9級特大地震影響威兜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜森瘪,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一牡属、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扼睬,春花似錦逮栅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至军俊,卻和暖如春侥加,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背粪躬。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工担败, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人镰官。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓提前,卻偏偏與公主長得像,于是被迫代替她去往敵國和親泳唠。 傳聞我的和親對象是個殘疾皇子狈网,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

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