unittest提供的Fixtures用以在测试执行前和执行后进行必要的准备和清理工作,可以定义在模块、类、用例执行前后的工作
1、模块
在模块中定义setUpModule()和tearDownModule()处理模块执行前后的工作
def setUpModule(): print('module start') def tearDownModule(): print('module end')
2、测试类
在测试类中定义setUpClass()和tearDownClass()函数处理测试类执行前的工作,setUpClass和tearDownClass的写法稍微不同:
a、需通过@classmethod进行装饰
b、方法的参数是cls,cls与self并无不同之处,只是大家都习惯了这样的命名
@classmethod def setUpClass(cls): print('Class start') @classmethod def tearDownClass(cls): print('class end')
3、测试用例
即我们前面熟悉的setUp()和tearDown()方法,每个用例执行前后都会调用
def setUp(self): print('test case start') def tearDown(self): print('test case end')
在前面我们把Desired Capabilities 启动 session 时相关的配置放在setUp()中,把driver的退出放在tearDown()中。导致每执行一个测试用例,就需要配置连接一次移动端设备。
我们可以把相关的配置工作和清理工作放到测试类中,这样就不必每次执行一个case都重新配置和退出。比如,在计算器中,配置连接到移动端应用,连续执行加运算和减运算case,再退出。
# coding:utf-8 from appium import webdriver import unittest, time
#模块的fixtures处理 def setUpModule(): print('module start') def tearDownModule(): print('module end') class TestFixture(unittest.TestCase):
#测试类中配置参数 @classmethod def setUpClass(cls): print('Class start') # Desired Capabilities启动session时配置的参数 desired_caps = {} desired_caps['platformName'] = 'Android' #移动平台 desired_caps['platformVersion'] = '4.4.2' # 指定平台的系统版本 desired_caps['deviceName'] = 'Android Emulator' # 设备名称 desired_caps['appPackage'] = 'com.android.calculator2' # 包名 desired_caps['appActivity'] = '.Calculator' # launcherActivity
cls.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) # 定义webdriver对象 @classmethod def tearDownClass(cls): print('class end') cls.driver.quit() #所有用例执行完之后退出 def setUp(self): print('test case start') #用例执行前 def tearDown(self): print('test case end') #用例执行后 #加号运算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_android_uiautomator("new UiSelector().text(\"=\")").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() 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__': #构造测试集 suite = unittest.TestSuite() suite.addTest(TestFixture('test_sub')) suite.addTest(TestFixture('test_add')) #执行测试 runner = unittest.TextTestRunner() runner.run(suite)
测试输出结果如下:
module start Class start test case start sub case is running test case end test case start add case is running test case end class end module end
可以看到,在测试机上,执行完减运算后马上执行加运算,测试用例连续执行。执行完所有的测试用例后才退出
转载请注明出处并带上原链接