简体   繁体   English

从 setup.py 将 Arguments 传递给 pytest

[英]Passing Arguments to pytest from setup.py

I have tests that require arguments, in my case these are credentials to some service:我有需要 arguments 的测试,在我的情况下,这些是某些服务的凭据:

example_test.py: example_test.py:

@pytest.fixture()
def artuser(pytestconfig):
    return pytestconfig.getoption("artuser")
@pytest.fixture()
def artpass(pytestconfig):
    return pytestconfig.getoption("artpass")

def test_nuget_get_nuget(artuser, artpass):
    assert artuser == "someuser"
    assert artpass == "somepassword"

conftest.py: conftest.py:

import pytest

def pytest_addoption(parser):
    parser.addoption("--artuser", action="store")
    parser.addoption("--artpass", action="store")

It works if I run:如果我运行它会起作用:
pytest --artuser someuser --artpass somepassword . pytest --artuser someuser --artpass somepassword
However, it fails if run:但是,如果运行它会失败:
python setup.py test --artuser someuser --artpass somepassword
with an an error error: option --artuser not recognized出现错误error: option --artuser not recognized

I then tried to integrate some code from this question, just to see if the argument gets passed along, so I have something like this in my setup.py:然后我尝试从这个问题中整合一些代码,只是为了看看参数是否被传递,所以我的 setup.py 中有这样的东西:

from setuptools import setup, find_packages
from os import path
import argparse
import sys

argparser = argparse.ArgumentParser(add_help=False)
argparser.add_argument('--artuser', help='required artuser argument', required=True)
args, unknown = argparser.parse_known_args()
sys.argv = [sys.argv[0]] + unknown
print(args)

setup(
   name='myapp',
   ...

But when I run the tests, I get E AssertionError: assert None == 'someuser' meaning the argument wasn't passed along.但是当我运行测试时,我得到E AssertionError: assert None == 'someuser'表示参数没有传递。

I was able to do it with the help of this answer .我能够在这个答案的帮助下做到这一点。

setup.py:设置.py:

from setuptools import setup, find_packages
from setuptools.command.test import test as TestCommand
import sys
...

class PyTest(TestCommand):
    user_options = [('artuser=', 'a', "Artifactory user"),
                    ('artpass=', 'b', "Artifactory password")]

    def initialize_options(self):
        TestCommand.initialize_options(self)
        self.artpass = None
        self.artuser = None

    def finalize_options(self):
        TestCommand.finalize_options(self)
        self.test_args = []
        self.test_suite = True

    def run_tests(self):
        import pytest

        errno = pytest.main(
            ["--artuser", self.artuser, "--artpass", self.artpass])
        sys.exit(errno)

setup(
    cmdclass={
        'test': PyTest,
    },
    ...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM