这篇博客面向的对象
- *unix系统
- 测试是有一个个的程序组成的。
在百度做测试,测试程序有用python写的,也有是shell写的。还有是用gtest的框架写的。各种各样。 但是用法基本不变,就是运行一个个的测试程序。
这篇文章主要讨论的是如何很好的去运行这一个一个的程序,如何将其很好的组织起来。
如何才叫很好的组织
- 运行的程序应该有程序的超时控制。
- 程序超时后,由测试程序调用起来的程序应该被全部清理掉
- 可以指定运行那些case
- 有办法可以重新运行失败的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 {}
- 有办法可以重新运行失败的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