1. 程式人生 > >Appium+python的單元測試框架unittest(1)(轉)

Appium+python的單元測試框架unittest(1)(轉)

con app 封裝 bili sts 我們 把他 系統版本 ear

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)(轉)