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

2022-05-25 16:10:50 浏览数 (1)

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:

相关特性

  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基本用法

代码语言:javascript复制
#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的库,使用起来也很简单,包含头文件即可。

代码语言:javascript复制
#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

C -doctest-测试框架 - SChen1024 - 博客园

C 单元测试工具——doctest - 灰信网(软件开发博客聚合)

0 人点赞