linux/mac下的自动化测试框架avocado简介
根据我这几年的工作经验来看,avocado绝对算得上顶级的自动化测试引擎了,这么好用的一个工具在国内却并不流行,我认为有几个小原因,一是中文文档少,二是很多公司闷声发大财,华为云大量使用avocado测试框架,可是市面上华为人习惯了低调,很少介绍。
avocado可以测什么?可以应用到的场景
- 虚拟化领域测试
- 接口自动化测试
比如说现在有一个库,是用c语言写的,这个库提供给系统很多接口,我们当然可以用c语言来调用这些接口进行功能性能的测试,但是现在我们有更好的选择了,我们可以用python来调用这些接口了,要知道python和系统打交道的能力是比较简单的,所以python用来写测试脚本非常适合。有一个自动化框架avocado,它不一定是最好的,但确实是一种解决方案。
1.什么是avocado?
avocado就是一个开源项目,托管在gitub上,任何人都可以下载源码。
2.怎么获取avocado源码?
点击链接avocado-framework
在本地的gitbash中选择目录git clone
https://github.com/avocado-framework/avocado.git这样源码就获取了
3.怎么安装avocado?
git clone git://github.com/avocado-framework/avocado.git
cd avocado
sudo make requirements
sudo python setup.py install
4.怎么用avocado?
python setup.py install
5.怎么用avocado做测试?
avocado run test.py [-m test.yaml ]–show-job-log
其中[]中的内容可是视情况而添加或删减,test.py就是要测试的文件
6.什么人适用于用avocado?
(1)linux环境,因为avocado是部署在linux上面的
(2)python测试语言,因为avocado主要是靠python实现的
7.python如何测试c的动态函数库?
此问题看似与avocado无关其实还是有关的
如何查看linux动态库中包含哪些函数?怎么把python和c的数据类型进行转换?python如何载入动态函数库?
我是不会告诉你linux下有一个工具叫做readelf的,我也不会告诉你python中有一个库叫做ctypes
8.avocado支持用例的配置文件yaml
9.avocado工具自身的配置
http://avocado-framework.readthedocs.io/en/latest/Configuration.html
注意和用例配置的区别
avocado的配置文件基于INI文件,可被python的ConfigParser解读
例子
[datadir.paths]
base_dir = ~/avocado
test_dir = /$HOME/Code/avocado/examples/tests
data_dir = /usr/share/avocado/data
logs_dir = ~/avocado/job-results
配置文件解析顺序,先解析A,在解析B,这样B中的配置就能覆盖A中的配置
有两处配置文件A/etc/avocado/avocado.conf和 B~/.config/avocado/avocado.conf
还有另一个配置文件目录/etc/avocado/conf.d,这个目录下面主要包含一些扩展插件的配置
使用avocado config命令可以让你知道当前被使用的配置文件
插件的配置文件,为了不干扰主配置文件,插件的配置以如下形式,/etc/avocado/conf.d/[pluginname].conf,而且也可以被用户自身的配置文件所覆盖
meaning that what you set on your local config file may override what’s defined in the system wide files
还可以配置pre和post脚本/etc/avocado/scripts/job/pre.d和/etc/avocado/scripts/job/post.d用于测试之前和之后执行
[plugins.jobscripts]
pre = /my/custom/directory/for/pre/job/scripts/
10.运行测试三件事
When running tests, we are frequently looking to:
Locate tests
Write logs to a given location
Grab files that will be useful for tests, such as ISO files or VM disk images
当跑测试的时候,我们在意:
定位测试
保留日志用来定位
抓取有用的文件,例如输入输出,或者是虚拟机磁盘镜像,等等【其实就是为了保留复现环境】
11.avocado怎么收集系统信息?
sysinfo pre执行用例之前
sysinfo post执行用例之后
sysinfo profile
应该是某处调用了这个类class avocado.core.sysinfo.Command,在测试pre,和post时获取到系统信息。
【具体怎么实现的我还在研究,待续~】
参考http://avocado-framework.readthedocs.io/en/latest/ReferenceGuide.html?highlight=post
12.avocado怎么清理执行环境
当一个测试结束之后,为了不干扰下一个测试,我们要清理环境。
结合unittest的setUp, tearDown来理解。在tearDown中清理环境。
13.avocado结果说明
这个结果有测试的日志,有环境的信息,好处就是详细,坏处就是占空间了。我觉得这里里面job.log和sysinfo很重要,如果想要定位问题的话,这两个基本上就够了。
avocado一个典型的测试结果的目录结构如下:
$HOME/avocado/job-results/job-2014-08-13T00.45-4a92bc0/
├── id
├── jobdata
│ ├── args
│ ├── cmdline
│ ├── config
│ ├── multiplex
│ ├── pwd
│ └── urls
├── job.log
├── results.json
├── results.xml
├── sysinfo
│ ├── post
│ │ ├── brctl_show
│ │ ├── cmdline
│ │ ├── cpuinfo
│ │ ├── current_clocksource
│ │ ├── df_-mP
│ │ ├── dmesg_-c
│ │ ├── dmidecode
│ │ ├── fdisk_-l
│ │ ├── gcc_–version
│ │ ├── hostname
│ │ ├── ifconfig_-a
│ │ ├── interrupts
│ │ ├── ip_link
│ │ ├── ld_–version
│ │ ├── lscpu
│ │ ├── lspci_-vvnn
│ │ ├── meminfo
│ │ ├── modules
│ │ ├── mount
│ │ ├── mounts
│ │ ├── numactl_–hardware_show
│ │ ├── partitions
│ │ ├── scaling_governor
│ │ ├── uname_-a
│ │ ├── uptime
│ │ └── version
│ ├── pre
│ │ ├── brctl_show
│ │ ├── cmdline
│ │ ├── cpuinfo
│ │ ├── current_clocksource
│ │ ├── df_-mP
│ │ ├── dmesg_-c
│ │ ├── dmidecode
│ │ ├── fdisk_-l
│ │ ├── gcc_–version
│ │ ├── hostname
│ │ ├── ifconfig_-a
│ │ ├── interrupts
│ │ ├── ip_link
│ │ ├── ld_–version
│ │ ├── lscpu
│ │ ├── lspci_-vvnn
│ │ ├── meminfo
│ │ ├── modules
│ │ ├── mount
│ │ ├── mounts
│ │ ├── numactl_–hardware_show
│ │ ├── partitions
│ │ ├── scaling_governor
│ │ ├── uname_-a
│ │ ├── uptime
│ │ └── version
│ └── profile
└── test-results
└── tests
├── sleeptest.py.1
│ ├── data
│ ├── debug.log
│ └── sysinfo
│ ├── post
│ └── pre
├── sleeptest.py.2
│ ├── data
│ ├── debug.log
│ └── sysinfo
│ ├── post
│ └── pre
└── sleeptest.py.3
├── data
├── debug.log
└── sysinfo
├── post
└── pre
22 directories, 65 files
14.我如何让用例自动化运行起来?
比如我可能写了多个用例,放在了不同的文件中,那么avocado怎么让这多个用例运行?
Running A More Complex Test Job
运行多个用例
$ avocado run failtest.py sleeptest.py synctest.py failtest.py synctest.py /tmp/simple_test.sh
JOB ID : 86911e49b5f2c36caeea41307cee4fecdcdfa121
JOB LOG : $HOME/avocado/job-results/job-2014-08-12T15.42-86911e49/job.log
TESTS : 6
(1/6) failtest.py:FailTest.test: FAIL (0.00 s)
(2/6) sleeptest.py:SleepTest.test: PASS (1.00 s)
(3/6) synctest.py:SyncTest.test: PASS (2.43 s)
(4/6) failtest.py:FailTest.test: FAIL (0.00 s)
(5/6) synctest.py:SyncTest.test: PASS (2.44 s)
(6/6) /bin/true: PASS (0.00 s)
(6/6) /tmp/simple_test.sh.1: PASS (0.02 s)
RESULTS : PASS 2 | ERROR 2 | FAIL 2 | SKIP 0 | WARN 0 | INTERRUPT 0
TESTS TIME : 5.88 s
JOB HTML : $HOME/avocado/job-results/job-2014-08-12T15.42-86911e49/html/results.html
15.如何远端运行?
avocado提供了一个通过ssh连接远端运行的用例的机制。
such as:
avocado run --remote-hostname 192.168.122.30 --remote-username root examples/tests/sleeptest.py examples/tests/failtest.py
avocado配置文件说明
avocado config查看
.config/avocado/avocado.conf
jobs tests概念说明
avocado run test.py 这个运行相当于产生一个job,可以理解为一组测试套
avocado可以实现的功能说明
批量执行测试用例
命令行执行意味着可以很方便的和jenkins等CI工具进行结合
每个测试用例在单独的进程中执行
avocado测试框架中,每个测试会在独立的进程中执行,测试执行进程是runner进程的子进程
至于子进程和父进程的关系,就要看具体在什么操作系统上了
信号处理
发送到avocado主进程的信号会按照如下方式处理
Ctrl+Z 会让执行用例的子进程暂停
Ctrl+C 会让正在执行的子进程中止
保存测试日志方便定位
avocado会在job-result目录下保存测试日志,出现问题可以通过查看日志方式进行定位
通过插件生成html格式测试报告
问题
1.测试用例是怎么执行的?
在子进程中执行
proc = multiprocessing.Process(target=self._run_test,args=(test_factory, queue,))
...
proc.start()
2.测试用例是怎么发现的?
或者说测试用例是怎么从命令行的文本字符串变成可以执行的实例对象的
job->suite->test
loader测试套加载