前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >13.UI自动化测试框架搭建-处理Allure报告数据

13.UI自动化测试框架搭建-处理Allure报告数据

作者头像
zx钟
发布2022-03-29 16:41:43
3640
发布2022-03-29 16:41:43
举报
文章被收录于专栏:测试游记测试游记

目的

在执行完测试之后想要将测试结果通过邮件或者工作通信软件发送,需要在发送前进行结果的收集。

使用allure.py执行完测试脚本之后,会在./report/allure_results路径下生成Allure的测试过程数据,通过编写一个脚本来解析它们

获取测试数据

查看allure_results文件夹下的内容

查看了一下发现result.json文件中包含了每个case执行的内容

代码语言:javascript
复制
{
  "name": "主入口下方文案校验",
  "status": "passed",
  "description": "\n    按钮下方文案测试\n        * 挂号\n        * 问诊\n        * 购药\n    ",
  "steps": [
    {
      "name": "查看首页_问诊按钮下方文案",
      "status": "passed",
      "steps": [
        {
          "name": "获取「首页_问诊下方文字」的文字",
          "status": "passed",
          "parameters": [
            {
              "name": "locator",
              "value": "首页_问诊下方文字"
            },
            {
              "name": "many",
              "value": "False"
            },
            {
              "name": "num",
              "value": "0"
            }
          ],
          "start": 1647138093415,
          "stop": 1647138093436
        }
      ],
      "start": 1647138093415,
      "stop": 1647138093436
    }
  ],
  "parameters": [
    {
      "name": "way",
      "value": "'inquiry'"
    }
  ],
  "start": 1647138093415,
  "stop": 1647138093436,
  "uuid": "d704fabe-a2cf-437b-ac6d-b814a0d33b7b",
  "historyId": "1ca4e0e03325987a13faaed8432220f9",
  "testCaseId": "ce83012d4892fd256d6496f512d294f3",
  "fullName": "src.cases.test_home#test_home_text",
  "labels": [
    {
      "name": "story",
      "value": "首页"
    },
    {
      "name": "feature",
      "value": "微医主站"
    },
    {
      "name": "parentSuite",
      "value": "src.cases"
    },
    {
      "name": "suite",
      "value": "test_home"
    },
    {
      "name": "host",
      "value": "zhongxindeiMac.local"
    },
    {
      "name": "thread",
      "value": "84836-MainThread"
    },
    {
      "name": "framework",
      "value": "pytest"
    },
    {
      "name": "language",
      "value": "cpython3"
    },
    {
      "name": "package",
      "value": "src.cases.test_home"
    }
  ]
}

所以第一步就是读取这些json文件,使用列表推导式拿到全部的result.json文件

代码语言:javascript
复制
result_list = [i for i in os.listdir(path) if '-result.json' in i]

数据清理

我们需要的数据大致为

  • 用例名称(英文、中文、参数)
  • 运行状态
  • 运行耗时
  • 错误信息

读取json

通过json模块来读取json并转化为字典类型

代码语言:javascript
复制
import json
with open(path, "r") as f:
    json_data = json.load(f)
    return json_data

获取用例名称

代码语言:javascript
复制
full_name = json_data.get("fullName")

获取用例标签

labels中关键内容合并一下

代码语言:javascript
复制
labels = '_'.join([i.get('value', '') for i in json_data.get("labels") if
                               i.get('name', '') in ['feature', 'story']]) + "_" + json_data.get("name")

获取参数化的参数

通过参数化编写的case名称一样,参数不一样,所以需要拿到参数

代码语言:javascript
复制
parameters = json_data.get("parameters", '') and '_'.join([i.get('value', '') for i in
                                                                       json_data.get("parameters", '')])

获取异常信息

通过的用例不会有异常信息,所以判断一下再进行数据组合

代码语言:javascript
复制
statusDetails = json_data.get('statusDetails', '')
statusDetails1 = {
    "message": "",
    "trace": ""
}
if statusDetails:
    try:
        statusDetails1["message"] = statusDetails.get("message", "")
        statusDetails1["trace"] = statusDetails.get("trace", "")
    except Exception:
        pass

完整数据

代码语言:javascript
复制
data = {
    "fullName": full_name,
    "status": json_data.get("status"),
    "labels": labels,
    "duration": json_data.get("stop", 0) - json_data.get("start", 0),
    "parameters": parameters,
    "statusDetails": statusDetails1
}

键值对存储

判断一下存储的字典中有没有这个字段再进行存放

代码语言:javascript
复制
allure_results = []
allure_dict = {}
if f'{full_name}_{parameters}' not in allure_dict:
    allure_dict[f'{full_name}_{parameters}'] = [data]
else:
    allure_dict[f'{full_name}_{parameters}'].append(data)

判断是否失败重跑

使用了rerun之后的用例会重复生成result.json文件

需要判断有没有重跑成功,如果重跑都失败那就拿其中的失败结果,如果有成功的话就改为成功

代码语言:javascript
复制
for v in allure_dict.values():
    if len(v) == 1:
        allure_results.append(v[0])
    else:
        for v1 in v:
            if 'pass' in v1.get("status"):
                allure_results.append(v1)
                break
        else:
            allure_results.append(v[0])

完整代码:

https://gitee.com/zx660644/uitest/blob/master/src/utils/jsonoperator.py

运行结果

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-03-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试游记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目的
  • 获取测试数据
  • 数据清理
    • 读取json
      • 获取用例名称
        • 获取用例标签
          • 获取参数化的参数
            • 获取异常信息
              • 完整数据
                • 键值对存储
                  • 判断是否失败重跑
                  • 运行结果
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档