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

图片


1、开发背景html



1.1 Linux系统测试困难与问题python

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

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

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

  • 有些手工难作到的测试安全

  • 复杂测试环境部署难服务器



1.2Linux操做系统自动化测试平台网络

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



1.3 优点session

  • 提升测试效率,节约人力,最大限度的缩短测试时间
  • 下降人工测试的错误几率app

  • 回归测试更方便,可靠

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

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

  • 支持多环境上部署

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

  • 支持多版本的系统测试

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

  • 集成复杂测试

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



2、功能说明


2.1 介绍


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


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


2.2 优点


  • 便捷安装

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

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

  • 测试可追溯性,不管是运行态仍是完成态的结果均可查询

  • 简明扼要的测试报告

2.3 如何运行测试[2]

图片

图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 方案

多主机迁移采用以下方案

图片

图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包,可直接下载安装。

图片

图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警告banner b.测试经过配置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 人工与自动化测试时间对比


3、后续规划

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漫谈

图片

相关文章
相关标签/搜索