Appium 在 Xunit 框架下使用 Appium 跑多个测试用例时,setUp 方法清除掉上一个 Case 的步骤的简单解决思路

大东 · 2015年05月24日 · 最后由 xiaoQ 回复于 2016年09月20日 · 4147 次阅读

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')

解决思路 二:将appdesired_caps去掉

这个方法仅限于UIAutomator模式下,因为Selendroid模式是必须带app这个参数的
那么这个方式就是将 apk 的installuninstall步骤都通过脚本去做
这个方式不如 1 好用。

解决思路 三:欢迎拍砖交流~

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 5 条回复 时间 点赞

这个方法仅限于 UIAutomator 模式下,因为 Selendroid 模式是必须带 app 这个参数的

可以改造下

#1 楼 @lihuazhang 嗯,这个应该可以从源码处改成统一的。
不过大部分使用 Appium 的同学估计不会这么去搞=,=

@anikikun 赞一个~今天用到了。~

点个赞,这个纠结了很久

想请教一下 我执行第二个 case 时报这个错呢 A new session could not be created. (Original error: Requested a new session but one was in progress)

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册