py.测试conftest根据修改夹具参数系统参数

2024-05-15 08:43:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个用于硒测试的pytest环境。我在中使用参数化设备conftest.py这使我可以测试所有不同的浏览器,而不必重写测试。我想把一个命令行参数传递给我的脚本,这样我就可以让它只运行一个特定的浏览器,而不是所有的浏览器。为此,我需要修改传递到fixture中的变量。到目前为止,我还不知道该怎么做。下面的示例不起作用,可能是因为pytest解析conftest.py与我的启动脚本描述的变量分开。在

#conftest.py
browsers = { "ff" : webdriver.Firefox, "ie" : webdriver.Ie }
@pytest.yield_fixture(params=browsers.keys())
def browser(request):
    driver = browsers[request.param]()
    yield driver
    driver.quit()

#test_simple.py
def test_simple(browser):
    browser.get("http://stackoverflow.com")

#main.py
browsers = {}
if __name__ == "__main__":
    if len(sys.argv) > 1:
        for arg in sys.argv[1:]:
            if arg == "-ff":
                browsers = { "ff" : webdriver.Firefox }
            elif arg == "-ie":
                browsers = { "ie" : webdriver.Ie }
            elif arg == "-all":
                browsers = { "ff" : webdriver.Firefox, "ie" : webdriver.Ie }

    pytest.main()

如何将值传递给conftest.py?



Tags: pybrowserifpytestmaindriverarg浏览器
3条回答
 pytest -k test_simple['ie'] 

以上线路将有选择地运行匹配测试

请参见:Pass different values to a test function, depending on command line options。在

实际上,无法使用命令行选项更改参数化,因为参数化定义发生在导入过程中,但如果用户在命令行中指定了其他浏览器,则可以轻松跳过其他浏览器的测试:

# conftest.py
import pytest

browsers = {"ff": 'FIREFOX', 'ie': 'INTERNETEXPLORER'}

def pytest_addoption(parser):
    parser.addoption(" browser", default='',
        type='choice', choices=sorted(browsers),
        help="runs tests only for given browser")    

@pytest.yield_fixture(params=browsers.keys())
def browser(request):
    selected = request.config.getoption('browser')
    if selected and selected != request.param:
        pytest.skip('browser {} selected in the command line'.format(selected))
    driver = browsers[request.param]
    yield driver

这样,当用户运行pytest而不向 browser传递任何值时,所有测试都会照常运行:

^{pr2}$

但是,如果用户通过了 browser=ie,那么firefox测试就会被跳过:

============================= test session starts =============================
platform win32   Python 2.7.6   py-1.4.26   pytest-2.7.0.dev1   X:\temp\sandbox\.env27\Scripts\python.exe
plugins: xdist
collecting ... collected 2 items

test_simple.py::test_simple[ie] PASSED
test_simple.py::test_simple[ff] SKIPPED

===================== 1 passed, 1 skipped in 0.01 seconds =====================

只需使用环境变量:

#conftest.py
browsers = { "ff" : webdriver.Firefox, "ie" : webdriver.Ie }
@pytest.yield_fixture(params=browsers.keys())
def browser(request):
    driver = browsers[request.param]()
    yield driver
    driver.quit()

#test_simple.py
def test_simple(browser):
    browser.get("http://stackoverflow.com")

#main.py
browsers = {}
browserToRun = os.environ.get('BROWSER_TO_RUN')
if __name__ == "__main__":
            if browserToRun == "ff":
                browsers = { "ff" : webdriver.Firefox }
            elif browserToRun == "ie":
                browsers = { "ie" : webdriver.Ie }
            elif browserToRun == "all":
                browsers = { "ff" : webdriver.Firefox, "ie" : webdriver.Ie }

    pytest.main()

并运行测试,如:

BROWSER_TO_RUN=ff run_tests.py

相关问题 更多 >