使用pytest验证docx报告生成脚本:测试通过但文件未生成
问题
我用Python docx库结合Pandas/Numpy实现计算功能,生成Microsoft Word报告。现在用pytest验证报告生成脚本fc1.py的输出是否正常,项目目录结构如下:
项目根目录 ├── fc1.py ├── final_report/ ├── reports/ └── tests/ └── fc1_test.py
编写的fc1_test.py通过pytest.main调用带参数的fc1.py,之后验证目标文件是否存在。在Windows 10环境下运行pytest,测试显示通过,但final_report目录是空的,想知道是操作有误,还是pytest存在虚拟目录机制导致的?
问题分析与解决思路
1. 相对路径错位(最大概率)
pytest默认的工作目录是tests/,而非项目根目录。如果fc1.py里用了相对路径(比如final_report/report.docx),文件实际会生成到tests/final_report/里,而非你预期的根目录final_report/。先去tests/目录下检查有没有生成的报告文件。
解决办法:在fc1.py里用绝对路径生成输出,比如通过脚本自身路径动态获取项目根目录:
import os # 获取fc1.py所在的项目根目录 ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) # 拼接正确的报告输出路径 REPORT_SAVE_PATH = os.path.join(ROOT_DIR, "final_report", "你的报告文件名.docx")
2. pytest临时目录误用
pytest本身没有默认的虚拟目录机制,但如果你的测试脚本里用了tmp_path这类临时目录fixture,且不小心把输出路径指向了临时目录,测试结束后临时目录会被自动清理,导致你看不到文件。检查fc1_test.py里有没有误用这类fixture。
3. pytest.main调用方式错误
pytest.main是用来运行测试用例的,不是执行普通脚本的正确方式。你应该直接导入fc1.py里的核心生成函数,在测试用例中调用它,而不是用pytest.main去跑整个脚本。
错误写法示例:
# fc1_test.py 错误写法 import pytest pytest.main(["../fc1.py", "--参数"])
正确写法示例:
# fc1_test.py 正确写法 import os from fc1 import generate_report # 假设fc1.py里有这个生成报告的核心函数 def test_report_generation(): # 调用生成函数 generate_report() # 构造根目录下的报告路径 root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) target_report = os.path.join(root_dir, "final_report", "你的报告文件名.docx") # 验证文件存在且非空 assert os.path.exists(target_report) assert os.path.getsize(target_report) > 0
4. 隐藏的写入异常
Windows下可能存在文件权限问题,或者fc1.py里捕获了写入异常但没抛出,导致测试只验证了路径存在(比如目录本身存在),但实际没生成文件。可以在fc1.py里加打印或日志,确认文件写入过程是否正常,或者在测试里增加文件大小的检查。
内容的提问来源于stack exchange,提问作者bbartling

