当前位置: 首页 > 知识库问答 >
问题:

py.test基于sys.argv修改夹具参数

商泽宇
2023-03-14

我有一个用于硒测试的pytest工作环境。我在conftest中使用了一个参数化的fixture。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?

共有3个答案

何涵畅
2023-03-14
 pytest -k test_simple['ie'] 

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

金秦斩
2023-03-14

只需使用ENV变量:

#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\u TO\u RUN=ff RUN\u测试。py

张森
2023-03-14

请参见:根据命令行选项,将不同的值传递给测试函数。

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

# 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而不向浏览器传递任何值时,所有测试都会照常运行:

============================= 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] PASSED

========================== 2 passed in 0.01 seconds ===========================

但是,如果用户通过了(例如)浏览器=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 =====================
 类似资料:
  • py.test在哪里以及如何寻找固定装置?我在同一个文件夹的两个文件中有相同的代码。当我删除conftest.py时,无法找到正在运行test_conf.py(也在同一文件夹中。为什么sonoftest.py没有被搜查? 医生说 http://pytest.org/latest/fixture.html#fixture-作用 pytest查找test_ehlo因为test_前缀。测试函数需要一个名

  • 我有一个这样的df: 对于每个ID,我有5列A1到A5(实际上我有更多),并且这些值是特定ID的最高优先级。 例如:ID 1将A1、A3和A5作为优先级,ID 3只有2个A2和A1,ID 5没有优先级 合成DF 我尝试使用和使用这个和这个以及更多的方法来实现相同的功能,但无法获得相同的结果df。 这方面的任何帮助或我这边的清晰度!!

  • 问题内容: public class StackOverFlow { public static void main(String[] args) { ArrayList al = new ArrayList (); al.add(“A”); al.add(“B”); markAsNull(al); System.out.println(“ArrayList elements are “+al);

  • 本文向大家介绍MySQL修改tmpdir参数,包括了MySQL修改tmpdir参数的使用技巧和注意事项,需要的朋友参考一下 今天突然收到报警短信,说是/磁盘空间使用超过阀值。经查看,发现是有很多异常的SQL,执行不了,导致一直在处理,产生了临时占用了/tmp磁盘空间。 由于操作系统的/tmp空间有限,需要进行参数修改,将tmpdir的值路径进行修改。 只能通过配置文件进行修改了。 重启mysql

  • 我有一个Java项目,它使用几个本机DLL,但只使用系统。load()加载其中一个,它依赖于其他的。我不允许修改那个代码。系统load()在java中显示。图书馆path,我可以通过命令行参数设置它,但根据Java JNI和Windows上的依赖库中的顶级答案,依赖DLL的加载是由Windows完成的,它只关心path,而不关心Java。图书馆路径所以我需要添加包含DLL到PATH的目录,通过命令