6

I have made my custom management command called pytest_wrp

So when I call

python manage.py test

This bit of code is called:

class Command(test.Command):

    def handle(self, *args, **options):
        super(Command, self).handle(*args, **options) # this calls the python manage.py test
        self.stdout.write("My code starts from here.")
        management.call_command(pytest_wrp.Command(), '--pact-files="{argument}"'.format(argument=path_to_file), '--pact-provider-name="MyService"', verbosity=0)

The pytest_wrp basically has this code in it:

class Command(BaseCommand):
    help = "Runs tests with Pytest"

    def add_arguments(self, parser):
        parser.add_argument("args", nargs=argparse.REMAINDER)

    def handle(self, *args, **options):
        pytest.main(list(args)) # This doesn't accept the pact args, even if you specify a "--" separator

But this calls pytest not pytest-django Hence the extra arguments that I am passing don't get recognized and pytest can't start the test suite.

I wanna pass the extra arguments for some of the test cases. If there is some way to call pytest-django directly and pass the extra arguments in code that would be optimal.

1 Answer 1

3

I found my solution here: Can I still use `manage.py test` after switching to django-pytest? and for full and comprehensive documentation you need to see this. To put it simply, you need to override the config/test.py or config.py depending how your app was setup

TEST_RUNNER = "your_project.your_app.runner"

And your runner.py would look something like this

class PytestTestRunner(object):
    """Runs pytest to discover and run tests."""

    def __init__(self, verbosity=1, failfast=False, keepdb=False, **kwargs):
        self.verbosity = verbosity
        self.failfast = failfast
        self.keepdb = keepdb

    def run_tests(self, test_labels):
        """Run pytest and return the exitcode.

        It translates some of Django's test command option to pytest's.
        """
        import pytest

        argv = []
        if self.verbosity == 0:
            argv.append('--quiet')
        if self.verbosity == 2:
            argv.append('--verbose')
        if self.verbosity == 3:
            argv.append('-vv')
        if self.failfast:
            argv.append('--exitfirst')
        if self.keepdb:
            argv.append('--reuse-db')

        # NOTE: You don't need to quote the argument value here, they do some weird string pattern matching internally
        argv.append('--pact-files={argument}'.format(argument=path_to_file)) 
        argv.append('--pact-provider-name=MyService')
        argv.extend(test_labels)
        return pytest.main(argv)

Please make sure you have pytest-django package

pip install pytest-django
Sign up to request clarification or add additional context in comments.

2 Comments

for me its doesn't work TEST_RUNNER = "your_project.your_app.runner". Instead, TEST_RUNNER = "your_app.runner.PytestTestRunner" worked
What's path_to_file?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.