下面是关于“pytest多线程与多设备并发appium”的完整攻略。
1. 准备工作
在开始之前,我们需要准备以下工作:
- 安装appium:
npm install -g appium
- 安装pytest、pytest-xdist、pytest-html等依赖包:
python
pip install pytest pytest-xdist pytest-html - 连接多个设备,确保设备均已正确连接,并已安装相应的测试应用程序
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技术站