【问题标题】:Running python nose tests in virtual-env在 virtual-env 中运行 python 鼻子测试
【发布时间】:2017-04-18 01:48:27
【问题描述】:

我有一个脚本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 函数使用不同的库,因此它们具有不同的虚拟环境。

【问题讨论】:

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


    【解决方案1】:

    activate_this.py 脚本并非用于在计算过程中切换虚拟环境。它意味着在您的流程开始时尽快使用,并且不会再被触及。如果您查看脚本的内容,您会发现它不会为将来的停用记录任何内容。一旦activate_this.py 脚本完成,解释器在脚本启动之前的状态就会丢失。此外,文档还有warns(强调添加):

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

    我会让编排器生成特定于需要使用的虚拟环境的 python 解释器(使用subprocess),而不是您希望使用的方法,并将测试运行器传递给它(“鼻子测试”,大概)以及它需要的参数来找到它需要在那个环境中运行的测试。

    【讨论】:

      【解决方案2】:

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

      如何解决这个问题?有几种可能:

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

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

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

      【讨论】:

        猜你喜欢
        • 2015-08-21
        • 2018-09-02
        • 1970-01-01
        • 1970-01-01
        • 2011-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多