0
点赞
收藏
分享

微信扫一扫

还在用gtest?更好用的测试框架介绍



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和其他测试框架之间的主要区别在于它很轻而且没有侵入性。

还在用gtest?更好用的测试框架介绍_c++

A complete example with a self-registering test that compiles to an executable looks like this:

还在用gtest?更好用的测试框架介绍_c++_02

相关特性

  1. 通过定义DOCTEST_CONFIG_DISABLE标识符可以从二进制执行文件中删除与测试相关的所有内容。
  2. 非常小巧易于集成——只是一个头文件。
  3. 非常低的编译时间——大约25ms的编译时间开销,用于展开头文件。
  4. 可能是最快的断言宏——50K个断言可以30秒内编译(甚至10秒)。
  5. 不移动任何头文件(库实现的翻译单位除外)。
  6. 一切都在doctest命名空间中(实现细节在一个嵌套的detail命名空间中)。
  7. 所有宏都有前缀——默认情况下有些不带前缀,但这是可选的——请参阅配置。
  8. 不会产生任何警告,即使是最严格的编译选项(在所有测试的编译器上)。
  9. Clang : -Weverything -pedantic
  10. GCC:-Wall -Wextra -pedantic 和 超过35个 其他警告,这些标志不覆盖GCC!——参考这里。
  11. MSVC:/W4 (/Wall太多了—— 如果使用该选项,甚至微软自己的头文件都会产生数千个警告)
  12. 命令行无法识别的选项,不会出现错误,并支持与客户机命令行解析进行互操作的前缀。
  13. 可以在程序中设置选项,而不是通过argc/ argv从命令行传入。
  14. 自己被禁用时不会产生警告。

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了! 



举报

相关推荐

0 条评论