命令行测试杂谈

这篇博客面向的对象

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

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

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

如何才叫很好的组织

命令行测试杂谈_第1张图片

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

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

如何完成这些需要

超时控制

命令行测试杂谈_第2张图片

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

超时有很多方法。

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

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

timeout 2s sleep 10

清理策略

命令行测试杂谈_第3张图片

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

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

命令行测试杂谈_第4张图片

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

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

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

/bin/kill -TERM -$pgid

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

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

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

命令行测试杂谈_第5张图片

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

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

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

find -type f | egrep 'test_\.*\.py$' | xargs -i python {}
  1. 有办法可以重新运行失败的case
    命令行测试杂谈_第6张图片

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

你可能感兴趣的:(命令行测试杂谈)