【乾貨分享】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漫談

圖片

相關文章
相關標籤/搜索