How to access plugin options within a test? (Pytho

2019-02-15 21:41发布

问题:

We are trying to implement an automated testing framework using nose. The intent is to add a few command line options to pass into the tests, for example a hostname. We run these tests against a web app as integration tests.

So, we've created a simple plugin that adds a option to the parser:

import os
from nose.plugins import Plugin

class test_args(Plugin):
    """
    Attempting to add command line parameters.
    """
    name = 'test_args'
    enabled = True

    def options(self, parser, env=os.environ):
        super(test_args, self).options(parser, env)
        parser.add_option("--hostname",
                    action="store",
                    type="str",
                    help="The hostname of the server")

    def configure(self, options, conf):
        self.hostname = options.hostname    

The option is available now when we run nosetests...but I can't figure out how to use it within a test case? Is this possible? I can't find any documentation on how to access options or the configuration within a test case.

The adding of the command line arguments is purely for development/debugging code purposes. We plan to use config files for our automated runs in bamboo. However, when developing integration tests and also debugging issues, it is nice to change the config on the fly. But we need to figure out how to actually use the options first...I feel like I'm just missing something basic, or I'm blind...

Ideally we could extend the testconfig plugin to make passing in config arguments from this:

--tc=key:value

to:

--key=value

If there is a better way to do this then I'm all ears.

回答1:

One shortcut is to access import sys; sys.argv within the test - it will have the list of parameters passed to the nose executable, including the plugin ones. Alternatively your plugin can add attributes to your tests, and you can refer to those attributes - but it requires more heavy lifting - similar to this answer.



回答2:

So I've found out how to make this work:

import os
from nose.plugins import Plugin

case_options = None

class test_args(Plugin):
    """
    Attempting to add command line parameters.
    """
    name = 'test_args'
    enabled = True

    def options(self, parser, env=os.environ):
        super(test_args, self).options(parser, env)
        parser.add_option("--hostname",
                    action="store",
                    type="str",
                    help="The hostname of the server")

    def configure(self, options, conf):
        global case_options 
        case_options = options

Using this you can do this in your test case to get the options:

    from test_args import case_options

To solve the different config file issues, I've found you can use a setup.cfg file written like an INI file to pass in default command line parameters. You can also pass in a -c config_file.cfg to pick a different config. This should work nicely for what we need.