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