如何使用pytest通过命令行参数在测试中传递值?

时间:2019-01-03 21:36:21

标签: python selenium pytest

我有以下内容作为conftest.py->

def pytest_addoption(parser):
    parser.addoption("--browser")
    parser.addoption("--osType", help="Type of operating system")
    parser.addoption("--hostURL", action="store", help="prod, stage, or dev")

@pytest.fixture(scope="session")
def browser(request):
    return request.config.getoption("--browser")

@pytest.fixture(scope="session")
def osType(request):
    return request.config.getoption("--osType")

@pytest.fixture(autouse=True)
def hostURL(request):
    return request.config.getoption("--hostURL")

我想使用--hostURL标志传递诸如prod,stage或dev之类的值。

这是我的test_TheMainTest.py的外观->

import unitest
import pytest

class CheckStatusCodeTest(unittest.TestCase, LoginPage, CustomSeleniumDriver):

    def test_CheckStatusCodeOfPages(self, hostURL):
        self.login(hostURL)

当我使用pytest -q -s --hostURL prod运行上述测试时,出现以下错误->

   TypeError: test_CheckStatusCodeOfCRPages() missing 1 required positional argument: 'hostURL'

1 个答案:

答案 0 :(得分:2)

引用docs

  

注意

     

unittest.TestCase方法不能直接接收夹具参数,因为它们的实现可能会影响运行常规unittest.TestCase测试套件的能力。

但是,您仍然可以使用自动使用的夹具将常规的夹具值传递给unittest风格的测试:

class CheckStatusCodeTest(unittest.TestCase):

    @pytest.fixture(autouse=True)
    def _pass_fixture_value(self, hostURL):
        self._hostURL = hostURL

    def test_CheckStatusCodeOfPages(self):
        assert self._hostURL

您还可以查看this answer of mine解决同一问题的更多示例。

另一种可能性是实现自动修改测试类的自动使用夹具。如果您有许多应该具有相同设置的测试类,这将很有用:

@pytest.fixture(scope="class")
def set_fixture_value_to_class(request, hostURL):
    request.cls._hostURL = hostURL


@pytest.mark.usefixtures('set_fixture_value_to_class')
class CheckStatusCodeTest(unittest.TestCase):

    def test_CheckStatusCodeOfPages(self):
        assert self._hostURL


@pytest.mark.usefixtures('set_fixture_value_to_class')
class AnotherTest(unittest.TestCase):

    def test_spam(self):
        assert self._hostURL

在这种情况下,无需将相同的灯具复制到每个测试类。只需标记所有相关的测试类别,您就可以开始学习了。