Cookiecutter模板测试中模块导入失败问题求助
你的问题根源在于{{cookiecutter.project_slug}}是Cookiecutter的模板占位符,Python解析导入语句时会把{{cookiecutter当成模块名的一部分,而非等待模板实例化后的真实项目名。以下是几种可行的解决思路:
思路1:先实例化模板再测试
Cookiecutter的模板变量只有在生成实际项目后才会被替换,所以测试前需要先生成一个测试用的项目实例,再导入模块:
import os import sys import shutil from cookiecutter.main import cookiecutter def test_repository_structure(): # 定义测试参数 test_slug = "test_project_demo" output_dir = "./temp_test_project" # 从当前模板生成测试项目 cookiecutter( template="./", output_dir=output_dir, no_input=True, extra_context={"project_slug": test_slug} ) # 将生成的项目路径加入Python搜索路径 project_path = os.path.join(output_dir, test_slug) sys.path.insert(0, project_path) # 正常导入模块并测试 try: import make_repository_structure as mrs # 这里添加你的测试逻辑,比如验证函数存在或结构生成正确 assert hasattr(mrs, "generate_structure") assert callable(mrs.generate_structure) finally: # 清理临时测试文件 shutil.rmtree(output_dir)
思路2:直接执行脚本内容而非导入模块
如果不需要完整的模块导入,可直接读取模板中的脚本文件内容,用exec执行后测试逻辑:
import os def test_script_functionality(): # 指向模板中的脚本文件 script_path = os.path.join("{{cookiecutter.project_slug}}", "make_repository_structure.py") with open(script_path, "r", encoding="utf-8") as f: script_content = f.read() # 模拟模板实例化后的环境,执行脚本 local_namespace = {} exec(script_content, globals(), local_namespace) # 测试脚本中的核心功能 assert "generate_structure" in local_namespace # 示例:调用函数生成Python包结构并验证 local_namespace["generate_structure"]("python_package") # 这里可添加文件/目录存在性检查(需注意路径,建议结合临时目录)
思路3:结合Pytest临时目录(更优雅的方式)
利用Pytest的tmp_path fixture自动管理临时目录,避免手动清理:
import os import sys import pytest from cookiecutter.main import cookiecutter @pytest.fixture def instantiated_project(tmp_path): # 在临时目录生成测试项目 test_slug = "test_pytest_demo" cookiecutter( template="./", output_dir=str(tmp_path), no_input=True, extra_context={"project_slug": test_slug} ) return os.path.join(tmp_path, test_slug) def test_module_import(instantiated_project): # 添加临时项目路径到搜索路径 sys.path.insert(0, instantiated_project) # 导入模块并测试 import make_repository_structure as mrs assert mrs.generate_structure("data_science") is not None # 可继续添加结构验证逻辑
关键注意事项
- 确保测试时当前工作目录是Cookiecutter模板的根目录(即包含
cookiecutter.json的目录)。 - 若使用
cookiecutter库,需提前安装:pip install cookiecutter。
内容的提问来源于stack exchange,提问作者ℂybernetician
相关产品推荐
相关产品推荐

