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

**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) 那样直接在生产代码中编写测试的能力。
[](https://en.wikipedia.org/wiki/C%2B%2B#Standardization)
[](https://opensource.org/licenses/MIT)
[](https://raw.githubusercontent.com/doctest/doctest/master/doctest/doctest.h)
[](https://bestpractices.coreinfrastructure.org/projects/503)
[](https://godbolt.org/z/4s389Kbfs)
一个带有自注册测试并最终编译为可执行文件的完整示例如下所示:

现有很多 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/)

这使得该框架能够以比其他任何框架更多的形式使用 —— 测试可以直接编写在生产代码中!
*测试可以作为一种文档形式,应该能够存放在它们所测试的生产代码附近。*
- 这大大**降低了**编写测试的门槛 —— 你不必:**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)。
[](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
[](https://starchart.cc/doctest/doctest)
## Logo
本 [Logo](scripts/data/logo) 采用知识共享署名 4.0 国际许可协议进行授权。版权所有 © 2019 [area55git](https://github.com/area55git) [](https://creativecommons.org/licenses/by/4.0/)

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