测试平台系列(71) Python定时任务方案

摘要:
每晚8点,执行整个业务场景界面的自动回归测试。#这是需要执行计划任务的UI/接口自动化方法passdefmain():main()。我不知道是否还有人以这种方式执行自动化测试。在Python中,计划任务应该做什么?对我有限的睡眠任务进行了一些扩展:

大家好~我是米洛

我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持。

欢迎关注我的公众号测试开发坑货,获取最新文章教程!

定时任务

定时任务,顾名思义: 定时执行的任务,可以是一段bash命令,也可以是一个脚本文件。通常用于我们需要在特定时刻做事情。

举个例子: 每晚8点执行全业务场景接口自动化回归测试,又或者每隔20分钟去你家QQ农场偷菜!

Python的定时任务

如果是大中型公司,一定有对应的平台让大家接入。一般这样的平台的名字或者描述都是: 分布式任务调度平台这样的。再不济还有jenkins满足我们的需求~

想起博主以前"小时候"(刚工作的时候),公司既没有用jenkins,也没有这样的大平台可以接入。我是怎么做定时任务的呢?

来看一段代码:

import time
from datetime import datetime

def func():
    # 这个是定时任务要执行的ui/接口自动化方法
    pass

def main():
    while True:
      # 获取当前时间
      now = datetime.now()
      if now.hour == 20 and now.minute == 0:
          # 当时间到达晚上8点0分,我们就开始跑自动化任务啦
          print("任务开始执行")
          func()
      time.sleep(60)
      
      
if __name__ == "__main__":
    main()

不知道现在是否还有人依然用着这样的方式定时执行自动化测试,既然都2021年了,那咱们还是先进点吧。那么定时任务在Python中要怎么做呢?接着看。

几种常见的方案

schedule

如果你只是上面提到简单诉求,那我建议直接使用schedule库。这个库我个人感觉是小学生版本的升级版,对于我那种局限的sleep任务做了一些扩展:

  • 支持了按周期执行任务
  • 执行时间阅读起来更人性化
  • 还支持星期X执行

  1. 安装scheduler
pip install schedule
  1. 官网给出的例子
import schedule
import time

# 定义一个执行方法
def job():
    print("I'm working...")

# 每10分钟执行一次job
schedule.every(10).minutes.do(job)
# 每小时执行一次job
schedule.every().hour.do(job)
# 每天10:30执行job
schedule.every().day.at("10:30").do(job)
# 每个星期一执行一次
schedule.every().monday.do(job)
# 每个星期三的13:15执行一次
schedule.every().wednesday.at("13:15").do(job)
# 在每分钟的17秒执行一次
schedule.every().minute.at(":17").do(job)


while True:
    # 进入schedule循环
    schedule.run_pending()
    time.sleep(1)

可以看出,api十分简单,语义也很清晰。基本可以满足我们的需求了~如果我们只是要定时去做某些事情的话,我想这个库非常human。

Jenkins

这个工具相比大家都有所了解吧~jenkins是一个比较强大的软件了,它可以打通git/svn,也支持定时任务等。有着丰富的插件,比如邮件,是一套完整的CI/CD解决方案。对于任务的执行结果的记录,也是可追溯的。估计唯一的缺点就是,引入了额外的系统。可能本身我只是一个自动化测试框架,现在却要搭建一套jenkins。

如果大家有代码改动->执行定时任务类似的需求,又需要完善的权限控制系统的话,那jenkins会是你的不二选择。

Celery

测试平台系列(71) Python定时任务方案第1张

我对这家伙了解的不太多,但python+celery仿佛成了一个固定搭配。不知道我理解的对不对:

celery是一个任务队列,你可以制定好任务执行的规则,放入队列中,会有专门的消费端来帮你执行这些任务。

说到这里就不得不提到持久化了~

题外话之持久化

什么是持久化呢?通俗的讲,就是瞬时数据(比如内存中的数据,是不能永久保存的)持久化为持久数据(比如持久化至数据库中,能够长久保存)

我们可以把数据放到文件里,也可以放到数据库(实际上也是磁盘里)进行持久性保存。

这样做的目的: 数据可以存储,下次也还能拿到这些数据。这里面的内容太多了,打算后面再开一节来讲。

我们在Python里面的变量啊,这些数据都是存放在内存当中的,所以我们刚才的schedule是不支持持久化的。(也可能是我没研究到)

那jenkins支持吗?他是支持的,你想,你建立一个项目,里面有一些job的配置,什么时候执行,执行了干嘛,最后保存。

上述就是一个持久化的过程。

你保存了数据以后,下次能够获取到这个项目的任务信息,也就是说你哪怕重启了jenkins,任务依然存在

说明任务本身作为了一条数据,持久地保存了起来。

ApScheduler

"APScheduler是一个Python库,可让您安排稍后要执行的Python代码,只需一次或定期执行。您可以根据您添加新的作业或删除旧的旧作业。如果您在数据库中存储工作,他们还将存活调度程序重新启动并保持状态。重新启动调度程序时,它将运行它在脱机1时应该运行的所有作业。"

这是摘自ApScheduler官网的介绍,总体来说它支持对任务的增删改查(持久化),也能很好地支撑定时任务的执行。它相对来说比较轻量,不像celery那么复杂,也不像schedule那么简陋。由于我们不打算引入jenkins,所以总体来说,ApScheduler算得上是咱们执行定时任务的不二之选了。

由于篇幅的原因,今天的内容就介绍到这啦~

下一节我们就详细介绍ApScheduler在pity中的运用叭

免责声明:文章转载自《测试平台系列(71) Python定时任务方案》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何修改U盘的图标【ArcGIS 10.2新特性】ArcGIS 10.2将PostgreSQL原生数据发布为要素服务下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

很酷的页面布局框架

建高楼大厦时,我们总是先用钢筋水泥搭好骨架,然后再加砖添瓦,布置每套房屋。编写一个网页也是这样,须先将布局框架搭好稳固,之后才能游刃有余。本博文阐述如何实现了两栏布局(main栏和sub栏),三栏布局(main栏、sub栏和extra栏),以及布局中各栏的排列顺序。 本示例布局框架具有以下特性: 跨浏览器:兼容IE6。 稳固性:布局稳固,不受内容的影响。...

通达OA 11.5 SQL注入漏洞复现

0x00 漏洞描述  通达OA 11.5存在sql注入 0x01 漏洞影响版本  通达oa 11.5 0x02 漏洞复现 1、下载通达OA 11.5 https://cdndown.tongda2000.com/oa/2019/TDOA11.5.exe,点击安装 2、创建一个普通账户test:test123456 3.1、id参数存在sql注入 利用条...

使用verdaccio搭建npm私有仓库

https://verdaccio.org/docs/en/configuration#authentification verdaccio私有仓库 背景 verdaccio 业务需求,会有许多公司内部开发的私有包,这些包希望可以统一管理,方便开发和使用,此时就需要一个内部的仓库来保存这些包。使用内部仓库还有一个好处,就是速度快,自己搭建npm 服务器,...

go-swagger的简单使用

一、下载go-swagger go-swagger 官方下载 根据不同个的操作系统选择对应的 二、添加环境变量 2.1 window swagger_windows_amd64.exe 将swagger_windows_amd64.exe 重命名 成 swagger.exe 然后将该软件放到$GOROOT/bin 中 2.2 linux swagger...

多线程编程实战(一)

多线程编程实战(一) 为了快速处理大量的任务,多线程编程必不可少,所以最近也开始研究多线程方面的东西了。网上有不少资料可以参考,自己从实例入手,总结了一些东西,把它记录下来,方便自己日后查阅,也方便后来人。现在的编程语言,入门第一课,都是写一个Hello Word的程序。本文类似,虽说不是hello Word,但也是从最简单的多线程实例入手。 我们最常...

List列表的增删改查

List列表的增删改查        增  list.Append(内容):直接把要增加的内容添加到最后 List.insert(位置,内容):插到指定位置 List.extend():把所有内容全部迭代插入到最后 删: List.Pop(位置索引)默认是最后:返回一个删除的内容 List.Remove():按照元素去删 List.Clear():清空列表...