基於pytest實現appium多程序相容性測試

2022-03-11 01:41:41 字數 4306 閱讀 1420

裝置資訊如何傳遞給base_driver方法來生成driver

內建的pytestconfig可以通過命令列引數、選項、配置檔案、外掛程式、執行目錄等方式來控制pytest。pytestconfig是request.config的快捷方式,它在pytest文件裡有時候被稱為"pytest配置物件"

要理解pytestconfig是如何工作的,可以檢視如何新增乙個自定義的命令列選項,然後在測試用例中讀取該選項。你可以直接從pytestconfig裡讀取自定義的命令列選項,但是,為了讓pytest能夠解析它,還需要使用hook函式pytest_addoption

下面使用pytest的hook函式pytest_addoption新增幾個命令列選項

pytestconfig/conftest.py

def pytest_addoption(parser):

parser.addoption("--myopt", action="store_true", help="some boolean option")

parser.addoption("--foo", action="store", default="bar", help="foo: bar or baz")

接下來就可以在測試用例中使用這些選項了

pytest/test_config.py

import pytest

def test_option(pytestconfig):

print("'foo' set to:", pytestconfig.getoption('foo'))

print("'myopt' set to:", pytestconfig.getoption('myopt'))

讓我們看看它是如何工作的

e:\virtual_workshop\pytest-demo\test_demo7\pytestconfig>pytest -s -q test_config.py::test_config

'foo' set to: bar

'myopt' set to: false

.1 passed in 0.02s

e:\virtual_workshop\pytest-demo\test_demo7\pytestconfig>pytest -s -q --myopt test_config.py::test_config

'foo' set to: bar

'myopt' set to: true

.1 passed in 0.01s

e:\virtual_workshop\pytest-demo\test_demo7\pytestconfig>pytest -s -q --myopt --foo baz test_config.py::test_config

'foo' set to: baz

'myopt' set to: true

.1 passed in 0.01s

@pytest.fixture()

def foo(pytestconfig):

return pytestconfig.option.foo

@pytest.fixture()

def myopt(pytestconfig):

return pytestconfig.option.myopt

def test_fixtures_for_options(foo, myopt):

print("'foo' set to: ", foo)

print("'myopt' set to: ", myopt)

既然可以使用pytest命令列引數了,那只需要在pytest.main中加上引數--cmdopt即可,main.py類似這樣:

import pytest, os

from multiprocessing import pool

device_infos = [,

]def run_parallel(device_info):

pytest.main([f"--cmdopt=",

"--alluredir", "reports"])

os.system("allure generate reports -o reports/html --clean")

if __name__ == "__main__":

with pool(2) as pool:

pool.map(run_parallel, device_infos)

pool.close()

pool.join()

這裡基本上定義的是多裝置相同的desired_caps的公共部分

platformname: android

newcommontimeout: 500

noreset: false

這裡有幾點需要注意下:

yaml.load方法注意新的寫法,加上引數 loader=yaml.fullloader,這樣據說更安全

from .conf_dir import caps_dir

import yaml

import os

class basedriver:

def __init__(self, device_info):

self.device_info = device_info

os.system(cmd)

fs = open(f"")

#平台名稱、包名、activity名稱、超時時間、是否重置、server_ip、

desired_caps = yaml.load(fs, loader=yaml.fullloader)

#版本資訊

desired_caps["platform_version"] = self.device_info["platform_version"]

#裝置名稱

desired_caps["devicename"] = f"127.0.0.1:"

#系統埠號

desired_caps["systemport"] = self.device_info["system_port"]

desired_caps["automationname"] = automationname

driver = webdriver.remote(f"", desired_capabilities=desired_caps)

return driver

關鍵點是pytest_addoption和request.config.getoption這兩個函式的使用,乙個新增命令列,乙個解析命令列,但仍有需要注意的:

from common.base_driver import basedriver

import pytest

driver = none

def pytest_addoption(parser):

parser.addoption("--cmdopt", action="store", default="device_info", help=none)

@pytest.fixture

def cmdopt(pytestconfig):

#兩種寫法

return pytestconfig.getoption("--cmdopt")

#return pytestconfig.option.cmdopt

#定義公共的fixture

@pytest.fixture

def common_driver(cmdopt):

global driver

base_driver = basedriver(eval(cmdopt))

driver = base_driver.base_driver()

yield driver

driver.quit()

因為pytestconfig是request.config的快捷方式,所以cmdopt也可以寫作

@pytest.fixture

def cmdopt(request):

return request.config.getoption("--cmdopt")

執行main.py,展示多程序執行的截圖

多程序相容性測試也會帶來一些問題:

pytest實現測試用例引數化

本文總www.cppcns.com結pytest的測試用例引數化。軟體測試中,輸入相應值,檢查期望值,是常見測試方法。在自動化測試中,乙個測試用例對應乙個測試點,通常一組測試資料無法完全覆蓋測試範圍,所以,需要引數化來傳遞多組資料。pytest的測試用例引數化使用如下裝飾器即可完成。pytest.m...

pytest 實現介面自動化的demo

今天同事遇到乙個問題,想要實現乙個介面自動化的框架,實現功能需要整合pytest allure,執行完後,輸出視覺化的報告。但是他一直解決不了問題,所以找到我,讓我幫忙看下 例如 既然想要做成乙個公共的方法,自然界面具體資料就需要通過配置來完成,以配置形式來處理 以下是我做的乙個demo,很簡單的d...

pytest實現多程序與多執行緒執行

1 pytest parallel 安裝 pip install pytest parallel 常用引數配置 workers n 多程序執行需要加此引數,n是程序數。預設為1 tests per worker n 多執行緒需要新增此引數,n是執行緒數 如果兩個引數都配置了,就是程序並行,每個程序最...