全局变量global:
声明全局变量global之后,在以后函数的使用中都不用在前面增加self.
def setUp(self): #准备测试环境,每个用例前执行 desired_caps = {} desired_caps['platformName'] = 'Android' desired_caps['paltformVersion'] = adbbase.platformVersion() desired_caps['deviceName'] = adbbase.platformName() desired_caps['appPackage'] = adbbase.appPackage() desired_caps['appActivity'] = adbbase.appActivity() global driver driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps) time.sleep(5) def test_login(self): #用例,以test开头;登录测试 """登录""" driver.find_element_by_id("phoneNumber").send_keys("13575220850") driver.find_element_by_id("passWord").send_keys("q0125016") driver.back() driver.find_element_by_id("login").click() time.sleep(1) try: #自动点击app授权弹框 button = driver.find_element_by_xpath("//android.widget.Button[contains(@text,'允许')]") button.click() except: print("自动点击应用app授权出错!") time.sleep(1) title = driver.find_element_by_id("com.happy.food:id/title").text self.assertEqual(title,"开心粮票")
用例执行顺序:
添加多条用例:test_login、test_billing_details,系统并不会按编写的顺序来执行用例,而是按照名字来执行,先实行b开头的test_billing_details,再执行l开头的login。
如要想要按顺序来执行用例可以修改用例的名字,例如test_a_login、test_b_billing_details
或者用unittest的suite方法
class HappyFoodTest(unittest.TestCase): #自动化框架,继承unittest.TestCase """开心粮票""" def setUp(self): #准备测试环境,每个用例前执行 desired_caps = {} desired_caps['platformName'] = 'Android' desired_caps['paltformVersion'] = adbbase.platformVersion() desired_caps['deviceName'] = adbbase.platformName() desired_caps['appPackage'] = adbbase.appPackage() desired_caps['appActivity'] = adbbase.appActivity() global driver driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps) time.sleep(5) def test_login(self): #用例,以test开头;登录测试 """登录""" # driver = self.driver driver.find_element_by_id("phoneNumber").send_keys("13575220850") driver.find_element_by_id("passWord").send_keys("q0125016") driver.back() driver.find_element_by_id("login").click() time.sleep(1) try: #自动点击app授权弹框 button = driver.find_element_by_xpath("//android.widget.Button[contains(@text,'允许')]") button.click() except: print("自动点击应用app授权出错!") time.sleep(1) title = driver.find_element_by_id("com.happy.food:id/title").text self.assertEqual(title,"开心粮票") def test_billing_details(self): """结算详情""" driver.find_element_by_id("com.happy.food:id/mine").click() driver.find_element_by_id("com.happy.food:id/balanceDetail").click() title = driver.find_element_by_id("com.happy.food:id/title").text self.assertEqual(title,"结算详情") # assert_equal(title,"结算详情") def tearDown(self): #清理环境,用例执行完后执行 driver.quit() def Suite(): suiteTest = unittest.TestSuite() suiteTest.addTest(HappyFoodTest("test_login")) suiteTest.addTest(HappyFoodTest("test_billing_details")) return suiteTest if __name__ == '__main__': Suite()
当执行用例后发现问题,每条用例在执行前都会先运行setUp,再执行完后又运行tearDown。这样的话每次都会执行driver.quit(),也就是每次都没退出驱动重新打开,这样一来每次都需要重新登录,且很浪费时间。
这里可以用到@classmethod装饰器使每个case里的setUp和tearDown只执行一次
from appium import webdriver import time import adbbase import unittest class HappyFoodTest(unittest.TestCase): #自动化框架,继承unittest.TestCase """开心粮票""" @classmethod def setUpClass(cls): #准备测试环境,每个用例前执行 desired_caps = {} desired_caps['platformName'] = 'Android' desired_caps['paltformVersion'] = adbbase.platformVersion() desired_caps['deviceName'] = adbbase.platformName() desired_caps['appPackage'] = adbbase.appPackage() desired_caps['appActivity'] = adbbase.appActivity() global driver driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps) time.sleep(5) def test_login(self): #用例,以test开头;登录测试 """登录""" driver.find_element_by_id("phoneNumber").send_keys("13575220850") driver.find_element_by_id("passWord").send_keys("q0125016") driver.back() driver.find_element_by_id("login").click() time.sleep(1) try: #自动点击app授权弹框 button = driver.find_element_by_xpath("//android.widget.Button[contains(@text,'允许')]") button.click() except: print("自动点击应用app授权出错!") time.sleep(1) title = driver.find_element_by_id("com.happy.food:id/title").text self.assertEqual(title,"开心粮票") def test_billing_details(self): """结算详情""" driver.find_element_by_id("com.happy.food:id/mine").click() driver.find_element_by_id("com.happy.food:id/balanceDetail").click() driver.get_screenshot_as_file("./scr/"+sys._getframe().f_code.co_name+'.png') title = driver.find_element_by_id("com.happy.food:id/title").text self.assertEqual(title,"结算详情") @classmethod def tearDownClass(cls): #清理环境,用例执行完后执行 driver.quit() def Suite(): suiteTest = unittest.TestSuite() suiteTest.addTest(HappyFoodTest("test_login")) suiteTest.addTest(HappyFoodTest("test_billing_details")) return suiteTest if __name__ == '__main__': Suite()
在使用@classmethod是需要把def setUp(self): 、def tearDown(self): 换成 def setUpClass(cls): 、def tearDownClass(cls):