为了让自动化测试“自动化”起来,现在我们来创建定时任务,使自动化测试脚本在指定的时间自动

化运行。创建定时任务的方法有很多,比如,我们可以写一段程序让其在指定的时间运行 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