pytest多线程与多设备并发appium

下面是关于“pytest多线程与多设备并发appium”的完整攻略。

1. 准备工作

在开始之前,我们需要准备以下工作:

  1. 安装appium:npm install -g appium
  2. 安装pytest、pytest-xdist、pytest-html等依赖包:
    python
    pip install pytest pytest-xdist pytest-html
  3. 连接多个设备,确保设备均已正确连接,并已安装相应的测试应用程序

2. 编写测试用例

在编写测试用例时,我们需要使用appium提供的Python客户端进行操作,同时需要使用pytest进行管理。

下面是一个简单的示例,使用appium Python客户端测试某个应用程序的登录功能:

from appium import webdriver
from time import sleep

class TestLogin:
    def setup(self):
        caps = {
            'platformName': 'Android',
            'deviceName': 'Android Emulator',
            'appPackage': 'com.example.app',
            'appActivity': '.MainActivity'
        }
        self.driver = webdriver.Remote('http://localhost:4723/wd/hub', caps)

    def teardown(self):
        self.driver.quit()

    def test_login_success(self):
        self.driver.find_element_by_id('username').send_keys('test_user')
        self.driver.find_element_by_id('password').send_keys('test_password')
        self.driver.find_element_by_id('login_btn').click()
        sleep(3)
        assert self.driver.current_activity == '.HomeActivity'

    def test_login_failed(self):
        self.driver.find_element_by_id('username').send_keys('test_user')
        self.driver.find_element_by_id('password').send_keys('wrong_password')
        self.driver.find_element_by_id('login_btn').click()
        sleep(3)
        assert 'wrong password' in self.driver.page_source

3. 使用pytest并发执行测试用例

在默认情况下,pytest是顺序执行测试用例的。为了实现多线程与多设备并发执行测试,我们需要使用pytest-xdist插件。

在终端窗口中执行以下命令,即可使用pytest-xdist插件,并指定并发线程数量:

pytest -n 2

上面的命令表示使用2个线程并发执行测试用例。如果你有两个设备可用,则每个设备将同时运行一部分测试用例。

4. 示例一:使用多线程并发测试单设备

我们假设现在只有一台设备可用。为了实现多线程并发测试,我们需要使用Python的线程模块threading,同时在运行测试脚本时指定一个单线程的 xdist 参数:

pytest -n 1 test_login.py

下面是执行测试用例的代码:

from appium import webdriver
from threading import Thread
import time

class TestLogin:
    def setup_class(cls):
        cls.driver1 = webdriver.Remote('http://localhost:4723/wd/hub', cls.get_caps(1))
        cls.driver2 = webdriver.Remote('http://localhost:4723/wd/hub', cls.get_caps(1))

    def teardown_class(cls):
        cls.driver1.quit()
        cls.driver2.quit()

    def test_login(self):
        t1 = Thread(target=self.login, args=(self.driver1,))
        t2 = Thread(target=self.login, args=(self.driver2,))
        t1.start()
        t2.start()
        t1.join()
        t2.join()

    def login(self, driver):
        driver.find_element_by_id('username').send_keys('test_user')
        driver.find_element_by_id('password'.send_keys('test_password'))
        driver.find_element_by_id('login_btn').click()

        time.sleep(3)

        assert driver.current_activity == '.HomeActivity'

    @staticmethod
    def get_caps(version):
        caps = {
            'platformName': 'Android',
            'deviceName': 'Android Emulator',
            'appPackage': 'com.example.app',
            'appActivity': '.MainActivity',
            'udid': 'emulator-{}'.format(version),
            'systemPort': 8200 + version,
        }
        return caps

在该示例中,我们创建了两个线程,每个线程分别使用不同的driver对象,并模拟使用相同的用户名密码进行登录。

5. 示例二:多线程并发测试多设备

如果有多个设备可用,我们可以使用pytest-xdist插件来管理多个设备,使得每个设备运行一部分测试用例。下面是代码示例:

from appium import webdriver
from time import sleep
import pytest

@pytest.fixture(params=[1, 2])
def setup_device(request):
    caps = {
        'platformName': 'Android',
        'deviceName': 'Android Emulator',
        'appPackage': 'com.example.app',
        'appActivity': '.MainActivity',
        'udid': 'emulator-{}'.format(request.param),
        'systemPort': 8200 + request.param,
    }
    driver = webdriver.Remote('http://localhost:4723/wd/hub', caps)
    yield driver
    driver.quit()

class TestLogin:
    def test_login_success(self, setup_device):
        setup_device.find_element_by_id('username').send_keys('test_user')
        setup_device.find_element_by_id('password').send_keys('test_password')
        setup_device.find_element_by_id('login_btn').click()
        sleep(3)
        assert setup_device.current_activity == '.HomeActivity'

    def test_login_failed(self, setup_device):
        setup_device.find_element_by_id('username').send_keys('test_user')
        setup_device.find_element_by_id('password').send_keys('wrong_password')
        setup_device.find_element_by_id('login_btn').click()
        sleep(3)
        assert 'wrong password' in setup_device.page_source

在该示例中,我们使用pytest的fixture机制,动态获取设备参数,并传递给测试用例函数。同时,我们使用了@pytest.mark.parametrize装饰器,将fixture传递给多个测试用例函数,以便在多台设备上并行运行。

通过执行以下命令,即可并发执行多个设备的测试用例:

pytest -n 2 test_login.py

总之,通过上述步骤,可以很方便地实现pytest多线程与多设备并发appium测试,提高测试效率并减少测试时间。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pytest多线程与多设备并发appium - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • python中如何使用正则表达式的集合字符示例

    下面是Python中如何使用正则表达式的集合字符的攻略。 什么是集合字符 首先,我们需要了解集合字符是什么。集合字符是一类元字符,用来匹配一组字符中的任意一个字符。 在正则表达式中,集合字符由方括号 [] 包括起来,方括号中写上需要匹配的字符。 基本用法 最简单的集合字符是单个字符,例如 [abc] 表示匹配字符 a、b 或 c 中的任意一个。 示例代码: …

    python 2023年5月13日
    00
  • python+pygame实现代码雨(黑客帝国既视感)

    Python 是一种面向对象、解释型计算机编程语言,它拥有简洁易读的语法、强大的可扩展性、支持多种平台等优势。Pygame 是一个 Python 模块,专门用于制作 2D 游戏。通过 Python 和 Pygame 的组合,我们可以实现代码雨的效果。 实现代码雨的步骤如下: 安装 Pygame 模块 pip install pygame 导入必要的函数库以及…

    python 2023年5月31日
    00
  • 利用Python实现自动扫雷小脚本

    利用Python实现自动扫雷小脚本的攻略如下: 一、思路 使用Python获取窗口句柄,并将窗口切换到扫雷程序窗口,以便后续的操作; 获取扫雷程序的界面信息,包括雷区大小、雷数以及每个格子的位置、大小等信息; 利用图像处理技术识别雷区中每个格子的状态(是雷、数字还是空白),并执行相应的操作; 不断循环以上步骤,直到游戏结束。 二、操作步骤 安装必要的Pyth…

    python 2023年5月19日
    00
  • 图文详解Python中模块或py文件导入(超详细!)

    图文详解 Python 中模块或 .py 文件导入 在 Python 中,模块(module)是指一个文件,将一些方法、变量或者类集合在一起,方便其他 Python 程序导入并使用。 本篇文章将简单介绍 Python 中模块或 .py 文件的导入方法,并提供两个示例供参考。 1. 导入方法 Python 中一般有三种方式来导入模块或 .py 文件,它们分别是…

    python 2023年5月14日
    00
  • Python HTTP库 requests 的简单使用详情

    以下是关于Python HTTP库requests的简单使用详情的攻略: Python HTTP库requests的简单使用详情 requests是一个流行的HTTP库,用于向Web服务器发送HTTP请求和接响应。以下是Python HTTP库requests的简单使用详情的攻略: 发送GET请求 以下是使用requests库发送GET请求的示例: impo…

    python 2023年5月14日
    00
  • Python编码类型转换方法详解

    Python编码类型转换方法详解 Python是一种非常灵活的编程语言,拥有很多种不同的数据类型。在Python中,数据类型之间的转换是非常常见的操作。其中,编码类型转换是我们常常需要做的一种类型转换。在本篇文章中,我们将详细讲解Python编码类型转换的方法。 Unicode编码和字符串之间的转换 在Python中,字符串是使用Unicode编码表示的。U…

    python 2023年5月20日
    00
  • Python如何用str.format()批量生成网址(豆瓣读书为例)

    要批量生成网址,我们可以使用Python中的 str.format() 方法。该方法可以让我们轻松生成一个字符串,其中可以插入一些占位符,以便我们在后面再填充数据。 下面我们以豆瓣读书为例,详细介绍如何使用 str.format() 方法来批量生成豆瓣读书的书籍网址。 第一步:定义网址模板 在生成网址之前,我们需要定义一个网址模板,用于指定网址的格式。以豆瓣…

    python 2023年5月18日
    00
  • 使用Python实现画一个中国地图

    下面是我撰写的使用Python实现画一个中国地图的完整攻略。 1. 准备工作 在实现之前,需要先准备好以下工具和数据: Python编程语言 Jupyter Notebook或其他Python开发环境 matplotlib、numpy和pandas等常用Python库 中国地图的shapefile文件 其中,shapefile文件是重要的底图数据,可以通过国…

    python 2023年6月6日
    00
合作推广
合作推广
分享本页
返回顶部