nose.plugins.plugintest, os.environ and sys.argvΒΆ

nose.plugins.plugintest.PluginTester and nose.plugins.plugintest.run() are utilities for testing nose plugins. When testing plugins, it should be possible to control the environment seen plugins under test, and that environment should never be affected by os.environ or sys.argv.

>>> import os
>>> import sys
>>> import unittest
>>> import nose.config
>>> from nose.plugins import Plugin
>>> from nose.plugins.builtin import FailureDetail, Capture
>>> from nose.plugins.plugintest import PluginTester

Our test plugin takes no command-line arguments and simply prints the environment it’s given by nose.

>>> class PrintEnvPlugin(Plugin):
...     name = "print-env"
...
...     # no command line arg needed to activate plugin
...     enabled = True
...     def configure(self, options, conf):
...         if not self.can_configure:
...             return
...         self.conf = conf
...
...     def options(self, parser, env={}):
...         print "env:", env

To test the argv, we use a config class that prints the argv it’s given by nose. We need to monkeypatch nose.config.Config, so that we can test the cases where that is used as the default.

>>> old_config = nose.config.Config
>>> class PrintArgvConfig(old_config):
...
...     def configure(self, argv=None, doc=None):
...         print "argv:", argv
...         old_config.configure(self, argv, doc)
>>> nose.config.Config = PrintArgvConfig

The class under test, PluginTester, is designed to be used by subclassing.

>>> class Tester(PluginTester):
...    activate = "-v"
...    plugins = [PrintEnvPlugin(),
...               FailureDetail(),
...               Capture(),
...               ]
...
...    def makeSuite(self):
...        return unittest.TestSuite(tests=[])

For the purposes of this test, we need a known os.environ and sys.argv.

>>> old_environ = os.environ
>>> old_argv = sys.argv
>>> os.environ = {"spam": "eggs"}
>>> sys.argv = ["spamtests"]

PluginTester always uses the [nosetests, self.activate] as its argv. If env is not overridden, the default is an empty env.

>>> tester = Tester()
>>> tester.setUp()
argv: ['nosetests', '-v']
env: {}

An empty env is respected...

>>> class EmptyEnvTester(Tester):
...    env = {}
>>> tester = EmptyEnvTester()
>>> tester.setUp()
argv: ['nosetests', '-v']
env: {}

... as is a non-empty env.

>>> class NonEmptyEnvTester(Tester):
...    env = {"foo": "bar"}
>>> tester = NonEmptyEnvTester()
>>> tester.setUp()
argv: ['nosetests', '-v']
env: {'foo': 'bar'}

nose.plugins.plugintest.run() should work analogously.

>>> from nose.plugins.plugintest import run_buffered as run
>>> run(suite=unittest.TestSuite(tests=[]),
...     plugins=[PrintEnvPlugin()]) 
argv: ['nosetests', '-v']
env: {}

----------------------------------------------------------------------
Ran 0 tests in ...s

OK
>>> run(env={},
...     suite=unittest.TestSuite(tests=[]),
...     plugins=[PrintEnvPlugin()]) 
argv: ['nosetests', '-v']
env: {}

----------------------------------------------------------------------
Ran 0 tests in ...s

OK
>>> run(env={"foo": "bar"},
...     suite=unittest.TestSuite(tests=[]),
...     plugins=[PrintEnvPlugin()]) 
argv: ['nosetests', '-v']
env: {'foo': 'bar'}

----------------------------------------------------------------------
Ran 0 tests in ...s

OK

An explicit argv parameter is honoured:

>>> run(argv=["spam"],
...     suite=unittest.TestSuite(tests=[]),
...     plugins=[PrintEnvPlugin()]) 
argv: ['spam']
env: {}

----------------------------------------------------------------------
Ran 0 tests in ...s

OK

An explicit config parameter with an env is honoured:

>>> from nose.plugins.manager import PluginManager
>>> manager = PluginManager(plugins=[PrintEnvPlugin()])
>>> config = PrintArgvConfig(env={"foo": "bar"}, plugins=manager)
>>> run(config=config,
...     suite=unittest.TestSuite(tests=[])) 
argv: ['nosetests', '-v']
env: {'foo': 'bar'}

----------------------------------------------------------------------
Ran 0 tests in ...s

OK

Clean up.

>>> os.environ = old_environ
>>> sys.argv = old_argv
>>> nose.config.Config = old_config