test_package 是 conan create 强制执行的唯一测试入口,必须在包根目录下创建该子目录;其 conanfile.py 需声明 requires 且仅描述消费逻辑,不支持打包字段;默认不跳过,跳过需用 -tf ""。

test_package 目录是唯一被 conan create 自动识别的测试入口
Conan 不会自动运行你随便放的 test/ 或 tests/ 目录里的代码。只有 test_package 这个固定名称的子目录,才会在执行 conan create 时被自动构建并运行。它不是可选功能,而是 Conan 包验证流程的强制环节。
常见错误现象包括:手动写了测试代码但 conan create 输出里完全没执行痕迹;或者报错 ERROR: Missing test package —— 这说明你漏建了这个目录,而不是“可以跳过”。
- 必须在包根目录(即含
conanfile.py的目录)下创建名为test_package的子目录 -
test_package/conanfile.py中需声明requires = "yourpkg/1.0.1",且不能写成相对路径或本地路径 - 测试程序源码(如
test_package/test.cpp)必须能通过#include "your_header.h"正确引用你打包暴露的头文件
conan create 默认强制运行 test_package,想跳过得显式指定 -tf
从 Conan 2.1 开始,conan create 默认会进入 test_package 执行完整构建+运行流程。如果你正在交叉编译、目标平台无执行环境(比如裸机 ARM)、或只是想快速验证打包逻辑,直接跳过测试更实际。
此时不能靠删目录或注释代码,必须用命令行参数控制:
- 跳过测试:
conan create . --build=missing -tf ""(注意-tf ""是空字符串,不是省略) - 指定其他测试目录(不推荐):
conan create . --build=missing -tf my_test_dir,但该目录结构仍需符合 Conan 对test_package的约定 - 误写成
-tf none或--no-test会报错,Conan 不识别这些参数
test_package 里的 conanfile.py 和主包的写法差异很大
很多人把主包的 conanfile.py 复制过去改一改就用,结果编译失败。核心区别在于:主包描述“如何构建自己”,而 test_package/conanfile.py 描述“如何消费自己”——它本质是一个最小依赖项目。
- 不需要定义
settings、options、exports_sources等打包相关字段 - 必须声明
requires = "fast-lzma2/1.0.1"(版本要和你要测的包一致),不能用self.requires()动态调用 - 若测试程序是 C++,需显式启用 CMake 支持:
generators = "CMakeDeps", "CMakeToolchain",否则find_package()找不到配置 - 构建逻辑写在
build()方法里,例如cmake = CMake(self); cmake.configure(); cmake.build(),不能只写self.run("make")
本地缓存里没有二进制时,test_package 会触发重复编译
当你首次运行 conan create . --build=missing,Conan 会先构建主包,再进 test_package 构建测试程序。但如果主包依赖其他库(比如 zlib),而本地缓存里又没有对应二进制,Conan 会尝试重新构建那些依赖 —— 导致整个流程变慢,甚至因编译器不匹配失败。
这不是 bug,而是 Conan 的“按需构建”机制在起作用。解决方法很直接:
- 提前把关键依赖装好:
conan install zlib/1.2.12 --build=missing - 或在
test_package/conanfile.py中加tool_requires显式声明构建期工具(如cmake/3.25.2),避免混用系统 CMake - 确认
test_package的settings和主包完全一致,尤其是compiler.version和build_type,否则 Conan 会认为这是另一个配置,拒绝复用已构建的二进制
最容易被忽略的是:test_package 编译成功不代表你的头文件安装路径正确。务必检查 package() 方法里是否用 self.copy("*.h", dst="include", src="...") 把头文件真正拷进 include/ 子目录,否则测试程序 #include 会失败,但错误信息可能只显示 “No such file”,不提示是路径问题。











