doctest/doctest

GitHub: doctest/doctest

doctest 是目前最快的 C++ 单头文件测试框架,支持将测试直接嵌入生产代码中,以极低的编译和运行开销实现轻量级单元测试。

Stars: 6772 | Forks: 691

master branch
dev branch
**doctest** 是一个全新的 C++ 测试框架,但与其他功能丰富的替代方案相比,无论是在编译时间(快出[**几个数量级**](doc/markdown/benchmarks.md))还是运行时间上,它都是迄今为止最快的。得益于一个快速、透明且灵活的测试运行器及其简洁的接口,它为 C++ 这样的编译型语言带来了像 [**D**](https://dlang.org/spec/unittest.html) / [**Rust**](https://doc.rust-lang.org/book/second-edition/ch11-00-testing.html) / [**Nim**](https://nim-lang.org/docs/unittest.html) 那样直接在生产代码中编写测试的能力。 [![Standard](https://img.shields.io/badge/c%2B%2B-11/14/17/20/23-blue.svg)](https://en.wikipedia.org/wiki/C%2B%2B#Standardization) [![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://opensource.org/licenses/MIT) [![download](https://img.shields.io/badge/download%20%20-link-blue.svg)](https://raw.githubusercontent.com/doctest/doctest/master/doctest/doctest.h) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/503/badge)](https://bestpractices.coreinfrastructure.org/projects/503) [![Try it online](https://img.shields.io/badge/try%20it-online-orange.svg)](https://godbolt.org/z/4s389Kbfs) 一个带有自注册测试并最终编译为可执行文件的完整示例如下所示: ![cover-example](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/f156930be6201559.gif) 现有很多 C++ 测试框架 —— [Catch](https://github.com/catchorg/Catch2)、[Boost.Test](http://www.boost.org/doc/libs/1_64_0/libs/test/doc/html/index.html)、[UnitTest++](https://github.com/unittest-cpp/unittest-cpp)、[cpputest](https://github.com/cpputest/cpputest)、[googletest](https://github.com/google/googletest) 以及[其他框架](https://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#C.2B.2B)。 它与其他测试框架的**关键**区别在于它非常轻量且无侵入性: - 编译时间极短,无论是[**包含头文件**](doc/markdown/benchmarks.md#cost-of-including-the-header)还是编写[**成千上万个断言**](doc/markdown/benchmarks.md#cost-of-an-assertion-macro) - 即使在 **MSVC**/**GCC**/**Clang** [**最严格的**](scripts/cmake/common.cmake#L84)告警级别下,也不会产生任何警告 - 可以通过 [**```DOCTEST_CONFIG_DISABLE```**](doc/markdown/configuration.md#doctest_config_disable) 标识符从二进制文件中移除**所有**与测试相关的代码 - [**线程安全**](doc/markdown/faq.md#is-doctest-thread-aware) —— 断言可以在单个测试用例派生的多个线程中使用 —— [**示例**](examples/all_features/concurrency.cpp) - 断言可以用于[**测试上下文之外**](doc/markdown/assertions.md#using-asserts-out-of-a-testing-context) —— 作为通用断言库 —— [**示例**](examples/all_features/asserts_used_outside_of_tests.cpp) - 没有全局命名空间污染(一切都在 ```doctest::``` 中),且不会强制引入**任何**头文件 - [**可移植的**](doc/markdown/features.md#extremely-portable) C++11(如果使用 C++98 请使用 [**1.2.9**](https://github.com/doctest/doctest/tree/1.2.9) 标签),包含超过 100 个不同的 CI 构建(静态分析、sanitizers 等) - 二进制文件(exe/dll)可以使用另一个二进制文件的测试运行器 => 测试位于单个注册表中 —— [**示例**](examples/executable_dll_and_plugin/) ![cost-of-including-the-framework-header](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/2e2e377d1e201615.png) 这使得该框架能够以比其他任何框架更多的形式使用 —— 测试可以直接编写在生产代码中! *测试可以作为一种文档形式,应该能够存放在它们所测试的生产代码附近。* - 这大大**降低了**编写测试的门槛 —— 你不必:**1)** 创建一个单独的源文件 **2)** 在其中包含一堆内容 **3)** 将其添加到构建系统中,以及 **4)** 将其添加到版本控制中 —— 你可以直接在某个类或某块功能的源文件底部编写测试,甚至在头文件中也可以! - 生产代码中的测试可以被视为文档/最新的注释 —— 展示 API - 测试那些没有通过公共 API 和头文件暴露出来的内部实现,不再是一项费脑筋的运动 - C++ 中的[**测试驱动开发**](https://en.wikipedia.org/wiki/Test-driven_development)变得前所未有的简单! 该框架也可以像其他任何框架一样使用,而无需混合生产代码和测试 —— 请查看[**功能**](doc/markdown/features.md)。 **doctest** 参照了 [**Catch**](https://github.com/catchorg/Catch2) 进行设计,并直接使用了其中的部分代码 —— 请查看[**差异**](doc/markdown/faq.md#how-is-doctest-different-from-catch)。 [这个表格](https://github.com/martinmoene/catch-lest-other-comparison) 对比了 **doctest** / [**Catch**](https://github.com/catchorg/Catch2) / [**lest**](https://github.com/martinmoene/lest),它们三者非常相似。 请查看 [**YouTube**](https://www.youtube.com/watch?v=eH1CxEC29l8) 上的 [**CppCon 2017 演讲**](https://cppcon2017.sched.com/event/BgsI/mix-tests-and-production-code-with-doctest-implementing-and-using-the-fastest-modern-c-testing-framework) 以更好地理解该框架的工作原理,并阅读 [**JetBrains 的文章**](https://blog.jetbrains.com/rscpp/better-ways-testing-with-doctest/) 了解如何使用它 —— 该文章重点介绍了该框架的独特之处!关于如何将框架与生产代码结合使用的简要说明,可以参考[**这个 GitHub issue**](https://github.com/doctest/doctest/issues/252)。在 2017 年 2 月版的 ACCU Overload 上也有一篇[**较早的文章**](https://accu.org/var/uploads/journals/Overload137.pdf)。 [![CppCon 2017 talk about doctest on youtube](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/aa755df229201624.png)](https://www.youtube.com/watch?v=eH1CxEC29l8) ## 文档 项目: - [功能与设计目标](doc/markdown/features.md) - 完整的功能列表 - [社区驱动的路线图](https://github.com/doctest/doctest/issues/600) - 即将推出的功能 - [基准测试](doc/markdown/benchmarks.md) - 编译时间和运行时间的绝对优势 - [贡献指南](CONTRIBUTING.md) - 如何提交规范的 pull request - [更新日志](CHANGELOG.md) - 基于已关闭的 issue/PR 生成的更新日志 使用: - [教程](doc/markdown/tutorial.md) - 在阅读文档其他部分之前,请务必先阅读此部分 - [断言宏](doc/markdown/assertions.md) - [测试用例、子用例和测试夹具](doc/markdown/testcases.md) - [参数化测试用例](doc/markdown/parameterized-tests.md) - [命令行](doc/markdown/commandline.md) - [日志宏](doc/markdown/logging.md) - [```main()``` 入口点](doc/markdown/main.md) - [配置](doc/markdown/configuration.md) - [字符串转换](doc/markdown/stringification.md) - [报告器](doc/markdown/reporters.md) - [扩展](doc/markdown/extensions.md) - [常见问题解答](doc/markdown/faq.md) - [构建系统](doc/markdown/build-systems.md) - [示例](examples) ## Bug 和功能提案 如果你发现了一个 bug,请报告它! 如果你有关于改进项目的想法,无论是改善文档还是添加新功能,都可以考虑准备一份**功能提案**。 我们之所以称之为提案,是因为“请求”这个词带有错误的意图,没有人会为你自动进行修复。但这个想法可以在**你**实现它之前进行讨论并被接受或拒绝。 在提交任何 issue 之前,请务必阅读 [**贡献指南**](CONTRIBUTING.md) 页面,那里记录了相关的问题处理流程。 ## 随时间变化的 Stargazers [![Stargazers over time](https://starchart.cc/doctest/doctest.svg)](https://starchart.cc/doctest/doctest) ## Logo 本 [Logo](scripts/data/logo) 采用知识共享署名 4.0 国际许可协议进行授权。版权所有 © 2019 [area55git](https://github.com/area55git)   [![License: CC BY 4.0](https://licensebuttons.net/l/by/4.0/80x15.png)](https://creativecommons.org/licenses/by/4.0/)

标签:Bash脚本, C++, SOC Prime, 单元测试, 单头文件库, 安全意识培训, 开发工具, 数据擦除, 测试框架