因此,我设计了一个由python脚本组成的Pytest测试包:
class TestClass():
test_a()
test_b()
我想知道是否可以将测试打包为可执行文件并运行? 原因是我要避免在要执行测试的所有机器上安装python和python软件包。
答案 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
查看以下内容,使用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。