在虚拟环境中运行python鼻测试
我有一个脚本在虚拟环境中运行python鼻测试,python,python-2.7,unit-testing,virtualenv,nose,Python,Python 2.7,Unit Testing,Virtualenv,Nose,我有一个脚本go.py,它需要在几个不同的模块上运行单元测试(使用nose),每个模块都有自己的虚拟环境 如何在测试之前激活每个虚拟环境,并在测试之后将其停用 i、 e.我想这样做(伪代码): 激活() 在虚拟环境中,有/bin/activate\u this.py 这正是我想要的。所以在go.py中我说 import os activate_this_file = os.path.join(env_dir,'bin/deactivate_this.py') execfile(activate_
go.py
,它需要在几个不同的模块上运行单元测试(使用nose),每个模块都有自己的虚拟环境
如何在测试之前激活每个虚拟环境,并在测试之后将其停用
i、 e.我想这样做(伪代码):
激活()
在虚拟环境中,有/bin/activate\u this.py
这正是我想要的。所以在go.py
中我说
import os
activate_this_file = os.path.join(env_dir,'bin/deactivate_this.py')
execfile(activate_this_file, dict(__file__=activate_this_file))
运行测试()
我目前正在使用run\u test()
工作
suite_x = TestLoader().loadTestsFromName(test_module + ":" + test_class)
r = run(suite = suite_x, argv = [sys.argv[0], "--verbosity=0", "-s"])
使停止工作
这是我无法理解的部分
禁用此.py的等效于env/bin/activate\u this.py
更广泛的背景
每个模块将通过go.py
作为lambda函数上传到AWS。(其中“lambda函数”在AWS上下文中具有特定含义,与lambda x:foo(x)
)无关)
我希望
go.py
在每个lambda函数的各自虚拟环境中运行单元测试(因为一旦部署到AWS,它们将在这些虚拟环境中执行)。每个lambda函数使用不同的库,因此它们具有不同的虚拟Env.< /P> < P> <代码> ActudiaType。Py < /Cord>脚本不用于在计算过程中切换虚拟环境。它意味着在您的过程开始时尽快使用,并且不再被触摸。如果你看一下脚本的内容,你会发现它没有注意记录任何内容以备将来停用。一旦activate\u this.py
脚本完成,解释器在脚本启动前的状态将丢失。此外,文件还包括(添加了重点):
此外,这无法撤消其他环境或已导入模块的激活。例如,您不应该尝试在web请求之前激活环境您应该尽早激活一个环境,在此过程中不要再激活它
与您希望使用的方法不同,我希望orchestrator生成特定于需要使用的虚拟环境的python解释器(带有
子流程
),并将测试运行程序传递给它(“nosetests”)有了所需的参数,它才能找到在该环境中运行所需的测试。没有一种简单、完整、通用的方法可以做到这一点。原因是activate_this.py不仅修改了模块搜索路径,而且还修改了模块搜索路径,这可能与python过程相同。相比之下,activate的shell脚本版本只是修改环境变量,并让每个python进程自己重新执行站点自定义,因此清理要容易得多
如何解决这个问题?有几种可能性:
execfile(“activate\u this.py”)
之前或在activate()
中激活。要停用虚拟环境,只需返回父进程。您必须弄清楚子进程如何返回测试结果,以便父进程/主进程能够编译最终的测试报告suite_x = TestLoader().loadTestsFromName(test_module + ":" + test_class)
r = run(suite = suite_x, argv = [sys.argv[0], "--verbosity=0", "-s"])