问题
Can a variable be moved from the cmd to my module when using nose tests?
Scenario: I am running tests with selenium that need to run against both production and sandbox versions of the website (www.sandbox.myurl.com and www.myurl.com)
I wrote a custom nose plugin that lets me set which environment to run against
EDITED CODE
env = None
class EnvironmentSelector(Plugin):
"""Selects if test will be run against production or sandbox environments.
"""
def __init__(self):
Plugin.__init__(self)
self.environment = "spam" ## runs against sandbox by default
def options(self, parser, env):
"""Register command line options"""
parser.add_option("--set-env",
action="store",
dest="setEnv",
metavar="ENVIRON",
help="Run tests against production or sandbox"
"If no --set-env specified, runs against sandbox by default")
def configure(self, options, config):
"""Configure the system, based on selected options."""
#set variable to that which was passed in cmd
self.environment = options.setEnv
self.enabled = True
global env
print "This is env before: " + str(env)
env = self.passEnv()
print "This is env after: " str(env)
return env
def passEnv(self):
run_production = False
if self.environment.lower() == "sandbox":
print ("Environment set to sandbox")
return run_production
elif self.environment.lower() == "prod":
print ("Environmnet set to prod")
run_production = True
return run_production
else:
print ("NO environment was set, running sandbox by default")
return run_production
In my package, I have a @setup
function that passes the appropriate URL to the webdriver before running the test suite.
At the top of the module with my setup()
in it, I have
from setEnvironment import env
I included a print statement with the value of env
in the setup function
Whiles env
gets set in setEnvironment.py as True
, it gets imported as None
, which was env's original assignment.
How do I get the variable to successfully import into @setup
??
SETUP.PY
Here's what I run everytime I make an adjustment to the setEnvironment script.
from setuptools import setup
setup(
name='Custom nose plugins',
version='0.6.0',
description = 'setup Prod v. Sandbox environment',
py_modules = ['setEnvironment'],
entry_points = {
'nose.plugins': [
'setEnvironment = setEnvironment:EnvironmentSelector'
]
}
)
回答1:
It looks like the way you are doing it the value of the variable is assigned on import. Try something like this:
#at the top of the setup() module
import setEnvironment
...
#in setup() directly
print "env =", setEnvironment.env
You also have some minor typos in your code. The following should work (setEnvironment.py):
from nose.plugins.base import Plugin
env = None
class EnvironmentSelector(Plugin):
"""Selects if test will be run against production or sandbox environments.
"""
def __init__(self):
Plugin.__init__(self)
self.environment = "spam" ## runs against sandbox by default
def options(self, parser, env):
"""Register command line options"""
parser.add_option("--set-env",
action="store",
dest="setEnv",
metavar="ENVIRON",
help="Run tests against production or sandbox"
"If no --set-env specified, runs against sandbox by default")
def configure(self, options, config):
"""Configure the system, based on selected options."""
#set variable to that which was passed in cmd
self.environment = options.setEnv
self.enabled = self.environment
if self.enabled:
global env
print "This is env before: " + str(env)
env = self.passEnv()
print "This is env after: " + str(env)
return env
def passEnv(self):
run_production = False
if self.environment.lower() == "sandbox":
print ("Environment set to sandbox")
return run_production
elif self.environment.lower() == "prod":
print ("Environmnet set to prod")
run_production = True
return run_production
else:
print ("NO environment was set, running sandbox by default")
return run_production
And here is my testing code (pg_test.py), to run with straight python:
import logging
import sys
import nose
from nose.tools import with_setup
import setEnvironment
def custom_setup():
#in setup() directly
print "env =", setEnvironment.env
@with_setup(custom_setup)
def test_pg():
pass
if __name__ == '__main__':
module_name = sys.modules[__name__].__file__
logging.debug("running nose for package: %s", module_name)
result = nose.run(argv=[sys.argv[0],
module_name,
'-s',
'--nologcapture',
'--set-env=prod'
],
addplugins=[setEnvironment.EnvironmentSelector()],)
logging.info("all tests ok: %s", result)
And when I ran it, I got:
$ python pg_test.py
This is env before: None
Environmnet set to prod
This is env after: True
env = True
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
来源:https://stackoverflow.com/questions/22944330/using-nose-plugin-to-pass-a-boolean-to-my-package