最近工作中想要做自動化回歸測試,想法是將每個測試用例都做自動截圖,然后將最近的穩定版本和當前測試的版本的兩張截圖去對比,也要將兩個版本的截圖都放到測試報告中方便人工來進行驗證。最初想法是通過HTMLTestRunner生成帶截圖的測試報告,但是HTMLTestRunner本身沒有截圖功能,還有它不支持python 3,所以另外找了其他的工具來做這件事。
生成測試報告工具簡介
HtmlTestRunner是將單元測試的結果保存為html格式的測試報告的工具,這個工具的功能和HTMLTestRunner很想,而且名稱也很像。但是它支持python3,而且生成的報告的樣式更加美觀。
安裝HtmlTestRunner
訪問這個url:
https://pypi.python.org/pypi/html-testRunner/1.0.3
然后下載html_testRunner-1.0.3-py2.py3-none-any.whl文件,接下來通過下面命令(適用於ubuntu等linux系統)來安裝:
$ sudo pip3 install html_testRunner-1.0.3-py2.py3-none-any.whl
如果你是windows系統,嘗試使用下面命令安裝:
$ pip install html_testRunner-1.0.3-py2.py3-none-any.whl
添加截圖功能
HtmlTestRunner這個工具,本身沒有展示截圖的功能,不過可以通過修改它的template文件來添加截圖功能。
通過下面地址,下載HtmlTestRunner的源代碼到本地:
https://github.com/oldani/HtmlTestRunner
用編輯器打開HtmlTestRunner/template/report_template.html文件,進行修改:
需要刪除上圖中標紅色的代碼,並新增綠色的代碼。注意將新增圖片的目錄設置為自己本地的截圖保存的目錄。
生成自動化測試報告
使用python的appium API和unittest單元測試框架,再加上上面提到的HtmlTestRunner第三方模塊,可以生成帶測試截圖的測試報告。具體代碼如下:
#!/usr/bin/env python3 # coding=utf-8 from appium import webdriver from nose.tools import * import unittest import HtmlTestRunner #生成HTML格式的測試報告 class take_screen_shot(): #這個類將在下面作為裝飾器使用 def __init__(self, func): self.func = func self.name = func.__name__ + ' (__main__.CalTestCase).png' #拼接截圖文件名 def __call__(self, *args): #對每次調用的函數都做截圖操作 try: self.func(self, *args) finally: driver.get_screenshot_as_file(self.name) class CalTestCase(unittest.TestCase): @classmethod def setUpClass(self): desired_caps = {} desired_caps['platformName'] = 'Android' #設置操作平台 desired_caps['platformVersion'] = '5.1.1' #操作系統版本 desired_caps['deviceName'] = 'Nexus 4' #設備名稱 desired_caps['appPackage'] = 'com.android.calculator2' desired_caps['appActivity'] = '.Calculator' desired_caps['udid'] = '04c5a5af52197902' global driver driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) @classmethod def tearDownClass(self): driver.quit() #退出當前應用 @take_screen_shot #對每一條測試用例使用裝飾器 def test_case_01(self): text = driver.find_element_by_id('com.android.calculator2:id/formula').text assert_equal(text, "") @take_screen_shot def test_case_02(self): driver.find_element_by_id('com.android.calculator2:id/digit_1').click() #點擊數字鍵1 driver.find_element_by_id('com.android.calculator2:id/op_add').click() #點擊加號 driver.find_element_by_id('com.android.calculator2:id/digit_1').click() #點擊數字鍵1 driver.find_element_by_id('com.android.calculator2:id/eq').click() #點擊等號 text = driver.find_element_by_id('com.android.calculator2:id/formula').text assert_equal(text, "2") if __name__ == '__main__': #下面語句用來生成測試報告 unittest.main(testRunner=HtmlTestRunner