命令行测试杂谈

这篇博客面向的对象

  1. *unix系统
  2. 测试是有一个个的程序组成的。

在百度做测试,测试程序有用python写的,也有是shell写的。还有是用gtest的框架写的。各种各样。 但是用法基本不变,就是运行一个个的测试程序。

这篇文章主要讨论的是如何很好的去运行这一个一个的程序,如何将其很好的组织起来。

如何才叫很好的组织

在此输入图片描述

  1. 运行的程序应该有程序的超时控制。
  2. 程序超时后,由测试程序调用起来的程序应该被全部清理掉
  3. 可以指定运行那些case
  4. 有办法可以重新运行失败的case

这4条是否有异议,有异议请留言。

如何完成这些需要

超时控制

在此输入图片描述

没有超时控制简直就是个灾难,举个例子,有一个测试程序不小心加了个for循环,然后你就等啊等,然后头发突然白了。

超时有很多方法。

python的测试框架py.test有个插件叫timeout. 但是有时不太好使,个人怀疑是python本身的问题。

linux下本身就有个程序叫timeout, 用法也很简单, 比如打算设置个2秒超时

timeout 2s sleep 10

清理策略

在此输入图片描述

程序的清理方法,最重要的一步是标记出哪些程序启动了。 一般有两个思路,先说最简单的这种

启动程序,查看这个程序的pgid(process group id)

在此输入图片描述

网上看到了一个不错的命令,可以通过pid查看pgid

/bin/ps -o pgid -p $pid --no-header

然后使用kill的命令, 注意这个$pgid前面有个负号

/bin/kill -TERM -$pgid

PGID为进程所在的进程组的ID

其实还有一个方法,jenkins在用,就是启动的进程中标记一个环境变量。这样子进程就会继承这个环境变量。 需要清理的时候,首先遍历进程表,然后查找进程中包含该pid的进程。

如何过滤出我们需要的那些case

在此输入图片描述

最好的办法是按照名字去匹配。 比如目录下有3个文件

  • test_openfile.py
  • test_opendir.py
  • base_lib.py

如果想过滤出test开头的,办法可以用个shell脚本搞定了

find -type f | egrep 'test_\.*\.py$' | xargs -i python {}
  1. 有办法可以重新运行失败的case 在此输入图片描述

pytest这个测试框架有个rerunfailed插件。 很不错 https://github.com/klrmn/pytest-rerunfailures 安装方法:

pip install git+https://github.com/klrmn/pytest-rerunfailures.git

如果用shell搞也是有办法的,就是稍微麻烦了点

find -type f | while read name
do
    python $name || echo $name > fails.txt
done

这种方法运行,失败的就记录都fails.txt这个文件里了, 重新运行只要

cat fails.txt | while read name
do
    python $name
done

结束语

终于写完了。 需要注意的地方还是挺多的。 这些需要注意的地方组合在了一起,就成了我现在在用的工具 https://github.com/codeskyblue/travelexec

转载于:https://my.oschina.net/goskyblue/blog/228936

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值