使用 Python 在 Linux 上实现一键回归测试

在 Linux 平台上进行大型项目开发过程中,测试人员需要定期(通常是每天),从代码库中更新代码、编译版本、运行全部测试脚本、收集并发布测试结果。这个过程既繁琐又耗时。通常我们希望能在下班后能自动完成这一系列操作,本文将讲述如何利用 Python 脚本轻松实现这一过程。

从代码库迁出代码 ---- pexpect 的使用

测试人员从代码库(例如 CVS )迁出代码的过程中,需要手动输入访问密码,而 Python 提供了 Pexpect 模块则能够将手动输入密码这一过程自动化。当然 Pexpect 也可以用来和 ssh、ftp、passwd、telnet 等命令行进行自动化交互。这里我们以 CVS 为例展示如何利用 Pexpect 从代码库迁出代码。

清单 1. 用 pexpect 迁出代码库代码

try: chkout_cmd = 'cvs co project_code' #从代码库迁出 project_code 的内容 child = pexpect.spawn(chkout_cmd) child.expect('password:') child.sendline('your-password') #请替换"your-password"为真实密码 child.interact() except: pass #忽略迁出代码中的错误

在清单 1 中,我们用命令"cvs co project_code"从代码库中迁出了 project_code 的内容,我们也可以用该命令来更新已经迁出的代码。只需要将命令"cvs update" 传给类 pexpect.spawn()即可,详细的实现请参考代码文件。这里 interact()函数是必须的,用来在交互的方式下控制该子进程。有时代码库中会存在目录不一致行情况,迁出代码会因报错终止,所以需要异常处理(try ... execpt)来忽略该错误。

《Python核心编程 第二版》.(Wesley J. Chun ).[高清PDF中文版]

《Python开发技术详解》.( 周伟,宗杰).[高清PDF扫描版+随书视频+代码]

Python脚本获取Linux系统信息

Ubuntu下用Python搭建桌面算法交易研究环境

编译代码和运行测试脚本 ---- subprocess 的使用

测试人员获取最新的代码之后,就要对源码进行编译,并且运行测试用例。Python 语言提供了多种方法如 os.system()/os.popen()来执行一条命令,这里我们推荐用 subprocess 模块来创建子进程,完成代码编译和运行测试用例。因为 subprocess 支持主进程和子进程的交互,同时也支持主进程和子进程是同步执行还是异步执行。由于本文中的各个功能模块有都先后依赖关系,所以全部采用的是主进程和子进程同步模式执行。

编译代码

清单 2. 用 subprocess 编译代码

build_cmd = 'build_command_for_your_code' #请在这里配置编译命令 build_proc = subprocess.Popen(build_cmd, stdin=None, stdout=None, stderr=None, shell=True) build_proc.wait() #等待子进程结束 assert (0 == build_proc.returncode)

在一些系统中我们编译代码采用的是脚本文件(如 shell 脚本),那么我们仍然可以如下命令来完成代码编译工作。

清单 3. 用 subprocess 的 call 函数执行脚本文件

subprocess.call(["code_compile.sh"])

运行测试脚本

在编译完成代码之后,我们同样可以调用 subprocess.Popen 来创建子进程运行测试用例。如果测试人员的测试用例已经写成了测试例脚本,我们则可以用 subprocess.call()来执行测试例脚本文件,代码实现就不再赘述。有些系统会直接把详细日志输出到屏幕上,那么我们可以用重定向命令"2>&1"把屏幕输出写文件。

清单 4. 用重定向命令把输出写文件

ut_cmd = 'Your_unit_test_command 2>&1 > %s' %self.debug_log #debug_log 定义在__init__函数中,用来存储详细日志

测试结果存储和发布 ---- XML 解析

我们的项目采用敏捷开发,为了更好的反应敏捷开发周期,我们希望存储日志的目录名不但能够指明的具体日期,同时也能反映敏捷(迭代)开发阶段,这样相关人员在查看相应目录中的日志时,能够清楚的明白日志实在在哪个迭代周期的哪一天产生的。本文使用文件 summary 作为运行测试用例后生成的汇总日志,用文件 log.txt 用来存储详细日志。如下图所示,在共享目录 SharedFiles 中存储了一些列迭代周期中的日志。

清单 5. 共享目录结构

SharedFiles ├── Sprint10-20130823121500 │ ├── log.txt │ └── summary ├── Sprint10-20130826152715 │ ├── log.txt │ └── summary ├── Sprint10-20130828165235

为了能够让目录名反映敏捷开发周期,我们需要自己定义一个配置文件(txt 或 xml 均可)。由于 Python 已经很好的支持了 XML 解析,并且 XML 文件作为配置也是当前的流行趋势。本文就以 XML 解析为例进行说明。本文使用的 XML 文件名是 Sprint.xml,清单 6 是该 xml 的概要内容

清单 6. Sprint.xml 文件结构

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/232289fd65d0f6906075dbde90bbe098.html