裝置資訊如何傳遞給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是執行緒數 如果兩個引數都配置了,就是程序並行,每個程序最...