Appium+python的單元測試框架unittest(1)(轉)
unittest為python語言自帶的單元測試框架,python把unittest封裝為一個標準模塊封裝在python開發包中。unittest中常用的類有:unittest.TestCase、unittest.TestSuite、unittest.TextTestRunner、test fixture
一、單元測試框架
單元測試框架並非只能用於單元測試,也可以用於編寫和規範自動化測試用例。利用其組織測試用例、斷言預期結果以及批量執行測試用例等功能。
單元測試框架主要功能:(源自蟲師《Selenium2自動化測試實戰 基於python語言》)
1、提供用例組織與執行
提供一定的規範來編寫測試用例,方便擴展和維護測試用例;
2、提供豐富的比較方法
測試用例往往需要有一個實際結果和預期結果比較的過程,單元測試框架會提供豐富的斷言(assert)方法,用以判斷用例的執行是否通過;
3、提供豐富的日記
測試用例執行失敗時能拋出失敗原因,用例執行完成後提供豐富的執行結果,包括執行時間、失敗用例數、成功用例數等
二、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__”表示直接使用。
三、有多個測試用例
1、多個用例
在上面基礎上,我們增加一個測試用例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.
2、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中。
Appium+python的單元測試框架unittest(1)(轉)