最近工做中想要作自動化迴歸測試,想法是將每一個測試用例都作自動截圖,而後將最近的穩定版本和當前測試的版本的兩張截圖去對比,也要將兩個版本的截圖都放到測試報告中方便人工來進行驗證。最初想法是經過HTMLTestRunner生成帶截圖的測試報告,可是HTMLTestRunner自己沒有截圖功能,還有它不支持python 3,因此另外找了其餘的工具來作這件事。html
HtmlTestRunner是將單元測試的結果保存爲html格式的測試報告的工具,這個工具的功能和HTMLTestRunner很想,並且名稱也很像。可是它支持python3,並且生成的報告的樣式更加美觀。python
訪問這個url: https://pypi.python.org/pypi/html-testRunner/1.0.3 而後下載html_testRunner-1.0.3-py2.py3-none-any.whl文件,接下來經過下面命令(適用於ubuntu等linux系統)來安裝:linux
$ sudo pip3 install html_testRunner-1.0.3-py2.py3-none-any.whl
若是你是windows系統,嘗試使用下面命令安裝:android
$ pip install html_testRunner-1.0.3-py2.py3-none-any.whl
HtmlTestRunner這個工具,自己沒有展現截圖的功能,不過能夠經過修改它的template文件來添加截圖功能。 經過下面地址,下載HtmlTestRunner的源代碼到本地:git
https://github.com/oldani/HtmlTestRunnergithub
用編輯器打開HtmlTestRunner/template/report_template.html文件,進行修改: web
須要刪除上圖中標紅色的代碼,並新增綠色的代碼。注意將新增圖片的目錄設置爲本身本地的截圖保存的目錄。ubuntu
使用python的appium API和unittest單元測試框架,再加上上面提到的HtmlTestRunner第三方模塊,能夠生成帶測試截圖的測試報告。具體代碼以下:windows
#!/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.HTMLTestRunner(output='cal_report', report_title='Android計算器測試報告'))
代碼分析:由於計劃每一個測試用例都進行截圖操做,因此使用了python的裝飾器。這樣就實現了每一個測試用例執行以後無論是成功仍是失敗都進行截圖操做,代碼的最後使用HtmlTestRunner工具生成測試報告。瀏覽器
接下來使用下面命令執行測試:
$ python3 appium_deom.py Running tests... ---------------------------------------------------------------------- test_case_01 (__main__.CalTestCase) ... OK (1.786675)s test_case_02 (__main__.CalTestCase) ... OK (5.081634)s ---------------------------------------------------------------------- Ran 2 tests in 0:00: OK Generating HTML reports...
生成的測試報告的位置在測試腳本所在的目錄下的reports目錄下,經過瀏覽器查看,結果以下:
點擊view按鈕能夠展開查看截圖和錯誤信息:
如今的測試報告的html模板中的截圖仍是寫死的路徑,若是能將截圖的路徑也能自動生成的話就更好了。 還有如今沒有進行兩個版本截圖的對比,考慮繼續尋找工具作截圖的對比,並突出或標記上兩張圖片不相同的地方。