unittest爲python語言自帶的單元測試框架,python把unittest封裝爲一個標準模塊封裝在python開發包中。unittest中經常使用的類有:unittest.TestCase、unittest.TestSuite、unittest.TextTestRunner、test fixturepython
1、單元測試框架android
單元測試框架並不是只能用於單元測試,也能夠用於編寫和規範自動化測試用例。利用其組織測試用例、斷言預期結果以及批量執行測試用例等功能。web
單元測試框架主要功能:(源自蟲師《Selenium2自動化測試實戰 基於python語言》)服務器
一、提供用例組織與執行app
提供必定的規範來編寫測試用例,方便擴展和維護測試用例;框架
二、提供豐富的比較方法函數
測試用例每每須要有一個實際結果和預期結果比較的過程,單元測試框架會提供豐富的斷言(assert)方法,用以判斷用例的執行是否經過;單元測試
三、提供豐富的日記測試
測試用例執行失敗時能拋出失敗緣由,用例執行完成後提供豐富的執行結果,包括執行時間、失敗用例數、成功用例數等ui
2、TestCase
完整的測試流程,包括測試環境的搭建、測試的執行、測試後環境的還原。
# coding:utf-8 from appium import webdriver import unittest,time class TestCalculator(unittest.TestCase): # 測試前初始化配置
def setUp(self): print('test start') # desired capabilities以字典形式存儲,客戶端將鍵值對發給服務器端 desired_caps = {} desired_caps['platformName'] = 'Android' # Android系統 desired_caps['platformVersion'] = '4.4.2' # 指定平臺的系統版本 desired_caps['deviceName'] = 'Android Emulator' # 設備名稱 desired_caps['appPackage'] = 'com.android.calculator2' # 包名 desired_caps['appActivity'] = '.Calculator' # launcherActivity self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) #定義webdriver對象
def tearDown(self): print('test case end') self.driver.quit() #加號運算case def test_add(self): print('add case is running') # 點擊運算操做 self.driver.find_element_by_name("5").click() self.driver.find_element_by_name("+").click() self.driver.find_element_by_name("8").click() self.driver.find_element_by_name("=").click() time.sleep(2) self.driver.find_element_by_name("CLR").click() if __name__ == '__main__': unittest.main()
setUp()方法用於測試用例執行前的初始化工做,tearDown()用於測試用例執行後的善後工做。unittest中全部以test開頭的函數就是測試用例,咱們編寫測試用例時須要以test開頭。
.py文件有兩種使用方式:做爲模塊調用和直接使用,若是它等於「__main__」表示直接使用。
3、有多個測試用例
一、多個用例
在上面基礎上,咱們增長一個測試用例test_sub
# coding:utf-8 from appium import webdriver import unittest,time class TestCalculator(unittest.TestCase):
def setUp(self): pass #此處省略
def tearDown(self): print('test case end') self.driver.quit() #加號運算case def test_add(self): print('add case is running') # 點擊運算操做 self.driver.find_element_by_name("1").click() self.driver.find_element_by_name("+").click() self.driver.find_element_by_name("8").click() self.driver.find_element_by_name("=").click() time.sleep(2) self.driver.find_element_by_name("CLR").click() #減運算case def test_sub(self): print('sub case is running') self.driver.find_element_by_name("9").click() #沒法經過name屬性定位到'-',使用xpath定位 self.driver.find_element_by_xpath("//android.widget.Button[contains(@content-desc,'minus')]").click() self.driver.find_element_by_name("1").click() self.driver.find_element_by_name("=").click() time.sleep(2) self.driver.find_element_by_name("CLR").click()
if __name__ == '__main__': unittest.main()
執行後輸出結果以下:
test start add case is running test case end test start sub case is running test case end
可知:每執行一個case,都會執行一次setUp()和tearDown()。因此能夠單獨封裝一個測試類,用於存放這兩個函數,前提是全部的測試用例所須要的setUp()和tearDown()方法都同樣;
PS:測試用例的執行順序是根據用例名按照ASCII碼來排序的,與代碼中case的前後順序無關。數字和字母的順序爲:0~9,A~Z,a~z。如test_a、test_b、test_c.
二、TestSuite和TextTestRunner
TestSuite是一個測試套件,用來組裝多個測試用例,可經過addTest方法把testCase添加到TestSuite中,再經過TextTestRunner對象的run()方法執行用例。
以下,如今有兩個測試用例test_add和test_sub,把他們依次加入TestSuite中再執行
if __name__ == '__main__': #構造測試集 suite = unittest.TestSuite() suite.addTest(TestCalculator('test_add')) suite.addTest(TestCalculator('test_sub')) #執行測試 runner = unittest.TextTestRunner() runner.run(suite)
使用TestSuite能夠作到有選擇地執行用例,不須要測試的case能夠無需加入。TestSuite按照addTest()的前後順序執行,須要先執行的case先添加到TestSuite中。