二次开发了个寂寞之HttpRunnerManager接口测试管理平台

news2024/9/20 18:00:20

文章目录

      • 一、背景
        • 1、二次开发
          • 1.1、首页
          • 1.2、项目列表
          • 1.3、用例列表
          • 1.4、新增用例
          • 1.5、测试套件
          • 1.6、查看报告
      • 二、总结

一、背景

自入职起,就在公司内部引入开源接口测试平台,选一个大家勉强看得懂源码的开源项目,方便后续的二次开发,不管是功能优化还是功能定制,至少有动手的能力,同时又能避免重复造轮子(既没有造轮子的时间也没有那么多精力)。那么二次开发到底是做什么?首先需要先熟悉它本身的功能实现和框架架构,不要因为他本身就是个平台,就感觉无从下手,因为它并不完美。

1、二次开发

1.1、首页

主要是对样式的改造,增加一列灰色显示失败用例,光标移动显示用例具体数据效果,时间轴跨度;
在这里插入图片描述

index.html改到的源码:

***
legend: {
    data: ['跳过用例', '失败用例', '成功用例', '通过率']
},
***
series: [
    {
        name: '跳过用例',
        type: 'bar',
        data: [],
        color: "#696969"
    },
    {
        name: '失败用例',
        type: 'bar',
        data: [],
        color: "#e6194B"
    },
    {
        name: '成功用例',
        type: 'bar',
        data: [],
        color: "#3cb44b"
    },
    {
        name: '总用例数',
        type: 'bar',
        data: [],
        color: "#00BFFF"
    },
    {
        name: '通过率',
        type: 'line',
        yAxisIndex: 1,
        data: [],
        color: "Pink"
    }
]
***
option.xAxis[0].data = xAxis_data;
option.series[0].data = {{ total.skip }};
option.series[1].data = {{ total.fail }};
option.series[2].data = {{ total.pass }};
option.series[3].data = {{ total.sum }};
option.series[4].data = {{ total.percent }};
***
function getDay(day) {
    var today = new Date();
    var targetday_milliseconds = today.getTime() + 1000 * 60 * 60 * 24 * day * -1;
    today.setTime(targetday_milliseconds); //注意,这行是关键代码
    var tYear = today.getFullYear();
    var tMonth = today.getMonth();
    var tDate = today.getDate();
    tMonth = doHandleMonth(tMonth + 1);
    tDate = doHandleMonth(tDate + 2);// 多显示两天
    return tYear + "-" + tMonth + "-" + tDate;
}
***

至于views.py源码,是树状数据的显示,找到index方法里面的get_total_values;对应变量名去修改自己想要的效果

***
total = {
    'skip': [],
    'pass': [],
    'fail': [],
    'percent': [],
    'sum': []
}
***
# 用例失败数=总数-成功数-跳过数
total['fail'].append(total_run - total_success - total_skipped)
total['percent'].append(total_percent)
total['skip'].append(total_skipped)
total['sum'].append(total_run)
1.2、项目列表

优化了批量导入功能
在这里插入图片描述

平台的底层框架是httprunner工具,它本身支持charles录制导出的har数据文件,进行转换成json或yml格式的用例

for file in files:
    file_suffix = os.path.splitext(file)[1].lower()
    if file_suffix == '.json':
        with io.open(file, encoding='utf-8') as data_file:
            try:
                content = json.load(data_file)
            except JSONDecodeError:
                err_msg = u"JSONDecodeError: JSON file format error: {}".format(
                    file)
                logging.error(err_msg)

    elif file_suffix in ['.yaml', '.yml']:
        with io.open(file, 'r', encoding='utf-8') as stream:
            content = yaml.load(stream, Loader=yaml.FullLoader)
1.3、用例列表

这个列表改造的功能就比较多了,如新增字段:状态、更新人、接口url等,还有时间优化、查询条件优化
在这里插入图片描述

这里涉及的改动就多了,要看得懂数据库表字段涉及、代码重构、前端样式调整

***
# 搜索项目--用例
elif belong_project and name is not '':
    obj = obj.filter(belong_project__contains=belong_project).filter(
        Q(request__contains=name) | Q(name__contains=name))
#  搜索模块--用例
elif belong_module and name is not '':
    obj = obj.filter(belong_module__module_name__contains=belong_module).filter(
        Q(request__contains=name) | Q(name__contains=name))
        
***
1.4、新增用例

对于上一个功能设计的,新增是否执行status状态列,是因为httprunner工具对于用例是有skip
在这里插入图片描述

add_case.html同时也隐藏了创建者字段

***
<div class="form-group">
    <div class="input-group col-md-4 col-md-offset-1">
        <div class="input-group-addon" style="color: #0a628f">是否执行</div>
        <select id="is_excuted" name="skip" class="form-control">
            <option value="False" selected>默认执行</option>
            <option value="True">跳过执行</option>
        </select>
    </div>
</div>
***
<div class="form-group" hidden="hidden">
    <div class="input-group col-md-4 col-md-offset-1">
        <div class="input-group-addon" style="color: #0a628f">编写人员</div>
        <input type="text" class="form-control" id="author" name="author"
               placeholder="用例编写人员" value="{{ account }}" readonly><!-- 默认获取当前登录用户 -->
    </div>
</div>
***
1.5、测试套件

时间格式的调整,新增更新者字段
在这里插入图片描述

这里面涉及的知识点,前面也有引用,suite_list.html

***
<td>{{ foo.create_time|handle_time }}</td>
<td>{{ foo.update_time|handle_time }}</td>
***

自定义custom_tags.py过滤器

@register.filter(name='handle_time')
def handle_time(value):
    """处理时间格式"""
    return value.strftime("%Y-%m-%d")
1.6、查看报告

这里改造的东西也是比较多的,如新增执行人、备注字段,实现可以知道谁执行的测试、失败的用例可以备注什么原因、更能支持批量删除报告功能
在这里插入图片描述

report_list.html增加编辑窗口实现备注,是由commons.js实现update_data_ajax

<div class="form-group">
    <label class="control-label col-sm-3" for="mark"
           style="font-weight: inherit; font-size: small ">报告备注:</label>
    <div class="col-sm-9">
        {#                            <input name="mark" type="text" id="mark" class="form-control"#}
        {#                                   placeholder="报告备注" value="请输入备注内容!">#}
        <textarea type="text" rows="5" class="form-control" id="mark" name="mark"
                  aria-describedby="inputSuccess3Status" placeholder="报告备注" value="报告备注"
                  style="color: red;"></textarea>
        <!-- 是个icon样式 -->
        {#                            <span class="glyphicon glyphicon-paperclip form-control-feedback" aria-hidden="true"></span>#}

    </div>
</div>
***
<script type="text/javascript">
    function edit(id, report_name, report_result, mark) {
        $('#index').val(id);
        $('#report_name').val(report_name);
        $('#report_result').val(report_result)
        $('#mark').val(mark);
        $('#my-edit').modal({
            relatedTarget: this,
            onConfirm: function () {
                update_data_ajax('#report_list', '/api/report_list/1/')
            },
            onCancel: function () {
            }
        });
    }
***

curd.js要实现批量删除报告,全选、多选报告进行删除

function ckAll() {
    var flag = document.getElementById("select_all").checked;
    var cks = document.getElementsByName("input[]");
    for (var i = 0; i < cks.length; i++) {
        cks[i].checked = flag;
    }
}

//批量删除
function MultiDel(id) {
    if (!confirm("确定删除这些吗?删除后回到第一页!")) {
        return;
    }
    var cks = document.getElementsByName("input[]");
    var str = "";
    //拼接所有的id
    for (var i = 0; i < cks.length; i++) {
        if (cks[i].checked) {
            str += cks[i].value + ",";
        }
    }
    //去掉字符串未尾的','
    str = str.substring(0, str.length - 1);
    location.href = '/api/del_reports?ids=' + str;
}

二、总结

其实对于这些小功能的改造和优化,都是为了方便更好的使用这个平台,提审使用它的效率,从而对于测试的效率就会提升;有效的记录每次执行结果并进行分析,跟踪反馈。日拱一卒无有尽,功不唐捐终入海!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/821871.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker基础命令(二)

一、搜索镜像 1.在https://hub.docker.com/u/library 上搜索需要的镜像 2.查看需要的版本 3.下载指定版本 docker pull python:3.6 下载完成查看 docker images 问题&#xff1a;怎样用docker中的Python&#xff1f;&#xff1f;&#xff1f; 二、交互模式使用容器 1. 运行…

【mmdeploy】mmseg转ONNX/TensorRT

1.关于mmdeploy MMDeploy 是 OpenMMLab 模型部署工具箱&#xff0c;为各算法库提供统一的部署体验。基于 MMDeploy&#xff0c;开发者可以轻松从训练 repo 生成指定硬件所需 SDK&#xff0c;省去大量适配时间。MMDeploy 提供了一系列工具&#xff0c;帮助您更轻松的将 OpenMMLa…

前端Vue入门-day06-路由进阶

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 路由的封装抽离 声明式导航 导航链接 两个类名 自定义高亮类名 跳转传参 1. 查询参数传参 2. 动态…

Mysql-学习笔记

文章目录 1. 数据库1.1 Mysql安装及常用代码1.2 SQL介绍1.3 SQL分类1. DDL-操作数据库&#xff0c;表2. DML-对表中的数据进行增删改3. DQL-对表中的数据进行查询条件查询模糊查询排序查询分组查询分页查询 4. DCL-对数据库进行权限控制外键约束表关系-多对多多表查询事务 1. 数…

netty chinaread 不执行 的总结

netty chinaedred 不执行 目录概述需求&#xff1a; 设计思路实现思路分析1.netty chinaedred 拓展实现性能参数测试&#xff1a; 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness…

登月再进一步:Apollo自动驾驶的里程碑

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★前端炫酷代码分享 ★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ 解决算法&#xff0c;一个专栏就够了★ ★ 架…

某某儿科医院APP登陆与抢票分享

1. 背景 近期到了暑假&#xff0c;儿保的票是越来越难抢了。卡着点也不能刷得到&#xff0c;有天偶然打开发现某个热门门诊突然有一个票&#xff0c;然后就帮人挂到了。琢磨一下&#xff0c;这种不是秒杀的抢票&#xff0c;如果能把所有取消的捡漏刷到&#xff0c;其实问题也不…

【Leecode】交替合并字符串- join

题目 给你两个字符串 word1 和 word2 。请你从 word1 开始&#xff0c;通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长&#xff0c;就将多出来的字母追加到合并后字符串的末尾。 返回 合并后的字符串 。 错误1 class Solution:def mergeAlternately(self, w…

微信小程序防盗链referer问题处理

公司使用百度云存储一些资源&#xff0c;然后现在要做防盗链&#xff0c;在CDN加入Referer白名单后发现PC是正常的&#xff0c;微信小程序无法正常访问资源了。然后是各种查啊&#xff0c;然后发现是微信小程序不支持Referer的修改&#xff0c;且在小程序开发工具是Referer是固…

想要对象吗?教你如何用C++new一个完美的对象(内存管理)

目录 一、C/C内存分布 1. 栈&#xff08;Stack&#xff09; 2. 堆&#xff08;Heap&#xff09; 3. 全局区/静态区&#xff08;Global Area/Static Area&#xff09; 4. 常量区&#xff08;Constant Area&#xff09; 5. 代码区&#xff08;Code Area&#xff09; 二、C…

智安网络|应对政务行业数字化转型中的数据隐私和网络攻击风险

政务数据共享安全咨询规划 每个政府部门面临的风险场景、合规要求都有所不同&#xff0c;因此首先需要通过数据安全咨询规划&#xff0c;完善数据安全制度规范&#xff0c;结合政务数据的实际业务需求&#xff0c;建立健全政务数据共享开放的全流程安全管理制度&#xff0c;明…

深度学习——注意力机制、自注意力机制

什么是注意力机制&#xff1f; 1.注意力机制的概念&#xff1a; 我们在听到一句话的时候&#xff0c;会不自觉的捕获关键信息&#xff0c;这种能力叫做注意力。 比如&#xff1a;“我吃了100个包子” 有的人会注意“我”&#xff0c;有的人会注意“100个”。 那么对于机器来说…

MySQL处理客户端请求

文章目录 一、连接管理二、解析与优化1、查询缓存2、语法解析3、查询优化 简单来说 MySQL 主要分为 Server 层和存储引擎层&#xff1a; Server 层&#xff1a;主要包括连接器、查询缓存、分析器、优化器、执行器等&#xff0c;所有跨存储引擎的功能都在这一层实现&#xff0c…

【Shell】Shell编程之文本处理器——awk

sed可以对文本内容进行增删改查 主要使用的是改和查&#xff1b;查使用grep&#xff0c;正则表达式使用grep -E更好 awk是文本三剑客中最强大的文本工具&#xff1b; awk也是按行进行操作&#xff1b;对行操作完之后可以根据指定命令来取列 awk的分隔符&#xff1a;默认为 &…

Linux第七章之gdb与makefile使用

一、Linux调试器-gdb使用 1.1背景 程序的发布方式有两种&#xff0c;debug模式和release模式Linux gcc/g出来的二进制程序&#xff0c;默认是release模式要使用gdb调试&#xff0c;必须在源代码生成二进制程序的时候, 加上-g 选项&#xff3b;重要&#xff3d; 1.2开始使用 …

爬虫原理详解及requests抓包工具用法介绍

文章目录 一、什么是爬虫&#xff1f;二、爬虫的分类三、网址的构成四、爬虫的基本步骤五、动态页面和静态页面六、伪装请求头七、requests库介绍1. 概念&#xff1a;2. 安装方式&#xff08;使用镜像源&#xff09;&#xff1a;3. 基本使用&#xff1a;4. response对象对应的方…

一起学算法(数组篇)

1.概念&#xff1a; 1.顺序存储 顺序存储结构&#xff0c;是指用一段地址连续的存储单元来依次存储结构&#xff0c;如图所示&#xff0c;每个蓝色方块都对应了数组中的一个数据&#xff0c;数据有类型&#xff0c;例如&#xff1a;32位整型int、单精度浮点型float、双精度浮点…

你知道HTTP与HTTPS有什么区别吗?

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、什么是HTTP&#xff1f; 二、什么是HTTPS&#xff1f; 三、HTTPS 的工作原理 1、客户端发起 HTTPS 请求 2、服务端的配置 3、…

如何设计一个Android端高性能日志监控系统

开发中客户端经常遇到一些线上问题, 无法复现, 但是又的的确确存在; 当线上反馈的时候无从下手; 主要是因为并不知道用户所处的环境,以及所做的操作顺序或者程序运行的顺序; 在排查问题和复现问题上占用了很大的成本; 如果debug时的log日志如果线上也能查看就好了; 基于此, 我们…