在虚拟环境中运行python nose测试

时间:2017-04-18 01:48:27

标签: python python-2.7 unit-testing virtualenv nose

我有一个脚本go.py,它需要在几个不同的模块上运行单元测试(带鼻子),每个模块都有自己的虚拟环境。

如何在测试之前激活每个虚拟环境,并在之后停用它?

即。我想这样做(伪代码):

for fn in functions_to_test:
    activate(path_to_env)
    run_test(fn)
    deactivate()

激活()

在虚拟环境中,有./bin/activate_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_TEST()

我目前正在使用

run_test()工作
suite_x = TestLoader().loadTestsFromName(test_module + ":" + test_class)
r = run(suite = suite_x, argv = [sys.argv[0], "--verbosity=0", "-s"])

停用

这是我无法弄清楚的部分。

env/bin/activate_this.py的停用等价物是什么?

更广泛的上下文

每个模块将由go.py作为lambda函数上传到AWS。 (其中'lambda函数'在AWS上下文中具有特定含义,与lambda x:foo(x)无关)

我希望go.py在各自的虚拟环境中对每个lambda函数运行单元测试(因为它们将在部署到AWS后在那些虚拟环境中执行)。每个lambda函数使用不同的库,因此它们具有不同的虚拟环境。

2 个答案:

答案 0 :(得分:3)

activate_this.py脚本并不用于在计算过程中切换虚拟环境。它意味着在您的过程开始时尽快使用,而不是再次触及。如果您查看脚本的内容,您会发现它不会记录任何未来停用的内容。完成activate_this.py脚本后,脚本启动前解释器的状态将丢失。此外,文件还warns(重点补充):

  

此外,这无法撤消其他环境的激活或已导入的模块。例如,您不应该尝试在Web请求之前激活环境; 您应该尽早激活一个环境,而不是在该过程中再次激活

而不是你希望使用的方法,我让orchestrator生成python解释器(带subprocess),该解释器特定于需要使用的虚拟环境并传递给它测试运行器(可能是“nosetests”),它需要用于查找在该环境中运行所需的测试所需的参数。

答案 1 :(得分:2)

没有简单,完整和通用的方法来做到这一点。原因是activate_this.py不仅修改了模块搜索路径,而且还does site configurations with site.addsitedir(),它可能execute sitecustomize or usercustomize在同一个python进程中。相比之下,activate脚本版本的activate只是修改了环境变量,让每个python进程自己重新执行站点自定义,因此清理工作要容易得多。

如何解决此问题?有几种可能性:

  1. 您可能希望在tox下运行测试。这是我认为最受欢迎的解决方案。

  2. 如果您确定virtualenv中没有任何软件包具有不可逆的sitecustomize / usercustomize,您可以编写一个deactivate()来撤消virtualenv对sys.path,os.environ和sys.prefix的修改或者会记住activate()中的那些值,因此deactivate()可以撤消它们。

  3. activate()之前execfile("activate_this.py")中的forkcreate a subprocess可以asset()。要停用虚拟环境,只需返回父进程即可。您必须弄清楚子进程如何返回测试结果,以便父/主进程可以编译最终的测试报告。