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

文章目录

      • 一、背景
        • 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 = "";//拼接所有的idfor (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.mzph.cn/news/21910.shtml

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

相关文章

【每日一题】—— C. Mocha and Hiking(Codeforces Round 738 (Div. 2))

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

Kotlin~Visitor访问者模式

概念 将数据结构和操作分离&#xff0c;使操作集合可以独立于数据结构变化。 角色介绍 Visitor&#xff1a;抽象访问者&#xff0c;为对象结构每个具体元素类声明一个访问操作。Element&#xff1a;抽象元素&#xff0c;定义一个accept方法ConcreteElement&#xff1a;具体元…

docker 资源限制

目录 1、CPU使用率 2、CPU共享比例 3、CPU周期限制 4、CPU核心限制 5、CPU 配额控制参数的混合案例 6、内存限制 7、Block IO 的限制 8、限制bps 和iops docker资源限制 Docker容器技术底层是通过Cgroup&#xff08;Control Group 控制组&#xff09;实现容器对物理资…

Android 性能调优之bitmap的优化

背景 Android开发中&#xff0c;加载图片过多、过大很容易引起OutOfMemoryError异常&#xff0c;即我们常见的内存溢出。因为Android对单个应用施加内存限制&#xff0c;默认分配的内存只有几M&#xff08;具体视不同系统而定&#xff09;。而载入的图片如果是JPG之类的压缩格…

【unity】Pico VR 开发笔记(视角移动)

【unity】Pico VR 开发笔记&#xff08;视角移动&#xff09; 视角移动是简单的基础功能&#xff0c;这里区别于头显定位获得的小范围位移&#xff0c;是长距离不影响安全边界的位移方式。的常见的位移方式有两种&#xff0c;其一是触发后瞬间传送到指定位置&#xff0c;其次是…

IDEA用Gradle构建项目时,lombok插件无效的解决办法

Lombok 可用来帮助开发人员消除 Java 的重复代码&#xff0c;尤其是对于简单的 Java 对象&#xff08;POJO&#xff09;&#xff0c;比如说getter/setter/toString等方法的编写。它通过注解实现这一目的。 正确使用姿势 一、安装Lombok插件 菜单栏File -> Settings ->…

死锁的发生原因和怎么避免

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 例如&#xff1a;项目场景&#xff1a;示例:通过蓝牙芯片(HC-05)与手机 APP 通信&#xff0c;每隔 5s 传输一批传感器数据(不是很大) 问题描述 死锁&#xff0c;简单来说就是两个或者两个以上的线程在…

翻转卡片游戏(力扣)

题目 在桌子上有 n 张卡片&#xff0c;每张卡片的正面和背面都写着一个正数&#xff08;正面与背面上的数有可能不一样&#xff09;。 我们可以先翻转任意张卡片&#xff0c;然后选择其中一张卡片。 如果选中的那张卡片背面的数字 x 与任意一张卡片的正面的数字都不同&#…

【C语言进阶】数据的存储----整型篇

​ &#x1f341; 博客主页:江池俊的博客 &#x1f4ab;收录专栏&#xff1a;C语言——探索高效编程的基石 &#x1f4bb; 其他专栏&#xff1a;数据结构探索 ​&#x1f4a1;代码仓库&#xff1a;江池俊的代码仓库 &#x1f3aa; 社区&#xff1a;GeekHub &#x1f341; 如果觉…

Liunx环境下git的详细使用(gitee版)

Liunx环境下git的详细使用&#xff08;gitee版&#xff09; 1.git是什么2.git操作2.1在gitee创建一个仓库2.2.gitignore2.3.git 3.git三板斧3.1add3.2 commit3.3push 4.git其他命令4.1查看当前仓库状态4.2查看提交日志4.3修改git里面文件名称4.4删除文件4.5修改远端仓库内容 1.…

postgresql表膨胀处理之pgcompacttable部署及使用

环境&#xff1a; 1&#xff09;redhat-release&#xff1a;CentOS Linux release 7.6.1810 (Core) 2&#xff09;database version&#xff1a;postgresql 14.6 一、添加pgstattuple pgcompacttable工具使用过程中需要依赖pgstattuple&#xff0c;因此需先添加pgstattuple…

【SEO基础】百度权重是什么意思及网站关键词应该怎么选?

百度权重是什么意思及网站关键词应该怎么选&#xff1f; 正文共&#xff1a;3253字 20图 预计阅读时间&#xff1a;9分钟 ​ 1.什么是网站权重&#xff1f; 这段时间和一些朋友聊到网站权重以及关键词&#xff0c;发现蛮多人对于这两个概念的认知还是存在一些错误的&#xf…

数组的使用(逆序、冒泡)

内存连续数据类型相同从0开始索引 找出数组中的最大值 #include <iostream> #include <stdlib.h> //随机数所在文件 using namespace std;int main() {int arr[5]{104,134,145,129,89};//初始化没有填的为0 int max0;for(int i0;i<5;i){if(arr[i]>max){ma…

203. 移除链表元素

203. 移除链表元素 题目方法1递归方法2迭代 题目 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 方法1递归 class Solution { public:ListNode* removeElements(ListNode* head, in…

RabbitMQ快速入门

文章目录 1、RabbitMQ的概述1.1、什么是消息队列&#xff1f;1.2、为什么要使用消息队列&#xff1f;1.3、RabbitMQ的特点&#xff1a; 2、RabbitMQ的安装2.1 下载与安装2.2 常用命令 3、RabbitMQ消息发送和接受3.1 消息发送和接受机制3.2 AMQP的消息路由3.3 Exchange(交换机)的…

Datax 数据同步-使用总结(一)

1&#xff0c;实时同步&#xff1f; datax 通常做离线数据同步使用。 目前能想到的方案 利用 linux 的定时任务时间戳的方式做增量同步。 2&#xff0c;同步速度快不快&#xff1f; 单表同步速度还是挺快的 但是如果遇到复杂的 sql 查询&#xff0c;其同步效率&#xff0c…

中国信通院发布《高质量数字化转型产品及服务全景图(2023)》

2023年7月27日&#xff0c;由中国信息通信研究院主办的2023数字生态发展大会暨中国信通院铸基计划年中会议在北京成功召开。 本次大会发布了中国信通院《高质量数字化转型产品及服务全景图&#xff08;2023&#xff09;》&#xff0c;中新赛克海睿思受邀出席本次大会并成功入选…

viewerjs 如何新增下载图片功能(npm包补丁)

文章目录 先实现正常的效果实现下载图片改变viewerjs的build函数源码改变之后&#xff0c;执行npm i 之后node_modules源码又变回了原样 1、viwerjs所有功能都很完善&#xff0c;但唯独缺少了图片的下载 2、需求&#xff1a;在用viwerjs旋转图片后&#xff0c;可以直接下载旋转…

Dockerfile构建Tomcat镜像

准备apache包和jdk并解压 [rootlocalhost tomcat]# ll 总用量 196728 -rw-r--r--. 1 root root 9690027 7月 17 2020 apache-tomcat-8.5.40.tar.gz -rw-r--r--. 1 root root 674 8月 2 20:19 Dockerfile -rw-r--r--. 1 root root 191753373 7月 17 2020 jdk-8u191-…

DAY3,C高级(shell中的变量、数组、算术运算、分支结构)

1.整理思维导图&#xff1b; 2.判断家目录下&#xff0c;普通文件的个数和目录文件的个数&#xff1b; 1 #!/bin/bash2 arr1(ls -la ~/ | cut -d r -f 1 | grep -w -)3 arr2(ls -la ~/ | cut -d r -f 1 | grep -w d)4 echo "普通文件个数&#xff1a;${#arr1[*]}"5 e…