teprunner测试平台已经有一个多月没有更新了,主要原因是定时任务不够稳定,经过反复试错,找到了解决办法,这次终于稳定了。

本文开发内容

作为测试平台而言,定时任务算是必备要素了,只有跑起来的自动化,才能算是真正的自动化。本文将给测试计划添加定时任务功能,具体如下:

  • 前端添加测试计划的定时任务开关
  • 采用crontab表达式设置计划时间
  • 后端集成django-apschedule,在数据库中记录任务明细和执行详情。
  • 定时清理执行记录。

前端效果图:

前端开发内容

编辑src/views/teprunner/plan/PlanEditor.vue文件:

运行环境用el-select实现了下拉框,用el-switch实现了开关按钮。

el-pophover实现了帮助描述,可以参考编写crontab表达式。

在data中添加了表单项taskRunEnv、taskStatus、taskCrontab,必填规则,以及其他变量。

页面创建时读取localStorage中的计划信息。

并获取运行环境下拉框选项。

开关按钮的文字是根taskStatus进行设置的。

在保存时,给请求添加上新的这3个参数。

后端开发内容

第一步是安装django-apscheduler,要么直接安装:

pip install django-apscheduler

要么更新项目代码后通过requirements.txt安装:

pip install -r requirements.txt

然后编辑teprunnerbackend/settings.py文件:

在INSTALLED_APPS中添加django_apscheduler。

接着迁移数据库,创建两张任务表,一张任务明细表,一张任务执行情况表

python manage.py migrate

编辑teprunner/models.py文件:

给Plan模型添加3个字段。

编辑teprunner/serializers.py文件:

同样的,给PlanSerializer添加3个字段。

新建teprunner/views/task.py文件:

创建BackgroundScheduler的对象实例,Background指的是在后台运行。并添加DjangoJobStore,把任务通过Django保存到数据库中。

添加一个定时删除执行记录的任务,max_age是最大保存时间,这里设置为7天。scheduler.add_job()用来添加定时任务,trigger是触发器,也就是计划时间,这里设置为每周一0点。id是任务的标识符。max_instances指同时最多只有一个实例。replace_existing设置为True,每次都更新已存在的任务,防止重启服务导致scheduler.add_job()报错。

启动任务。

编辑teprunner/views/run.py文件:

为了手动执行测试计划和定时任务执行测试计划共用,这里把执行代码抽取了部分作为run_plan_engine()函数。

编辑teprunner/views/plan.py文件:

重写create方法,先根据测试计划的名字判断是否已存在,如果存在就直接返回500。接着判断开关如果开启,那么就通过scheduler.add_job()添加任务。跟刚才添加任务的有点区别是,通过args参数指定了func函数的参数。最后把任务添加日志写到响应中返回。

重写update方法,先判断测试计划是否已经存在,判断规则是根据名字去查找已存在记录,如果找到同名计划,且id不是自己,那么就认为已存在同名计划,直接返回500。

然后判断如果开关打开,就新增任务;如果开关关闭,就删除任务,删除任务使用scheduler.remove_job()。

最后重写destroy方法,在删除测试计划时,一并删除定时任务。

猴子补丁解决pymysql连接问题

为什么定时任务会不稳定?因为我用的pymysql库,它不会进行数据库连接断开后重试。Django和MySQL建立建立后,何时断开连接通过CONNECT_MAX_AGE来设置,默认是0,表示使用完马上断开连接。Django只会对Web请求采取这个策略,使用signals.request_started.connect(close_old_connections)和signals.request_finished.connect(close_old_connections)来关闭旧连接。但定时任务不是Web请求,而是直接连接数据库,Django并不会去主动断开这个连接。而MySQL默认8小时会把连接断掉,于是当Django拿着已经被MySQL断开的连接对象去请求MySQL,就报错了。

当我在本地安装了MySQL后,重启MySQL就能复现这个问题。

解决办法一是把旧连接复活,进行断线重连,但是会导致连接占用可能越来越多,耗费资源。解决办法二是像Django处理Web请求一样,每次用完就断开,下次使用再重新连接,占用资源少。

猴子补丁是指不修改第三方库的基础上,对库的功能进行扩展。我给django-apscheduler写了个猴子补丁,实现第二个解决办法,用完就断开连接:

并且通过issue方式,告诉了它的作者:

这开启了我在GitHub上英文交流技术的大门。

比如我又给loguru提了个bug,此时已经和loguru的作者英文交流了5个回合。

小结

本文给测试计划添加了定时任务功能,为teprunner测试平台补上了一块重要拼图。从此它不但能批量执行用例了,还能按照计划时间,定时执行,实现了真正的自动化。

teprunner测试平台定时任务这次终于稳了的更多相关文章

  1. teprunner测试平台部署到Linux系统Docker

    本文是一篇过渡,在进行用例管理模块开发之前,有必要把入门篇开发完成的代码部署到Linux系统Docker中,把部署流程走一遍,这个过程对后端设计有决定性影响. 本地运行 通过在Vue项目执行npm r ...

  2. teprunner测试平台用例前置模块开发

    本文开发内容 现在正式进入测试相关功能开发.teprunner测试平台底层是pytest,中间层是tep,还没了解的朋友可以先看看tep的文章,整个平台的设计思路和后面用例的执行都会基于这个工具.te ...

  3. teprunner测试平台Django引入pytest完整源码

    本文开发内容 pytest登场!本文将在Django中引入pytest,原理是先执行tep startproject命令创建pytest项目文件,然后从数据库中拉取代码写入文件,最后调用pytest命 ...

  4. teprunner测试平台测试计划批量运行用例

    本文开发内容 上一篇文章已经把pytest引入到测试平台中,通过多线程和多进程的方式,运行测试用例.有了这个基础,做批量运行用例的功能就很简单了,只需要前端传入一个CaseList即可.本文的后端代码 ...

  5. teprunner重磅更新Git打通PyCharm与测试平台

    经过Python测试交流群的小伙伴群策群力,teprunner添加了一个重要功能,把PyCharm中的代码,通过Git同步到测试平台中,生成测试用例.这样,teprunner就成了一个名副其实的pyt ...

  6. 淘宝TAE平台定时任务包的部署步骤

    淘宝TAE平台定时任务包的部署: 第一步:首先把自己的任务打包成一个jar包.使用maven打包的命令为:mvn clean install 第二步:把任务jar包依赖的jar包全部导出来.使用mav ...

  7. pytest内核测试平台落地初体验

    测试平台,有人说它鸡肋,有人说它有用,有人说它轮子,众说纷纭,不如从自身出发,考虑是否要做测试平台: 第1阶段,用Python+requests写接口自动化. 第2阶段,选择unitttest或pyt ...

  8. 学习版pytest内核测试平台开发万字长文入门篇

    前言 2021年,测试平台如雨后春笋般冒了出来,我就是其中一员,写了一款pytest内核测试平台,在公司落地.分享出来后,有同学觉得挺不错,希望能开源,本着"公司代码不要传到网上去,以免引起 ...

  9. 微软官方网站线上兼容测试平台-Browser screenshots

    前端开发时最不想做的就是在不同浏览器.平台和分辨率测试网页显示效果,通常这会浮现许多问题,尤其浏览器版本就可能让显示成效完全不同,也只好尽力维持让每一种设备都能正常浏览网页.修改到完全没有问题必须投入 ...

随机推荐

  1. Spring-Gateway与Spring-Security在前后端分离项目中的实践

    前言 网上貌似webflux这一套的SpringSecurity操作资料貌似很少. 自己研究了一波,记录下来做一点备忘,如果能帮到也在迷惑的人一点点,就更好了. 新项目是前后端分离的项目,前台vue, ...

  2. Vue3发布半年我不学,摸鱼爽歪歪,哎~就是玩儿

    是从 Vue 2 开始学基础还是直接学 Vue 3 ?尤雨溪给出的答案是:"直接学 Vue 3 就行了,基础概念是一模一样的." 以上内容源引自最新一期的<程序员>期刊 ...

  3. 大一那会,我用QQ远程帮同学考过计算机二级

    考证 大一那会儿流行考证,什么普通话.教师资格证.计算机.商务英语各种证五花八门的. 我们非计算机专业(我是通信工程)的基本上都会去考一个叫计算机二级的证书,说是找工作有用,大一新生,哪懂这些,一窝蜂 ...

  4. 【DataBase】SQL45 Training 45题训练

    视频地址: https://www.bilibili.com/video/BV1pp4y1Q7Yv 创建案例库: ------------创建数据库--------------- create dat ...

  5. nginx 完美解决tp3.2.3 404问题

    最近我把Apache给换成nginx,当我把tp项目搬过去运行的时候发现404 错误 ,原来是因为nginx不支持 pathinfo 模式,需要自己配置 下面我配置 在server配置里面 locat ...

  6. 【Https】Https为什么能保证安全?

    HTTPS是在HTTP上建立SSL加密层,并对传输数据进行加密,是HTTP协议的安全版. 反观HTTPS协议,它比HTTP协议相比多了以下优势(下文会详细介绍): 数据隐私性:内容经过对称加密,每个连 ...

  7. POJ1018贪心(多路归并的想法)

    题意:      有n个服务器,每个服务器都要安装网线(必须也只能安装一个),然后每个服务器都有mi种选择网线的方式,每种方式两个参数,一个是速度b,另一个是价钱p,然后让你找到一个最大的比值 min ...

  8. Intel汇编语言程序设计学习-第三章 汇编语言基础-下

    3.4  定义数据 3.4.1  内部数据类型 MASM定义了多种内部数据类型,每种数据类型都描述了该模型的变量和表达式的取值集合.数据类型的基本特征是以数据位的数目量的大小:8,16,32,,48, ...

  9. XGBoost原理解析

    摘要:对xgboost论文中的细节进行记录. 算法原理 系统设计 基于column block的并行 树学习最耗时的部分通常是对数据进行排序,为了降低排序带来的计算负荷,xgb使用基于block的结构 ...

  10. 使用C#实现一个PPT遥控器

    说明 本项目参考了 https://github.com/yangzhongke/PhoneAsPrompter 项目来完成实现,并对其进行了一些修改完善. 完整代码可以到 https://githu ...