将Pytest测试文件打包为可执行文件

时间:2019-03-04 11:55:23

标签: python python-3.x python-2.7 pytest

因此,我设计了一个由python脚本组成的Pytest测试包:

class TestClass():

   test_a()

   test_b()

我想知道是否可以将测试打包为可执行文件并运行? 原因是我要避免在要执行测试的所有机器上安装python和python软件包。

3 个答案:

答案 0 :(得分:1)

没有看到您想要完成的任务,这就是我得到的。我使用了可以自己运行的代码的修改版本。

import pytest

class TestSanity(): 
    def test_step_1(self): 
        assert 2==2 
#        if __name__ == "__main__": 
        test=pytest.main(['-v', '-x', '--durations=0'])
        print(test)


TestSanity().test_step_1()

我将其保存为“ pytest_with_pyinstaller.py”

然后我在anaconda提示符中使用此行来打包pyinstaller文件

pyinstaller --exclude-module PyQt5 --hidden-import pytest.mark --hidden-import py._builtin    --onefile --hidden-import pytest.main U:\PLAN\BCUBRICH\Python\Tests\pytest_with_pyinstaller.py

然后我从Windows cmd控制台运行生成的.exe。

>Run>cmd
>cd "your output director"
>"your_exe.exe"

C:\ Users \ bcubrich \ dist \ test2> pytest_with_pyinstaller.exe =============================测试会话开始=================== =========== 平台win32-Python 3.7.1,pytest-4.0.2,py-1.7.0,pluggy-0.8.0-C:\ Users \ bcubrich \ dist \ test2 \ pytest_with_pyinstaller.exe cachedir:.pytest_cache rootdir:C:\ Users \ bcubrich \ dist \ test2,ini文件: 收集了0件物品

========================= 0.01秒内没有运行任何测试================= ========

5

此代码末尾的5似乎是pytest行,并且与我在spyder中运行此代码时得到的数字相同,因此我认为它是有效的,除了pytest脚本将尝试测试dist目录。

答案 1 :(得分:0)

创建一个python文件并使用pytest包从那里调用测试:

import pytest

pytest.main(['mytestdir'])

将main.py包和测试文件打包到可执行文件中,就像处理任何python项目一样。保留main.py作为您的可执行文件入口点。

有关从python运行pytest的更多信息:https://docs.pytest.org/en/latest/usage.html#calling-pytest-from-python-code

答案 2 :(得分:0)

如果脚本的编写方式适合作为exe运行,则可以使用pyinstaller。如果您使用anaconda,则只需运行

pyinstaller --onefile path_to_your_file

尽管我通常会执行类似的操作以避免出现PyQt5错误

pyinstaller --onefile --exclude-module PyQt5 --noconsole C:\username\etc\script.py

https://www.pyinstaller.org/

查看以下内容,使用pytest冻结脚本

“冻结pytest

如果使用PyInstaller之类的工具冻结应用程序以便将其分发给最终用户,则最好打包测试运行程序并使用冻结的应用程序运行测试。这样,可以及早发现打包错误(例如,依赖项未包含在可执行文件中),同时还允许您将测试文件发送给用户,以便他们可以在自己的计算机上运行它们,这对于获取有关难以重现的错误的更多信息很有用。

幸运的是,最近的PyInstaller版本已经为pytest提供了自定义钩子,但是如果您使用其他工具来冻结cx_freeze或py2exe等可执行文件,则可以使用pytest.freeze_includes()获得内部pytest模块的完整列表。但是,如何配置工具以查找内部模块的方法因工具而异。

您可以通过在程序启动期间进行一些巧妙的参数处理,使冻结的程序作为pytest运行程序,而不必将pytest运行程序冻结为单独的可执行文件。这使您可以拥有一个可执行文件,这通常更方便。请注意,pytest(setupttools入口点)使用的插件发现机制不适用于冻结的可执行文件,因此pytest无法自动找到任何第三方插件。要包括pytest-timeout这样的第三方插件,必须将其显式导入并传递给pytest.main。”

# contents of app_main.py
import sys
import pytest_timeout  # Third party plugin

if len(sys.argv) > 1 and sys.argv[1] == "--pytest":
    import pytest

    sys.exit(pytest.main(sys.argv[2:], plugins=[pytest_timeout]))
else:
    # normal application execution: at this point argv can be parsed
    # by your argument-parsing library of choice as usual
    ...

此大块引号来自here