为了让自动化测试“自动化”起来,现在我们来创建定时任务,使自动化测试脚本在指定的时间自动
化运行。创建定时任务的方法有很多,比如,我们可以写一段程序让其在指定的时间运行 all_test.py 文
件,或者使用系统的定时任务功能在指定的时间运行 all_test.py 文件。
通过程序创建定时任务
现在我们来回顾一下运行 Python 程序(all_test.py)有多少种方式。如果是通过 Python 自带的编
辑器 IDLE(Python GUI)的话 F5 运行,如果通过 sublime 编辑器的话按 Ctrl+B 运行,在 cmd 命令提示
器的话通过“Python all_test.py”命令执行。
在 Python 的 os 模块中提供了 system()用来执行系统命令。比如我们要执行 E:\\test_object\\目录
下的 all_test.py 文件,可以这样来实现:
#coding=utf-8
import os
os.system('E:\\test_object\\all_test.py')
或者我们先切换到相应的目录,然后通过 Python 命令去执行 all_test.py 文件更符合我们在 cmd 下
面的操作顺序。
start_run.py
import os
os.chdir("E:\\test_object")
os.system('Python all_test.py')
chdir()用切换到某个目录下,当相于 shell 下的“cd ”命令,system 可执行任意 shell 或 DOS 命令。
好吧!回到问题的出发点上我们的重点是定时任务,我们前面已经学过 time 模块了,要实现这个功
能非常简单,获取当前时间判断是不是要执行自动化的时间。
start_run.py
#coding=utf-8
import os,time
k=1
while k <2:
now_time=time.strftime('%H_%M')
if now_time == '21_00':
print u"开始运行脚本:"
os.chdir("E:\\test_object")
os.system('Python all_test.py') #执行脚本
print u"运行完成退出"
break
else:
time.sleep(10)
print now_time
程序的实现很简单,首先定义变量 k 的值为 1,通过 while 判断 k 的值是否小于 2,在不改变 k 的值
的情况下,k 会永远小于二,然后通过 strftime()方法获取当前的小时和分钟,然后通过 if 判断是否等
于 21:00,如果不相等,休眠 10 秒(这个休眠时间只要不超过 60 秒即可,超过了 60 秒,可能直接会从
20:59 跳到 21:01,从而错过了 20:00),当前时间为 21:00 时执行 all_test.py 程序从而执行自动化测试。
并且 break 结束循环。
或者你想每天 20:00 跑自动化测试用例,那么可以不要 break ,程序继续运行,直到遇见下一个 20:00,
自动化测试再次被执行。
Python 身为脚本语言处理此类问题是它强项,所以不用怀疑它这方法的能力,如果有类似这方面需求
可以进一步学习。
Windows 添加任务计划
哪果时刻都在电脑上开这么一个程序,会不会觉得比较“碍事”呢!?其实操作系统本身也提供了强
大的定时任务功能。我们先以 Windows 系统为例介绍如何设置定时任务。根据当前市场 Windows 7 市场占
有率最高,所以我们以 Windows 7 为例。
通过控制面板-->管理工具-->任务计划程序(或者在“开始”菜单中搜索“任务计划程序”):
选择菜单栏“操作”选项中可以选择“创建基本任务”和“创建任务”,前者创建过程比较简单,我
们选择后者进行设置。
OK,现在我们可以验证一下任务设置的是否成功,在任务计划上右键选择“运行”,任务就可以开始
运行了。
Linux 添加任务计划
在 linux 下相对实现定时任务的方式比较灵活。我们可以通过 at 命令实现一次性计划任务,也可以
通过 batch 实现周期性计划任务。这里我们同样选择使用比较广泛的 Ubuntu 为例。
一、通过 at 命令创建任务
at 命令主要用于创建临时的任务,创建的任务只能被执行一次。同样在当前系统下创建 test_object
测试项目。
/home/fnngj/test_object/all_test.py
Ubuntu 终端
fnngj@fnngj-pc:~/test_object$ pwd
/home/fnngj/test_object
fnngj@fnngj-pc:~/test_object$ ls
all_test.py report test_case test_date
fnngj@fnngj-pc:~/test_object$ at now+5 minutes
warning: commands will be executed using /bin/sh
at> Python /home/fnngj/test_object/all_test.py
at> <EOT>
job 1 at Tue Jan 27 23:08:00 2015
now+5 minutes now 表示当前时间的5分钟之后执行,回车,设置要执行的文件。
Python /home/fnngj/test/fiele.py 通过 Python 命令设置要执行的 all_test.py 的完整路径。
Ctrl+d 保存退出,提示:2015年1月27日23:08:00创建了第一个工作任务。
查看创建的任务
Ubuntu 终端
fnngj@fnngj-pc:~/test_object$ at -l
1 Tue Jan 27 23:08:00 2015 a fnngj
fnngj@fnngj-pc:~/test_object$ atq
1 Tue Jan 27 23:08:00 2015 a fnngj
at -l / atq 两个命令查看 at 创建的任务。
删除已经设置的任务
Ubuntu 终端
fnngj@fnngj-pc:~/test_object$ at -l
8 Wed Jan 28 23:40:00 2015 a fnngj
10 Thu Jan 29 23:31:00 2015 a fnngj
9 Wed Jan 28 23:42:00 2015 a fnngj
fnngj@fnngj-pc:~/test_object$ atrm 9 --删除任务
fnngj@fnngj-pc:~/test_object$ at -l
8 Wed Jan 28 23:40:00 2015 a fnngj
10 Thu Jan 29 23:31:00 2015 a fnngj
通过 atrm 命令删除定时任务的编号。
启动 atd 进程
linux 一般默认会启动 atd 进程,如果没有启动,可以手动将进程开启。
Ubuntu 终端
fnngj@fnngj-pc:~/test_object$ ps -ef|grep atd
daemon 814 1 0 22:27 ? 00:00:00 atd
fnngj 5995 5683 0 23:35 pts/6 00:00:00 grep --color=auto atd
fnngj@fnngj-pc:~/test_object$ /etc/init.d/atd status #启动进程
* atd is running
at 命令指定时间的方式。
绝对计时方法:
midnight noon teatime
hh:mm [today]
hh:mm tomorrow
hh:mm 星期
hh:mm MM/DD/YY
相对计时方法:
now+n minutes
mow+n hours
now+n days
用法:
指定在今天下午17:30执行某命令(假设现在时间是下午14:30,2014年1月11日)
命令格式:
at 5:30pm
at 17:30
at 17:20 today
at now+3 hours
at now+180 minutes
at 17:30 14.1.11
at 17:30 1.11.14
二、通过 crontab 命令创建任务
crontab 可以方便的用来创建周期性任务,也许你想每天某个时间执行 Python 程序,或每周五的某
个时间执行。crontab 像 windows 的计划任务一样方便,或者更加灵活。
下面通过 crontab 来创建任务,通过 rontab -e 命令进入 crontab 文件。
Ubuntu 终端
fnngj@fnngj-pc:~/test_object$ crontab -e
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
3 * * * * Python /home/fnngj/test_object/all_test.py
默认通过 vi/vim 打开了 crontab 文件,关于 vi/vim 的学习与使用参考 linux 相关书籍。按键盘 i、
o、a 任意一个键进入编辑状态,可以对文件进行修改。
Crontab 任务格式如下:
m H Dom Mon Dow command
分钟 小时 天 月 星期 命令/脚本
* 21 * * * Python /home/fnngj/test_object/all_test.py
上面的任务表示:每天的21:00,执行 all_test.py 程序。
任务编写完成。按键盘 Esc 退出编辑模式,输入“:wq!” 保存并退出文件。
启动 crontab 服务:
注意:在完成编辑以后,要重新启动 cron 进程,crontab 服务操作说明:
~$ /etc/init.d/cron restart //重启服务
~$ /etc/init.d/cron start //启动服务
~$ /etc/init.d/cron stop //关闭服务
~$ /etc/init.d/cron reload //重新载入配置
查看 crontab 任务 计划:
Ubuntu 终端
root@fnngj-pc:~/test_object$ cd /var/spool/cron/crontabs/
root@fnngj-pc:~/var/spool/cron/crontabs$ ls
fnngj
root@fnngj-pc:~/var/spool/cron/crontabs$ cat fnngj
……
# m h dom mon dow command
3 * * * * Python /home/fnngj/test_object/all_test.py
注意:在查看 crontab 任务计划时必须要用 root 用户,否则会提示权限不足。
b crontab 格式说明:
crontab 的命令格式
crontab {-l|-r|-e}
-l 显示当前的 crontab
-r 删除当前的 crontab
-e 使用编辑器编辑当前 crontab 文件
好多人都觉得周期计划任务设置起来比较麻烦,其实我们只要掌握规律就很好设置。
在以上各个字段中,还可以使用以下特殊字符:
星号(*):代表所有可能的值,例如 month 字段如果是星号,则表示在满足其它字段的制约条件后
每月都执行该命令操作。
正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正
斜线可以和星号一起使用,例如*/10,如果用在 minute 字段,表示每十分钟执行一次。
实列:
假如,我们每天早上4点跑自动化测试用例。
m H Dom Mon Dow command
分钟 小时 天 月 星期 命令/脚本
* 4 * * * Python /home/fnngj/test_object/all_test.py
假如,我们每周一和三下午的6点运行自动化测试用例:
m H Dom Mon Dow command
分钟 小时 天 月 星期 命令/脚本
* 18 * * 1 ,3 Python /home/fnngj/test_object/all_test.py
在上学的时候都有上机课,周一到周五,下午5点30上课结果。我们需要在5点30发一个通知,5点45
自动关机。设定计划任务需要分两步完成,第一步提醒,第二步关机
m H Dom Mon Dow command
分钟 小时 天 月 星期 命令/脚本
30 17 * * 1-5 /usr/bin/wall < /hzh/test/close.wall
45 17 * * 1-5 /usr/bin/shudown -h now