Appium python+appium 自动化测试 - 通用设置 (一)

Tin · 2021年02月05日 · 最后由 Tin 回复于 2021年02月05日 · 3856 次阅读

这篇文章总结了我平时用的比较多的 3 个设置,后续有用到其它的,会继续更新哦。

一、运行时会重装 APP 问题

问题:在使用 Appium 运行自动化代码的时候,每次运行会自动清除 APP 的原来数据,并将 APP 卸载,再重新安装打开。

解决:在 APP 启动的参数设置中添加"noReset": True,表示启动 APP 时不清除 APP 里的原有的数据。未设置该参数,系统默认为"noReset": False,表示在启动 APP 时会自动清除卸载 APP,重新安装,所以每次打开的 APP 都是新安装的 APP。

代码示例:

from appium import webdriver

def start(self):
        caps = {"platformName": "Android",
                "deviceName": "ABCDEFGHIJKLMNOPQ",
                "platforVersion": "9",
                "appPackage": "com.sina.weibo",
                "appActivity": "com.sina.weibo.SplashActivity",
                "autoGrantPermissions": "true",
                "automationName": "UiAutomator2",
                # 启动app时不要清除app里的原有的数据
                "noReset": True
                }
    self.driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
    self.driver.implicitly_wait(20)

二、执行测试用例会重启 APP

问题:执行多条测试用例时,每执行完一个测试用例,都会重新启动 AP

解决:在测试用例类中导入 pytest,将测试用例类中的初始化函数设置为 setup_class,修改后启动 APP,只会执行一次初始化。

setup_class(self):这是一个 class 级别的 setup 函数,它会在这个测试类 TestAccountLogin 里所有 test 执行之前,被调用一次。

teardown_class(self):这是一个 class 级别的 teardown 函数,他会在这个测试类 TestAccountLogin 里所有 test 执行之后,被调用一次。

代码示例:

import pytest
from common.init import AppStart

class TestAccountLogin:
    def setup_class(self):
        self.accountloginpage = AppStart.start()

    def teardown_class(self):
    AppStart.quit()

三、自定义测试用例执行顺序

问题:默认情况下,pytest 框架的测试用例执行顺序是按照字母的顺序执行的,如何自定义设置测试用例的执行顺序?

解决:有两种解决方法,分别为:

1.使用函数修饰符的方式来标记被测试函数执行的顺序,插件名称为 pytest-ordering

2.将测试用例命名为数字

方法一:使用函数修饰符的方式来标记被测试函数执行的顺序

1.需要先安装插件 pytest-ordering

  • 安装包安装:python setup.py install
  • 命令行安装:pip3 install pytest-ordering

插件安装成功如下图所示

2.使用方法

  • 标记于被测试函数,@pytest.mark.run(order=x)
  • 根据 order 传入的参数来解决运行问题
  • order 值全为正数或全为负数时,值越小,优先级越高
  • 正数和负数同时存在时,正数优先级高

如下所示:

import pytest
from common.init import AppStart

class TestAccountLogin:

    def setup_class(self):
        self.accountloginpage = AppStart.start()

    @pytest.mark.run(order=-1)
    def test_account(self):
    print("01")

    @pytest.mark.run(order=2)
    def test_pwd(self):
    print("02")

    @pytest.mark.run(order=3)
    def test_phone(self):
    print("03")

    def teardown_class(self):
    AppStart.quit()

以上会按照 test_pwd→test_phone→test_account 的顺序执行

方法二:将测试用例的函数名命名为数字,即会按照数字由小到大的顺序执行

如下所示:

import pytest
from common.init import AppStart

class TestAccountLogin:

    def setup_class(self):
        self.accountloginpage = AppStart.start()

    @pytest.mark.run(order=-1)
    def test_01(self):
    print("01")

    @pytest.mark.run(order=2)
    def test_02(self):
    print("02")

    @pytest.mark.run(order=3)
    def test_03(self):
        print("03")

    def teardown_class(self):
    AppStart.quit()

会按照 01→02→03 的顺序执行

以上内容有错误的地方,大家多多指正,谢谢!

共收到 1 条回复 时间 点赞
Tin 关闭了讨论 02月05日 16:00
Tin 重新开启了讨论 02月05日 16:00
Tin #3 · 2021年02月05日 Author

不小心点错了

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