Unittest等测试框架的执行流程 setUp() -> testCase1() -> tearDown() -> setUp() -> testCase2() -> tearDown() 场景:使用Unittest或其他框架
1、case1是测试登录功能
2、case2是接着case1登录后做操作的 解决思路 一:从AppiumServer处规避1、启动AppiumServer的时候,命令带上参数--no-reset
这个参数的意思是: session 之间不重置应用状态
这个参数相信很多人都用过。
那么使用了这个参数的话,需要在启动AppiumServer的脚本后面加一个动作: 删除待测应用
2、desired_caps中必须带app这个参数; 那么运行的完整逻辑是这样的:
1、在testSuite层的setUp()中通过脚本启动AppiumServer,并删除待测应用;
2、起第一个Session,检测到app未安装,先安装app,并执行完testcase1,tearDown()处关闭应用;
3、起第二个Session的时候,检测到当前app已安装,不执行清除操作,打开app,在testcase1结束的条件下执行testcase2; 参考代码: - # -*- coding:UTF-8 -*-
- import os,subprocess
- import unittest
- from appium import webdriver
- from time import sleep
- # Returns abs path relative to this file and not cwd
- PATH = lambda p: os.path.abspath(
- os.path.join(os.path.dirname(__file__), p)
- )
- class ContactsAndroidTests(unittest.TestCase):
- def setUp(self):
- desired_caps = {}
- desired_caps['platformName'] = 'Android'
- desired_caps['platformVersion'] = '4.4'
- desired_caps['deviceName'] = 'Nexus 4'
- desired_caps['app'] = PATH(
- 'wangyixinwen_405.apk'
- )
- desired_caps['appPackage'] = 'com.netease.newsreader.activity'
- desired_caps['appActivity'] = 'com.netease.nr.biz.ad.AdActivity'
- self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
- def tearDown(self):
- self.driver.quit()
- def testCase1(self):
- sleep(10)
- print("this is test case1")
- def testCase2(self):
- sleep(10)
- print("this is test case2")
- if __name__ == '__main__':
- deviceId = 'ed92129fxw'
- subprocess.Popen("adb uninstall com.netease.newsreader.activity")
- appiumServer = subprocess.Popen("appium -U%s --no-reset"%deviceId,shell=True)
- sleep(5)
- suite = unittest.TestLoader().loadTestsFromTestCase(ContactsAndroidTests)
- unittest.TextTestRunner(verbosity=2).run(suite)
- os.system('taskkill /f /im node.exe')
复制代码 解决思路 二:将app从desired_caps去掉这个方法仅限于UIAutomator模式下,因为Selendroid模式是必须带app这个参数的
那么这个方式就是将apk的install和uninstall步骤都通过脚本去做
这个方式不如1好用。
|