Allure

简介

Allure是一款非常轻量级并且非常灵活的开源测试报告生成框架。 Allure 是一个独立的报告插件,生成美观易读的报告,它支持绝大多数测试框架, 例如TestNG、Pytest、JUint等。它简单易用,易于集成。

Allure 安装

安装 python 插件
安装 allure
  • 下载: https://bintray.com/qameta/generic/allure2
  • 前置条件:已部署java环境
  • 配置环境变量:bin 目录配置到 path 系统环境变量
  • 检查是都配置成功:cmd输入allure命令,测试是否安装成功
Allure使用
  • pytest.ini 配置文件
[pytest]
# 添加行参数
addopts = -s --alluredir ./report/result
# 文件搜索路径
testpaths = ./scripts
# 文件名称
python_files = test_*.py
# 类名称
python_classes = Test*
# 方法名称
python_functions = test_*
  • demo示例
@allure.feature("Allure测试标签")
class TestAllure:

    def setup(self):
        self.result = None

    def teardown(self):
        desc = "<font color='red'>实际结果:</br> </font>{}".format(self.result)
        allure.dynamic.description(desc)

    @allure.title("测试用例1")
    @allure.description("测试用例1描述")
    def test_01(self):
        print('----------test1---------')
        self.result = "test1"

    @allure.title("测试用例2")
    def test_02(self):
        print('-----------test2-----------')
        self.result = "test2"

    @allure.title("测试用例3")
    def test_03(self):
        print('----------test3------------')
        self.result = "test3"

if __name__ == '__main__':
pytest.main(['test_allure.py'])
  • 运行结果,查看report/result目录
  • 生成html格式,运行命令 allure generate report/result -o report/html --clean
  • 生成在线测试报告: allure serve report/result

Allure 详解

title 标题
@allure.title("用例标题1")
def test_1():
pass

@allure.title("用例标题2")
def test_2():
pass
description 描述
@allure.title("用例标题1")
@allure.description("这里是对test_1用例的一些详细说明")
def test_1():
pass

@allure.title("用例标题2")
def test_2():
"""
test_2的描述
"""
pass
标签 @allure.feature
@allure.feature('这里是一级标签:test')
class TestAllure:

@allure.title("用例标题1")
@allure.description("这里是对test_1用例的一些详细说明")
def test_1(self):
pass

@allure.title("用例标题2")
def test_2(self):
pass

@allure.title("用例标题3")
def test_3(self):
pass
标签 @allure.story
@allure.feature('这里是一级标签:test')
class TestAllure:

@allure.title("用例标题1")
@allure.description("这里是对test_1用例的一些详细说明")
@allure.story("这里是二级标签:test_1")
def test_1(self):
pass

@allure.story("这里是二级标签:test_2")
@allure.title("用例标题2")
def test_2(self):
pass

@allure.story("这里是二级标签:test_3")
@allure.title("用例标题3")
def test_3(self):
pass
@allure.severity

定义用例的级别,有BLOCKER,CRITICAL,MINOR,NORMAL,TRIVIAL等几种类型,默认是NORMAL。

@allure.feature('这里是一级标签:test')
class TestAllure: 

@allure.severity(allure.severity_level.BLOCKER)
@allure.title("用例标题1")
@allure.description("这里是对test_1用例的一些详细说明")
@allure.story("这里是二级标签:test_1")
def test_1(self):
pass

@allure.severity(allure.severity_level.CRITICAL)
@allure.story("这里是二级标签:test_2")
@allure.title("用例标题2")                      
def test_2(self):
pass

@allure.severity(allure.severity_level.NORMAL)
@allure.story("这里是二级标签:test_3")
@allure.title("用例标题3")
def test_3(self):
pass

只运行指定级别的用例
--allure_severities=critical,blocker

动态生成allure.dynamic
params_1={"name":"动态获取test1","method":"post","url":"http://www.baidu.com"}
params_2={"name":"动态获取test2","method":"get","url":"http://www.baidu.com"}
@allure.title("用例标题0")
@allure.severity(severity_level=allure.severity_level.CRITICAL)
def test_0():
pass

@allure.title("用例标题1")
def test_1():
pass

@pytest.mark.parametrize("params",[params_1,params_2])
def test_2(params):
allure.dynamic.title(params["name"])

Allure报告自动生成

  • 配置文件pytest.ini
addopts = -s --alluredir ./report/result
  • 代码实现自动生成html报告
# 生成allure测试报告
Base.py 
def allure_report(report_path, report_html):
    # 执行命令 allure generate
    allure_cmd = "allure generate %s -o %s --clean" % (report_path, report_html)
    try:
        subprocess.call(allure_cmd, shell=True)
        my_log().debug("生成测试报告")
    except:
        my_log().debug("生成测试报告出错")
        raise

设置程序主运行函数

run.py
if __name__ == '__main__':
    report_path = Conf.get_report_path() + os.sep + "result"
    report_html_path = Conf.get_report_path() + os.sep + "html"
    pytest.main(["-s", "--alluredir", report_path])
    Base.allure_report(report_path, report_html_path)

Allure应用

  • 代码实现
mport allure
import pytest
from pactverify.matchers import Matcher, EachLike, Like, PactVerify

from testcase.im.apis import ApiTest


@allure.feature("获取制定会话接口")
class TestGetConversation:

    def setup(self):
        self.result = None
        self.verify_info = None
        self.verify_result = None
        self.request_param = None

    def teardown(self):
        desc = "<font color='red'>请求参数:</br> </font>{}</br>" \
               "<font color='red'>实际结果:</br> </font>{}</br>" \
               "<font color='red'>验证结果:</br> </font>{}</br>" \
               "<font color='red'>验证信息:</br> </font>{}".format(self.request_param, self.result, self.verify_result,
                                                               self.verify_info)
        allure.dynamic.description(desc)

    # 获取制定会话接口
    @pytest.mark.case_p0
    @allure.title("根据conversationId获取制定会话接口")
    def test_conversations_by_conversationId(self):
        """根据imId获取会话列表"""
        conversationId = '5da9659ff53f07328308b355'
        result = ApiTest().api_get_conversations_by_conversationId(conversationId)
        print("返回的结果%s" % (result.json()))

                expect_format = Matcher({
            "statusCode": 200,
            "status": "success",
            "result": Like({
                "unreadCount": Like(2, key_missable=True),
                "messageReadTime": 34567890,
                "userType": "CUSTOMER",
                "_id": Matcher(conversationId),
                "imId": "erp-2253F6D0-B558-466F-87FA-86395B5A2830",
                "targetId": "erp-4B41582E-91D6-4337-846C-7D2B09D8F900",
                "type": "PERSON",
                "__v": 0,
                "createdAt": "2019-10-18T07:11:27.350Z",
                "displayName": "sdsa",
                "latestMessage": {
                    "description": "hahahaha最近消息dhkasldhasjkfhklasfhklas"
                },
                "portraitUri": "https://cdn.mytoken.org/Fvuapzak9DwkHSuBPp0hcfw1emhf",
                "tieId": "PERSON:erp-2253F6D0-B558-466F-87FA-86395B5A2830:erp-4B41582E-91D6-4337-846C-7D2B09D8F900",
                "updatedAt": "2019-10-18T07:25:06.161Z",
                "id": Matcher(conversationId)
            })
        })

        mPactVerify = PactVerify(expect_format, hard_mode=True)

        self.request_param = "conversationId" + str(conversationId)
        self.result = result.json()
        mPactVerify.verify(self.result)

        self.verify_info = mPactVerify.verify_info
        self.verify_result = mPactVerify.verify_result
        assert mPactVerify.verify_result == True
  • 测试报告


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

推荐阅读更多精彩内容