gtest需要安装有时候带来很多不方便。网络原因,下载安装gtest或者git上拉gtest都可能因为网络原因失败。除了gtest之外,还有很多轻量级易用的单元测试库,比如doctest。
现代C++ unit-test库
除了gtest之外,还有很多轻量级易用的单元测试库,比如doctest和catch。相比gtest需要编译/安装,他们都是header only的,直接包含到工程里就可以做单元测试了,portable又没有任何依赖,而且对编译器版本要求也不高,只需要C++11就行了,用了之后只有一个字:爽!
这里推荐使用doctest,原因是它的性能比catch更好,当然也比gtest好, 来看看doctest怎么用的吧。
doctest介绍
doctest的github地址:doctest/doctest: The fastest feature-rich C++11/14/17/20 single-header testing framework
The fastest feature-rich C++11/14/17/20 single-header testing framework
doctest 是一个新的 C++ 测试框架。与其他功能丰富的替代方案相比,编译时(by orders of magnitude)和运行时是最快的。它提供了编译语言(如 D/Rust/Nim)的能力,并通过提供一个快速,透明和灵活的测试运行器与简洁的界面,可直接在生产代码中编写测试。
doctest和其他测试框架之间的主要区别在于它很轻而且没有侵入性。
A complete example with a self-registering test that compiles to an executable looks like this:
相关特性
- 通过定义DOCTEST_CONFIG_DISABLE标识符可以从二进制执行文件中删除与测试相关的所有内容。
- 非常小巧易于集成——只是一个头文件。
- 非常低的编译时间——大约25ms的编译时间开销,用于展开头文件。
- 可能是最快的断言宏——50K个断言可以30秒内编译(甚至10秒)。
- 不移动任何头文件(库实现的翻译单位除外)。
- 一切都在doctest命名空间中(实现细节在一个嵌套的detail命名空间中)。
- 所有宏都有前缀——默认情况下有些不带前缀,但这是可选的——请参阅配置。
- 不会产生任何警告,即使是最严格的编译选项(在所有测试的编译器上)。
- Clang : -Weverything -pedantic
- GCC:-Wall -Wextra -pedantic 和 超过35个 其他警告,这些标志不覆盖GCC!——参考这里。
- MSVC:/W4 (/Wall太多了—— 如果使用该选项,甚至微软自己的头文件都会产生数千个警告)
- 命令行无法识别的选项,不会出现错误,并支持与客户机命令行解析进行互操作的前缀。
- 可以在程序中设置选项,而不是通过argc/ argv从命令行传入。
- 自己被禁用时不会产生警告。
doctest基本用法
#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
#include "doctest.h"
TEST_CASE("vectors can be sized and resized") {
std::vector<int> v(5);
REQUIRE(v.size() == 5);
REQUIRE(v.capacity() >= 5);
SUBCASE("adding to the vector increases it's size") {
v.push_back(1);
CHECK(v.size() == 6);
CHECK(v.capacity() >= 6);
}
SUBCASE("reserving increases just the capacity") {
v.reserve(6);
CHECK(v.size() == 5);
CHECK(v.capacity() >= 6);
}
}
这里使用CHECK做断言和gtest的EXPECT_xx是类似的,我觉得doctest更酷更实用的一个特性是SUBCASE, 允许在当前case下增加更多的子case去测试一些special一些的东西,非常实用,这也是相比gtest更好的一个地方。
doctest提供了很多丰富的宏,完全可以满足我们的测试需要。
doctest的断言宏
CHECK宏是只检查并不会终止测试,REQUIRE宏则会终止测试和gtest里面的ASSET_XX宏类似,这两个宏也是平时做单测时用得最多的两个宏了。
现代C++ benchmark库
nanobench也是C++11写的header only的库,使用起来也很简单,包含头文件即可。
#define ANKERL_NANOBENCH_IMPLEMENT
#include <nanobench.h>
int main() {
double d = 1.0;
ankerl::nanobench::Bench().run("some double ops", [&] {
d += 1.0 / d;
if (d > 5.0) {
d -= 5.0;
}
ankerl::nanobench::doNotOptimizeAway(d);
});
}
用现代C++测试工具链:doctest+FakeIt+nanobench, 可以完美地替代gtest/gmock和google bench,没有任何依赖,无需安装,直接包含头文件就可以用,非常容易集成和使用,是时候抛弃google test和google bench了!
引用
C++单元测试工具——doctest_蓝月心语的博客-CSDN博客_c++ 单元测试
purecpp - a cool open source modern c++ community