【干货分享】Linux操作系统自动化测试平台

【干货分享】Linux操作系统自动化测试平台


一、开发背景



1.1 Linux系统测试困难与问题

  • 产品迭代时间短,容易引入新bug
  • 以人工测试为主

  • 回归测试占比大,测试人手不足,测试环境不足

  • 对测试人员的技术要求较高

  • 有些手工难做到的测试

  • 复杂测试环境部署难



1.2Linux操作系统自动化测试平台

基于以上背景,基于Avocado的Linux操作系统自动化测试平台应运而生,以保证操作系统质量可靠性。



1.3 优势

  • 提高测试效率,节约人力,最大限度的缩短测试时间
  • 降低人工测试的错误概率

  • 回归测试更方便,可靠

  • 使用脚本语言和一些现有的库

      相比其他自动化工具开发和迭代的效率极高。

  • 支持多环境上部署

    突破其他自动化工具部署环境局限的瓶颈。

  • 支持多版本的系统测试

    支持BC-Linux、CentOS及其他Linux发行版(RHEL、OpenSUSE、Fedora)操作系统。

  • 集成复杂测试

    能够集成其他自动化工具无法进行的复杂的测试项目,轻松的部署复杂多机/双机高可用环境并进行测试,支持虚拟化的迁移等一系列复杂的虚拟化测试。



二、功能说明


2.1 介绍


Avocado是一款开源的自动化测试框架,它主要是由 autotest项目开发者开发的一款新的下一代自动化测试框架,目的是逐渐取代原来的autotest项目,主要开发语言为 python[1]。本次是使用Avocado-VT是Avocado的一个插件,它主要是为了支持与虚拟化相关的测试,它的前身是基于autotest的virt-test项目。


它的主要目的是帮助虚拟化社区的开发者建立一套虚拟化回归测试的框架,通过虚拟化技术搭建测试环境并执行众多的自动化测试项。[2]


2.2 优势


  • 便捷安装

  • 可集成度高,扩展性好,大大提高了测试效率,降低成本

  • 用户隔离,资源自动回收

  • 测试可追溯性,无论是运行态还是完成态的结果都可查询

  • 简明扼要的测试报告

2.3 如何运行测试[2]

【干货分享】Linux操作系统自动化测试平台

图2-1 测试流程


2.4 如何编写测试项目


以获取正常运行时间为例子编写一个测试项目[1]

 

2.4.1 执行脚本目录

 $ cd $AVOCADO_DATA/avocado-vt/test-providers.d/downloads/tp-bclinux
2.4.2 配置文件

① Avocado-vt不遍历目录,它使用笛卡尔配置(笛卡尔配置是一种高度专门化的方法,用于在各种类别的组合中提供键/值对列表)来定义测试和所有可能的测试变体。编写配置,需要一个文件:

touch generic/tests/cfg/uptime.cfg

② 配置文件如下:

- uptime:
   virt_test_type = qemu libvirt
   type = uptime

其中virt_test_type指定可以运行此测试的后端,type指定测试文件。

 

2.4.3 脚本文件

① 创建一个vm对象,并为它创建ssh会话,存放在generic/tests下

$ touch generic/tests/uptime.py


② 使用一个函数运行

def run(test, params, env):
   """
   Docstring describing uptime.
   """
   pass


③ 从测试环境中使用get_vm获取VM,它将获取存储在环境中的给定vm名称。main_vm包含环境中出现的主vm的名称,通常是vm1。env.get_vm返回一个vm对象,并把它存储在变量vm上。

def run(test, params, env):
   """
   Docstring describing uptime.
   """
   vm = env.get_vm(params["main_vm"])


④ 从qemu流程的角度,需要确保这个vm是活动的,将调用verify_alive(),该方法将验证qemu进程是否正常,以及监视器(如果存在的话)是否正常。如果由于任何问题而不满足这些条件中的任何一个,将抛出异常,测试将失败。这一要求是因为,有时由于一个bug, vm进程可能会挂掉,或者监视器没有响应。

def run(test, params, env):
   """
   Docstring describing uptime.
   """
   vm = env.get_vm(params["main_vm"])
   vm.verify_alive()


⑤ 从参数dict获取登录超时时间,调用wait_for_login()登录到vm并将超时传递给它,将产生的会话对象存储在一个名为session的变量上。

def run(test, params, env):
   """
   Docstring describing uptime.
   """
   vm = env.get_vm(params["main_vm"])
   vm.verify_alive()
   timeout = float(params.get("login_timeout", 240))
   session = vm.wait_for_login(timeout=timeout)


⑥ Avocado-VT将尽力保持会话,如果由于超时或其他原因,它将抛出一个失败,测试失败。如果没有问题,可以通过session对象在实验环境上使用cmd()输入命令并获得这些命令的输出,并存储在一个变量中,如果命令的退出代码是!= 0,它将抛出一个aexpect.ShellError。


因此,获取unix命令uptime的输出非常简单,只需调用cmd()并将' uptime '作为参数,然后将结果存储在一个名为uptime的变量中:

def run(test, params, env):
   """
   Docstring describing uptime.
   """
   vm = env.get_vm(params["main_vm"])
   vm.verify_alive()
   timeout = float(params.get("login_timeout", 240))
   session = vm.wait_for_login(timeout=timeout)
   uptime = session.cmd('uptime')


⑦ 如果想打印获取到的值,以便可以在测试日志上看到它,那么可以使用日志库记录正常运行时间的值。最后可以使用close()方法关闭远程连接。

def run(test, params, env):
   """
   Docstring describing uptime.
   """
   vm = env.get_vm(params["main_vm"])
   vm.verify_alive()
   timeout = float(params.get("login_timeout", 240))
   session = vm.wait_for_login(timeout=timeout)
   uptime = session.cmd('uptime')
   logging.info("Guest uptime result is: %s", uptime)
   session.close()


⑧ 运行vt-bootstrap将配置和执行脚本配置到实际配置中:

$ avocado vt-bootstrap


2.5 如何编写复杂的多主机迁移测试[2]

2.5.1 方案

多主机迁移采用如下方案

【干货分享】Linux操作系统自动化测试平台

图2-2 多主机迁移框架

2.5.2 编码分析

前提:(1)搭建nfs共享存储,用来存放镜像文件(2)在2个迁移节点上挂载存储服务器提供的共享目录

下面是多主机迁移代码分析:

多主机迁移函数mig = TestMultihostMigration(test, params, env),做了下面几件事:

(1)准备好VM的磁盘。

(2)启动同步服务器。

(3)VM创建磁盘后,所有主机将同步。

大致代码如下:

class TestMultihostMigration(virt_utils.MultihostMigration):
   def migration_scenario(self):
       def worker(mig_data):
           vm = env.get_vm("vm1")
           session = vm.wait_for_login(timeout=self.login_timeout)
           session.sendline("nohup dd if=/dev/zero of=/dev/null &")
           session.cmd("killall -0 dd")
       def check_worker(mig_data):
           vm = env.get_vm("vm1")
           session = vm.wait_for_login(timeout=self.login_timeout)
           session.cmd("killall -9 dd")
       # Work is started only on first VM.
       self.migrate_wait(["vm1", "vm2"], srchost, dsthost,
                         worker, check_worker)
       # Starts one migration without synchronization with work.
       mig1 = self.migrate(["vm1"], srchost, dsthost,
                           worker, check_worker)
       time.sleep(20)
       mig1.join()
mig = TestMultihostMigration(test, params, env)
# Start test.
mig.run()

其中migrate() 做了图表中事情

目的地

如果机器没有启动,准备虚拟机。

开始VM上工作


mig.migrate_vms_src()

mig.migrate_vms_dest()


迁移后检查VM上的工作

在所有主机上等待完成迁移

表2-1 migrate处理流程

需要注意的是,迁移是使用tcp协议进行的,因为其他协议不支持多主机迁移。 


2.6 平台功能演示


2.6.1 安装方法

为了支持BC-Linux系统的安装及测试,我们基于原有的项目添加了支持BC-Linux系统的配置,并重新编译打包了相关RPM包,可直接下载安装。

【干货分享】Linux操作系统自动化测试平台

图2-3Avocado下载源

2.6.2 执行方法

① 系统安装

可以利用libvirt 通过ISO的安装方式进行BC-Linux的镜像安装测试
# avocado run bclinux-tp-qemu.unattended_install.cdrom.extra_cdrom_ks.default_install.aio_native --vt-type libvirt --vt-guest-os Linux.BCLinux.7.4.x86_64.Base.i440fx
JOB ID     : 5dcfcc03735970d0f9b1de5c18d291d4fa764567
JOB LOG    : /root/avocado/job-results/job-2018-11-01T15.25-5dcfcc0/job.log
TESTS      : 1
(1/1) bclinux-tp-qemu.unattended_install.cdrom.extra_cdrom_ks.default_install.aio_native: PASS (728.71 s)
RESULTS    : PASS 1 | ERROR 0 | FAIL 0 | SKIP 0 | WARN 0 | INTERRUPT 0
JOB HTML   : /root/avocado/job-results/job-2018-11-01T15.25-5dcfcc0/html/results.html
TESTS TIME : 728.71 s
查看RESULTS,显示PASS,测试结果OK,如果有问题,可以通过HTML方式查看测试报告,测试报告是上述执行结果中的JOB HTML;也可通过日志进行查看,存放在上述执行结果中的JOB LOG同层目录下。

 

② 模块测试

在上述步骤①的基础上,由test runner执行各模块测试脚本用例:a.测试通过配置bse.conf文件,bse能否支持自动设置ssh警告bannerb.测试通过配置bse.conf文件,bse能否支持自动设置口令重复次数
# avocado run bclinux-tp-qemu.enhance_motd_sshBanner --vt-type libvirt --vt-guest-os Linux.BCLinux.7.4.x86_64.Base.i440fx
JOB ID     : 62509cc1a58339687147040956f8352a1bed28dd
JOB LOG    : /root /avocado/job-results/job-2018-11-01T16.01-62509cc/job.log
TESTS      : 1
(1/1) bclinux-tp-qemu.enhance_motd_sshBanner: PASS (359.97 s)
RESULTS    : PASS 1 | ERROR 0 | FAIL 0 | SKIP 0 | WARN 0 | INTERRUPT 0
JOB HTML   : /root /avocado/job-results/job-2018-11-01T16.01-62509cc/html/results.html
TESTS TIME : 359.97 s
2.6.3 实测结果

基于BC-LInux的人工和自动化平台测试时间对比。 

测试工具

人工测试时间

自动测试时间

安装操作系统(虚拟机)

0.5h

742.83s

基本功能(不包含安装)

0.5d

1035s

高可用组件

2d+

1.5h

安全加固

1d

763s

授权管理

1d

51min

虚拟化

2d

21min

实时内核

0.5d+时延(13h*2)

168s+时延(13h*2)

定制化内核

0.5d+pts(12h*2)

157s+pts(12h*2)

调优profile

0.5d

122s

ML内核

1h+pts(12h)

113s+pts(12h)

LT内核

1h+pts(12h)

197s+pts(12h)

OpenSSL

0.5d

272s

总共

12 d/人

4 d/人

表2-2 人工与自动化测试时间对比


三、后续规划

1. 完善Linux测试平台2. 与Jenkins完成CI对接,开发和测试通过CI实现高度协同工作3. 推广至其他版本的Linux产品4. 推广至arm平台

 

参考文献:

[1] https://avocado-framework.readthedocs.io/en/71.0/

[2] https://avocado-vt.readthedocs.io/en/latest/


End

往期精选

1

【大云制造】为云而生 - 大云BEK内核

2

【干货分享】硬件加速介绍及Cyborg项目代码分析

3

【干货分享】Kubernetes容器网络之CNI漫谈

【干货分享】Linux操作系统自动化测试平台


上一篇:从WinDbg中的转储查看操作系统版本和SP详细信息


下一篇:/proc/uptime参数的意义