jmeter jtl 生成 allurereport

别的不说,直接上代码
主要逻辑:
通过jmeter 运行后生成的jtl(output=xml)格式的结果,通过python脚本转html报告。(output=csv格式的jmeter -o 自带的可以生成)

准备python3环境+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,只不过后面想要获取其他结构参数化
# num 当时想嵌套多层,后来发现allure只三层结构,其实这个也没啥用
# result 传递解析的xml
# demoFile 生成的pytes文件
# featureIndex 用来排序参数用例,按照jmeter中的树结果
# 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(\'''请求数据:{queryString}\'''):
        print(\'''请求数据:{queryString}\''')
    with allure.step(\'''接口返回:{responseData}\'''):
        print(\'''接口返回:{responseData}\''')
    with allure.step(\'''断言结果:{failureMessage}\'''):
        print(\'''断言结果:{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__':
    # 通过命令行来执行 ,例如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)

通过命令行来执行 ,例如

# 会自动创建报告目录report2
python3 JtlToReportHTML.py test.jtl test_demo.py report2

报告目录下有有资源和文档,如下(我是在report2目录下生成的报告)


image.png

然后启动谷歌浏览器的本地模式(我的mac,其他系统的自己百度吧,关键字搜索浏览器本地跨域 )

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

最后将report/html/index.html拖到浏览器打开查看效果:(注意浏览器需要完全退出后在开本地模式,否则不生效)


image.png
htmlreport.gif
htmlreport2.gif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容