Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Py.Test with configuration files

The title may be vague so I try to explain the scenario here.

I want to test an python module Foo on multiple devices. I have created a test_Foo.py file.

Now all these devices with Foo on it require different settings. For example Device A needs to have Foo constructed & tested with param X and Device B needs to have Foo constructed & tested with param Y. Where the param is for example the device ID.

Is it possible (and how) to control my test_Foo.py to use a configuration file. I use YAML files as configuration for other modules, argparse.ArgumentParser, but I wonder I can use the same concept in Py.Test.

like image 848
RvdK Avatar asked Mar 14 '14 10:03

RvdK


1 Answers

Do you have control of which command line parameters that will be used to invoke py.test in each environment? If that's the case you can configure your test suit to add command line parameters that can in turn be used by other fixtures to configure themselves accordingly.

Please see an example here: http://pytest.org/latest/example/simple.html#pass-different-values-to-a-test-function-depending-on-command-line-options

Adapting the example for your case, it would be something like:

# content of conftest.py
import pytest

def pytest_addoption(parser):
    parser.addoption("--device", action="store", 
        help="device: A or B")

@pytest.fixture
def param(request):
    device = request.config.getoption("--device")
    if device == 'A':
        return X()
    elif device == 'B':
        return Y()

And now for your test file:

# contents of test_Foo.py
def test_Foo(param):
    foo = Foo(param)
    # test foo

This allows you to invoke py.test like this:

py.test --device=A

And the that would make test_Foo receive a X object.

You can of course extend this to receive an yaml filename instead and read the options from there, implementing a fixture accordingly.

like image 59
Bruno Oliveira Avatar answered Sep 24 '22 02:09

Bruno Oliveira