pyintaller pyqt5 pytest打包后 找不到测试实例
1.项目目录
my_project/
├── src/
│ ├── tests/
│ │ ├── test_example.py
│ ├── main.py
├── my_project.spec
2.main.py
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout
import pytest
import os
class TestApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('Run Pytest Example')
layout = QVBoxLayout()
self.runButton = QPushButton('Run Tests', self)
self.runButton.clicked.connect(self.run_tests)
layout.addWidget(self.runButton)
self.setLayout(layout)
def run_tests(self):
current_dir = os.path.dirname(os.path.abspath(__file__))
test_dir = os.path.join(current_dir, 'src/tests')
pytest.main([test_dir])
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = TestApp()
ex.show()
sys.exit(app.exec_())
3.编写测试用例:在 src/tests/test_example.py 中编写测试用例。
def test_example():
assert 1 + 1 == 2
4.创建 .spec 文件:使用 PyInstaller 生成 .spec 文件,并在其中添加资源文件
# my_project.spec
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(
['src\\main.py'],
pathex=['.'],
binaries=[],
datas=[('src\\tests', 'src\\tests')],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
exe = EXE(
pyz,
a.scripts,
[],
exclude_binaries=True,
name='my_project',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True,
)
coll = COLLECT(
exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='my_project',
)
5.使用 PyInstaller 打包:在命令行中运行以下命令来打包你的应用程序:
pyinstaller my_project.spec
pyinstaller --onefile --hidden-import=unittest.mock --add-data "src\tests;src\tests" src/main.py
即可解决