如何为无返回值的Python文件合并函数编写单元测试
无返回值IO操作类函数的测试方案
这类没有返回值的文件操作函数,测试核心是校验操作行为是否符合预期,不需要依赖返回值,两种常用方案如下:
方案1:Mock模拟文件操作(不读写真实文件)
用Python标准库unittest.mock模拟open函数,校验函数调用路径、读写内容是否符合预期,适合轻量快速测试:
import os from unittest.mock import patch, mock_open from pathlib import Path # 导入你自己的merge_files函数 from your_module import merge_files def test_merge_files_with_mock(): # 模拟参数 test_cwd = Path("/test/cwd") test_source = "requirements-dev.txt" test_target = "requirements.txt" # 模拟源文件内容 mock_source_content = "requests==2.31.0\npytest==7.4.0" # 模拟open操作 with patch("builtins.open", mock_open(read_data=mock_source_content)) as m_open: # 调用被测函数 merge_files(test_cwd, test_source, test_target) # 校验open调用的路径和模式是否符合预期 # 第一次调用是打开目标文件,追加模式 expected_target_path = os.path.join(test_cwd, "app", test_target) m_open.assert_any_call(expected_target_path, "a") # 第二次调用是打开源文件,读模式 expected_source_path = os.path.join(test_cwd, test_source) m_open.assert_any_call(expected_source_path, "r") # 校验写入的内容和源文件内容一致 write_handle = m_open() write_handle.write.assert_called_once_with(mock_source_content)
方案2:临时目录测试(更贴近真实场景)
如果担心Mock遗漏真实场景的边界问题,可以用测试框架的临时目录能力,读写真实的临时文件,测试完成后自动清理,逻辑更直观,适合新手:
这里以pytest的内置tmp_path fixture为例:
import os from pathlib import Path from your_module import merge_files def test_merge_files_with_temp_dir(tmp_path: Path): # 1. 初始化测试环境 # 创建app子目录 app_dir = tmp_path / "app" app_dir.mkdir() # 测试参数 test_source = "requirements-dev.txt" test_target = "requirements.txt" # 源文件写入测试内容 source_content = "requests==2.31.0\npandas==2.1.0" (tmp_path / test_source).write_text(source_content) # 目标文件写入原有内容,验证是追加而非覆盖 target_original_content = "flask==2.3.3\n" (app_dir / test_target).write_text(target_original_content) # 2. 调用被测函数 merge_files(tmp_path, test_source, test_target) # 3. 校验结果 target_final_content = (app_dir / test_target).read_text() assert target_final_content == target_original_content + source_content
建议覆盖的测试场景
- 源文件内容为空,校验目标文件内容不变
- 目标文件原本为空,校验内容等于源文件内容
- 文件内容包含特殊字符、多行换行、空行的场景
内容的提问来源于stack exchange,提问作者Data Mastery
相关产品推荐
相关产品推荐

