Django+Celery框架自动化定时任务开发

news2024/9/29 19:24:46

本章介绍使用DjCelery即Django+Celery框架开发定时任务功能,在Autotestplat平台上实现单一接口自动化测试脚本、业务场景接口自动化测试脚本、App自动化测试脚本、Web自动化测试脚本等任务的定时执行、调度、管理等,从而取代Jenkins上的定时执行脚本和发送邮件等功能。**

自动化测试逻辑流程图11.1所示。

11.1 环境搭建

1.安装

步骤1 安装Celery。pyramid_celery-3.0.0,

配置https://pypi.python.org/pypi/pyramid_celery/。

步骤2 安装django-clery。django-celery-3.2.2,

配置https://pypi.python.org/pypi/django- celery。 INSTALLED_APPS= []

加入2:

'djcelery', 运行 Python manage.py migrate

步骤 3 安装celery-with-redis-3.0,

地址为https://pypi.python.org/pypi/celery-with-redis/。

步骤 4 安装django-clery-beat。django-celery-beat-1.1.0,

https://pypi.python.org/pypi/ django_celery_beat。

步骤5 下载Redis-x64-3.2.100,

Redis-x64-3.2.100.zip github.com/MicrosoftAr…

2.配置

步骤1 在Settings.py中增加如下内容。

加入1:

import djcelery

djcelery.setup_loader() #加载djcelery

加入2:

#数据库调度

CELERYBEAT_SCHEDULER ='djcelery.schedulers.DatabaseScheduler'

加入3:

BROKER_URL = 'redis://127.0.0.1:6379/0'

BROKER_TRANSPORT = 'redis'

步骤2 在应用Apitest目录下新建celery.py文件1,加入如下内容。

from future import absolute_import

import os

import django

from celery import Celery

from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE','autotest.settings')

django.setup()

app = Celery('autotest')

app.config_from_object('django.conf:settings')

app.autodiscover_tasks(lambda:settings.INSTALLED_APPS)

步骤3 新建tasks.py文件,加入如下内容。

--coding:utf-8 --

importrequests, time, sys, re

importurllib, zlib#,

importpymysql

importunittest

from traceimport CoverageResults

importjson

fromidlelib.rpc import response_queue

fromapitest.celery import app

from timeimport sleep

@app.task

def hello_world():

print('已运行')

步骤4 启动服务python manage.py runserver。

步骤5 解压缩后,运行CMD,切换到相应目录,输入启动Redis指令redis-server redis. windows.conf,成功后出现如图11.2所示界面。

▲图11.2

步骤6 启动指令python manage.py celery worker -l info。

步骤7 启动指令python manage.py celery beat。

11.2 前端功能实现

1.功能描述

完成实现单一接口测试用例、业务场景接口API测试用例、AppUI测试用例、WebUI测试用例的自动化定时任务。

2.程序清单

在autotest\apitest\templates目录下新建periodic_task.html文件,加入如下内容。

<html>

<head>

{% load bootstrap4 %}

{% bootstrap_css %}

{% bootstrap_javascript %}

<title>产品自动化测试平台</title>

<link rel="stylesheet"type="text/css" href="/static/admin/css/forms.css" />

<script type="text/javascript"src="/admin/jsi18n/"></script>

<script type="text/javascript"src="/static/admin/js/vendor/jquery/jquery.js"></script>

<script type="text/javascript"src="/static/admin/js/jquery.init.js"></script>

<script type="text/javascript"src="/static/admin/js/core.js"></script>

<script type="text/javascript"src="/static/admin/js/admin/RelatedObjectLookups.js"></script>

<script type="text/javascript"src="/static/admin/js/actions.js"></script>

<script type="text/javascript"src="/static/admin/js/urlify.js"></script>

<script type="text/javascript"src="/static/admin/js/prepopulate.js"></script>

<script type="text/javascript"src="/static/admin/js/vendor/xregexp/xregexp.js"></script>

<meta name="viewport"content="user-scalable=no, width=device-width, initial-scale=1.0,maximum-scale=1.0">

<link rel="stylesheet"type="text/css" href="/static/admin/css/responsive.css"/>

<meta name="robots"content="NONE,NOARCHIVE" />

</head>

<body role="document">

<!-- 导航栏-->

<nav class="navbar navbar-expand-smbg-dark navbar-dark fixed-top">

<div>

<ahref="#">&nbsp;</a>

<ul>

</ul>

<ul>

<li><astyle='color:white' href="#"></a></li>

<li><astyle='color:white' href="/logout/"></a></li>

</ul>

</div>

</nav>

<!-- 搜索栏-->

<divstyle="padding-top: 70px;">

<formmethod="get" action="/tasksearch/">

{% csrf_token %}

<input type="search"name="task" placeholder="名称" required>

<button type="submit">搜索</button>

<!-- 增加定时任务-->

<div style="float:right;width:73%">

<select name="PeriodicTask"id="PeriodicTask">

<option value="" selected>----定时任务----</option>

</select>

<a id="change_id_PeriodicTask"data-href-template="/admin/djcelery/periodictask/fk/change/?_to_field=id&amp;_popup=1"title="更改选中的定时任务">

<imgsrc="/static/admin/img/icon-changelink.svg" alt="修改"/>

</a>

<a style='color:light blue' id="add_id_PeriodicTask" href="/admin/djcelery/periodictask/add/?_to_field=id&amp;_popup=1"title="增加另一个测试用例">

<imgsrc="/static/admin/img/icon-addlink.svg" alt="增加"/>增加

</a>

</form>

</div>

<!-- 任务计划列表-->

<divstyle="padding-top: 20px;">

<div>

<table class="table table-striped">

<thead>

<tr>

<th>ID</th><th>任务名称</th><th>任务模块</th><th>时间计划</th><th>修改时间</th><th>开启</th><th>立即</th><th>编辑</th><th>删除</th>

</tr>

</thead>

<tbody>

{% for task in tasks %}{% for periodic inperiodics %}

<tr>

{% if task.interval_id != null andtask.interval_id == periodic.id %}

<td>{{ task.id }}</td>

<td>{{ task.name }}</td>

<td>{{ task.task }}</td>

<td><a style='color:green'>每{{ periodic.period }} {{ periodic.every}}次</a></td>

<td>{{ task.date_changed }}</td>

<td>{{ task.enabled }}</td>

<td>{% if task.id == 1 %}

<a href="../task_apis"target="mainFrame">运行</a>

{% elif task.id == 2 %}

<a href="../task_apitest"target="mainFrame">运行</a>

{% else %}

{% endif %}

</td>

<td><a style='color:light blue'class="related-widget-wrapper-link add-related"id="add_id_Apitest" href="../admin/djcelery/periodictask/{{task.id }}/change/?_to_field=id&_popup=1"><imgsrc="/static/admin/img/icon-changelink.svg"/></a></td>

<td><a style='color:light blue'class="related-widget-wrapper-link add-related" id="add_id_Apitest"href="../admin/djcelery/periodictask/{{ task.id}}/delete/?_to_field=id&_popup=1"><imgsrc="/static/admin/img/icon-deletelink.svg"/></a></td>

{% else %}

{% endif %}

{% for crontab in crontabs %}

{% if task.crontab_id != null and task.crontab_id ==crontab.id and task.interval_id == 1 %}

<td>{{ task.id }}</td>

<td>{{ task.name }}</td>

<td>{{ task.task }}</td>

<td><a style='color:green'>{{crontab.month_of_year }}年{{crontab.day_of_month }}月{{crontab.day_of_week }}日{{crontab.hour }}时{{ crontab.minute}}分</a></td>

<td>{{ task.date_changed }}</td>

<td>{{ task.enabled }}</td>

<td><a href="../task_apis"target="mainFrame">运行</a></td>

<td><a style='color:light blue'class="related-widget-wrapper-link add-related"id="add_id_Apitest" href="../admin/djcelery/periodictask/{{task.id }}/change/?_to_field=id&_popup=1"><imgsrc="/static/admin/img/icon-changelink.svg"/></a></td>

<td><a style='color:light blue'class="related-widget-wrapper-link add-related"id="add_id_Apitest" href="../admin/djcelery/periodictask/{{task.id }}/delete/?_to_field=id&_popup=1"><imgsrc="/static/admin/img/icon-deletelink.svg"/></a></td>

{% else %}

{% endif %}

{% endfor %}{% endfor %}{% endfor %}

</tbody>

</table>

</div>

</div>

<span style="position:absolute;right:100px; bottom:30px;"> {# 把翻页功能固定显示在右下角#}

<div style="position:absolute; right:100px; width:100px; ">

<tr><th>总数</th><td>{{ taskcounts }}</td></tr> {# 前端读取定义的变量#}

</div>

<div>

&lt;ulclass="pagination" id="pager"&gt;

      {#上一页链接开始#}

    {%if tasks.has_previous %}

       {#  如果有上一页,则正常显示上一页链接#}

       &lt;li&gt;&lt;ahref="/periodic_task/?page={{ tasks.previous_page_number }}"&gt;上一页&lt;/a&gt;&lt;/li&gt;    {#  上一页标签 #}

    {%else %}

       &lt;li class="previous disabled"&gt;&lt;ahref="#"&gt;上一页&lt;/a&gt;&lt;/li&gt;{# 如果当前不存在上一页,则上一页的链接不可单击#}

    {%endif %}

    {# 上一页链接开始#}

   

    {%for num in tasks.paginator.page_range %}

    

       {% if num == currentPage %}

            &lt;li&gt;&lt;a href="/periodic_task/?page={{ num }}"&gt;{{ num}}&lt;/a&gt;&lt;/li&gt; {#显示当前页数链接#}

        {% else %}

            &lt;liclass="item"&gt;&lt;a href="/periodic_task/?page={{ num}}"&gt;{{ num }}&lt;/a&gt;&lt;/li&gt;

        {% endif %}

    {% endfor %}

   

    {# 下一页链接开始#}

    {% if tasks.has_next %} {#  如果有下一页,则正常显示下一页链接#}

        &lt;liclass="next"&gt;&lt;a href="/periodic_task/?page={{tasks.next_page_number }}"&gt;下一页&lt;/a&gt;&lt;/li&gt;

    {% else %}

        &lt;li&gt;&lt;a href="#"&gt;下一页&lt;/a&gt;&lt;/li&gt;

    {% endif %}

    {# 下一页链接结束#}

&lt;/ul&gt;

</div>

</body>

</html>

功能描述:实现自动化测试任务调度执行,包括单一接口、扫描、流程接口、业务场景、Web搜索、自动化平台测试开发、App登录,CSDN定时任务注册,定时任务执行等功能。

程序清单:在apitest/views.py中加入如下内容。

from .tasks importhello_world

from .tasks importtest_readSQLcase

from djcelery.modelsimport PeriodicTask,CrontabSchedule,IntervalSchedule

任务计划

@login_required

defperiodic_task(request):

username = request.session.get('user', '')

task_list = PeriodicTask.objects.all()

task_count =PeriodicTask.objects.all().count()  #统计数

periodic_list =IntervalSchedule.objects.all()  # 周期任务(如每隔1小时执行1次)

crontab_list =CrontabSchedule.objects.all()    # 定时任务(如某年某月某日的某时,每# 天的某时)

paginator = Paginator(task_list, 5)  #生成paginator对象,设置每页显示5条记录

page = request.GET.get('page',1)  #获取当前的页码数,默认为第1页

currentPage=int(page)  #把获取的当前页码数转换成整数类型

try:

    task_list = paginator.page(page)#获取当前页码数的记录列表

except PageNotAnInteger:

    task_list = paginator.page(1)#如果输入的页数不是整数,则显示第1页内容

except EmptyPage:

    task_list =paginator.page(paginator.num_pages)#如果输入的页数不在系统的页数中,# 则显示最后一页内容

return render(request,"periodic_task.html", {"user": username,"tasks":task_list,"taskcounts": task_count, "periodics":periodic_list,"crontabs": crontab_list })

搜索功能

@login_required

deftasksearch(request):

username = request.session.get('user', '')# 读取浏览器登录Session

search_name =request.GET.get("task", "")

task_list = PeriodicTask.objects.filter(task__icontains=search_name)

periodic_list =IntervalSchedule.objects.all()  # 周期任务(如每隔1小时执行1次)

crontab_list =CrontabSchedule.objects.all()    # 定时任务(如某年某月某日的某时,每# 天的某时)

return render(request,'periodic_task.html',{"user": username,"tasks":task_list,"periodics":periodic_list,"crontabs": crontab_list })

在autotest/urls.py中加入:

path('periodic_task/',views.periodic_task),

path('tasksearch/', views.tasksearch),

在apitest/left.html中加入:

<tr> <td>

                &lt;li&gt;

                    &lt;a  href="../periodic_task"target="mainFrame"&gt;

                        &lt;iclass="glyphicon glyphicon-fire"&gt;&lt;/i&gt;

                       任务计划       

                    &lt;/a&gt;

                &lt;/li&gt;

&lt;tr&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;

查看前端页面效果,如图11.3所示。

▲图11.3

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

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

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

相关文章

趋动云云端部署ChatGLM3-6B

趋动云端部署ChatGLM3-6B 文章目录 趋动云端部署ChatGLM3-6B1.项目创建2.模型部署3.总结参考 本部分主要内容&#xff1a;1.熟悉趋动云项目创建流程2.动手部署ChatGLM3-6B模型 1.项目创建 首先是趋动云的项目的创建&#xff0c;其主要以项目为载体&#xff0c;一个项目内可以进…

深度学习连接

全连接批量归一化 目的是&#xff1a;通过归一化&#xff0c;让所有的 x i x_i xi​具有一样的分布&#xff0c;学习率是一个值&#xff0c;每个参数 w i w_i wi​梯度的值大致相当实现是&#xff1a;实际上是在全连接中增加了两个节点 γ \gamma γ, β \beta β

设置区块链节点输出等级为警告级,并把日志存储阈值位100MB并验证;

题目 获取指定区块链节点输出等级为警告级&#xff0c;并设置日志存储阈值位100MB并验证&#xff1b; 操作步骤 1.切换目录 cd nodes/127.0.0.1/node0 2.打开配置文件并修改 vim config.ini warn&#xff1a;警告

拒绝一次性芯片,新技术:无线升级芯片

其便捷性和兼容性拥有4年经验的职场人都上手试用&#xff01; 就算把产品寄到国外出问题了或需要升级 2.4G射频芯片帮您实现Mcu Ota无线升级产品0.3就能换一次救命的机会&#xff0c;相当于给产品买个保险&#xff01; 问宇凡微拿了规格书和样品&#xff0c;经过几天的摸索研…

怎么更改文件创建日期?

怎么更改文件创建日期&#xff1f;如今科技发展日新月异&#xff0c;人们对于信息和数据的依赖程度日益加深。在这个高度信息化的时代&#xff0c;文件处理已经成为数字化办公不可或缺的环节。无论是个人还是企业&#xff0c;都需要通过数字化的方式来处理和管理大量的文档、表…

聊聊低代码技术

目录 一、什么是低代码开发&#xff1f; 二、为什么需要低代码开发&#xff0c;具备哪些优势&#xff1f; 三、低代码开发在实际工作中的作用 四、是不是有了低代码&#xff0c;就能不关注“质量”呢&#xff1f; 五、引迈旗下低代码开发平台--JNPF初体验 一、什么是低代码开发…

大厂硬性要求的性能优化,如何做到极致?可从7个方向切入

关于Android开发中的性能优化也是老生常谈的技术了。在许多大厂的招聘条件中就必须要求这项技术&#xff1b;因为Android 开发越来越规范&#xff0c; 国内工程师的素质&#xff0c;以及用户对产品的要求也越来越高。所以这也间接导致我们对研发项目的质量要求到了近乎苛刻的地…

『MySQL快速上手』-③-库的操作

文章目录 1.创建数据库2.创建数据库案例3.字符集和校验规则3.2 校验规则对数据库的影响3.2.1 进行查询3.2.2 进行排序 4.字符集和检验规则的作用5.操纵数据库5.1 查看数据库5.2 显示创建语句5.3 修改数据库5.4 数据库删除 6.备份与恢复6.1 备份6.2 还原6.3 注意事项 7.查看数据…

2023年最热门的五大编程技术趋势

2023年最热门的五大编程技术趋势 摘要&#xff1a;本文将介绍2023年最热门的五大编程技术趋势&#xff0c;包括人工智能、区块链、WebAssembly、5G和边缘计算以及自动化。我们将详细讨论这些趋势的当前状态、未来展望以及如何利用这些技术来提高您的编程技能。 一、前言 随着…

【NI-DAQmx入门】数据流盘

1.NI-DAQmx高速数据流盘 1.1什么是TDMS格式 TDMS文件格式是NI推荐易于交换、固有结构化、具有高速流传输能力的文件格式&#xff0c;用于将基于时间的测量数据保存到磁盘&#xff0c;以实现高性能、可用性和复用性。借助NI-DAQmx驱动&#xff0c;可以实现将数据快速传输到磁盘…

【vue3】引入高德地图并初始化

npm安装amap/amap-jsapi-loader包 <script setup> import AMapLoader from amap/amap-jsapi-loader; /*在Vue3中使用时,需要引入Vue3中的shallowRef方法 (使用shallowRef进行非深度监听, 因为在Vue3中所使用的Proxy拦截操作会改变JSAPI原生对象 否则会出现问题,建议JSAP…

学习笔记:利用CANOE Panel和CAPL脚本模拟主节点发送LIN通信指令

前一篇文章已经对CANOE如何模拟主节点和从节点进行LIN通信做了简单的记录&#xff0c;修改主节点发送的指令需要修改LIN ISC模块里的Frames帧对应的signal。这样改起来比较麻烦且不直观&#xff0c;幸好CANOE提供了Panel designer这样的工具&#xff0c;我们可以利用它设计自己…

谷歌浏览器配置允许跨域

1、在谷歌浏览器导航栏搜索chrome://flags 2、搜索Block insecure private network requests 3、修改状态

代码随想录打卡第六十三天|84.柱状图中最大的矩形

84.柱状图中最大的矩形 题目&#xff1a;给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 提示&#xff1a; 1 < heights.length <105 0 < h…

C语言:对于宏的一些概念及技巧

一、前言 宏在C语言中是一段有名称的代码段&#xff0c;在程序编译过程中&#xff0c;会将宏的内容被这段代码进行替换&#xff0c;常常用于定义一些常量、函数、代码块等&#xff0c;由于近年来发现许多公司进行面试时对于宏的面试题尤为多&#xff0c;故本文将对C语言中的宏的…

基于springboot实现招生平台管理系统项目【项目源码+论文说明】

基于springboot实现招生管理系统演示 摘要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括招生管理系统的网络应用&#xff0c;在外国招生管理系统已经是很普遍的方式&#xff0c;不过国内的管理网站可能还处于起步阶段。招…

使用Keepalived实现双机热备,实现服务高可用

安装&#xff08;所有节点&#xff09; yum -y install keepalived修改配置 vi /etc/keepalived/keepalived.conf :set nu //显示行号 :35 dG // 删除35行以后的所有行ip a将master1虚拟机挂起&#xff0c;再次执行ip a 看vip是否漂移到另一台虚拟机worker1 漂移了&…

一图搞懂傅里叶变换(FT)、DTFT、DFS和DFT之间的关系

自然界中的信号都是模拟信号&#xff0c;计算机无法处理&#xff0c;因此我们会基于奈奎斯特定理对模拟信号采样得到数字信号。 但是我们发现&#xff0c;即便是经过采样&#xff0c;在时域上得到了数字信号&#xff0c;而在频域上还是连续信号。 因此我们可以在时域中选取N点…

Softing TDX——设计模板

| 高质量的设计模板——减少开发诊断仪所需的工作量 现今&#xff0c;用户对诊断仪的界面和操作理念提出了更高的要求。一个直观的用户界面既能减少用户熟悉诊断仪的时间&#xff0c;又能减少在日常工作中进行诊断任务的时间。然而&#xff0c;创建一个精巧又独立于平台的诊断…

apollo docker搭建

1 mysql搭建 先需要一个mysql&#xff0c;mysql我使用的是5.7&#xff0c;搭建过程忽略 2 数据导入 我们需要从github上下载apolloportaldb.sql, apolloconfigdb.sql 2个sql 随后cp apolloconfigdb.sql apolloconfigdbUat.sql cp apolloconfigdb.sql apolloconfigdbDev.sq…