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

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



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



相关特性


  1. 通过定义DOCTEST_CONFIG_DISABLE标识符可以从二进制执行文件中删除与测试相关的所有内容。


  1. 非常小巧易于集成——只是一个头文件。


  1. 非常低的编译时间——大约25ms的编译时间开销,用于展开头文件。


  1. 可能是最快的断言宏——50K个断言可以30秒内编译(甚至10秒)。


  1. 不移动任何头文件(库实现的翻译单位除外)。


  1. 一切都在doctest命名空间中(实现细节在一个嵌套的detail命名空间中)。


  1. 所有宏都有前缀——默认情况下有些不带前缀,但这是可选的——请参阅配置。


  1. 不会产生任何警告,即使是最严格的编译选项(在所有测试的编译器上)。


  1. Clang : -Weverything -pedantic


  1. GCC:-Wall -Wextra -pedantic 和 超过35个 其他警告,这些标志不覆盖GCC!——参考这里。


  1. MSVC:/W4 (/Wall太多了—— 如果使用该选项,甚至微软自己的头文件都会产生数千个警告)


  1. 命令行无法识别的选项,不会出现错误,并支持与客户机命令行解析进行互操作的前缀。


  1. 可以在程序中设置选项,而不是通过argc/ argv从命令行传入。


  1. 自己被禁用时不会产生警告。


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


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


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

相关文章
|
9天前
|
设计模式 安全 测试技术
深入理解与应用自动化测试框架 — 以Selenium为例网络防线的构筑者:洞悉网络安全与信息安全的核心要素
【5月更文挑战第29天】 在快速迭代的软件开发过程中,自动化测试已成为提高测试效率、确保软件质量的重要手段。本文将深入探讨自动化测试框架Selenium的核心概念、架构以及实际应用中的关键技巧,旨在为读者提供一篇系统性的分析与实践指南。文章首先概述了自动化测试的必要性和Selenium框架的基本特征;随后详细剖析了Selenium的组件结构,并结合实例讲解如何高效地设计和执行测试用例;最后,讨论了当前自动化测试面临的挑战及未来发展趋势。
|
3天前
|
Java 测试技术 数据处理
Java一分钟之-TestNG:高级测试框架
【6月更文挑战第4天】TestNG是Java的高级测试框架,扩展了JUnit,支持数据驱动、参数化、测试分组、依赖和并行测试,提高自动化测试效率。本文介绍了TestNG的核心特性,如`@DataProvider`和`@Parameters`注解,以及常见问题和解决策略,如正确使用测试生命周期方法和处理数据驱动测试中的数据。通过示例展示了如何进行数据驱动测试,帮助读者更好地理解和应用TestNG。
22 0
Java一分钟之-TestNG:高级测试框架
|
3天前
|
存储 数据管理 测试技术
构建Python构建自动化测试框架(原理与实践)
当谈到软件质量保证时,自动化测试是一个不可或缺的步骤。Python作为一种简单易学的编程语言,具有丰富的测试框架和库,使得构建自动化测试框架变得相对简单。本文将介绍如何使用Python构建自动化测试框架,包括选择合适的测试框架、编写测试用例、执行测试和生成报告等方面。
构建Python构建自动化测试框架(原理与实践)
|
4天前
|
Java 测试技术
Java一分钟之-JUnit测试框架:断言与测试套件
【6月更文挑战第3天】本文介绍了JUnit在Java单元测试中的应用,包括断言基础如`assertEquals`、`assertTrue`等,用于验证代码预期结果;利用`@Suite`创建测试套件以组合多个测试;并讨论了常见问题及解决方法,如忽略测试、错误断言、异常处理和保持测试简洁。理解并熟练运用这些概念能提升测试代码的质量和效率。
26 2
|
7天前
|
敏捷开发 Java 测试技术
深入理解自动化测试框架Selenium的设计理念与最佳实践
【5月更文挑战第31天】 在现代软件开发过程中,自动化测试是确保产品质量和加快交付速度的关键因素。Selenium作为一种广泛使用的自动化测试框架,它支持多种浏览器、操作系统和编程语言,极大地方便了测试人员编写和维护测试用例。本文将探讨Selenium的核心设计理念,包括其架构、组件和工作流程,并分享如何在实际项目中应用Selenium的最佳实践,以提高测试效率和准确性。通过分析真实案例,我们将展示Selenium如何帮助企业实现持续集成和持续部署(CI/CD)的目标,同时保证软件的稳定性和可靠性。
|
7天前
|
设计模式 敏捷开发 监控
深入理解自动化测试框架的设计原则与实践
【5月更文挑战第31天】 在软件开发的复杂多变环境中,自动化测试已成为确保产品质量和加快交付速度的关键因素。本文将探讨自动化测试框架的设计原则,并结合实际案例分析如何构建一个高效、可扩展且易于维护的自动化测试框架。我们将透过不同的测试场景,从模块化、抽象化到数据驱动等设计模式,剖析框架构建的最佳实践。通过阅读本文,读者能够获得构建强大自动化测试框架的深刻见解,并应用于实际工作中,以提升软件测试效率和准确性。
4 0
|
7天前
|
机器学习/深度学习 敏捷开发 人工智能
深入理解软件测试中的自动化框架选择
【5月更文挑战第30天】 在快速迭代的软件开发过程中,高效的测试策略是确保产品质量的关键。本文将探讨自动化测试框架的选择对软件测试效率和质量的影响。通过分析不同类型项目的需求与特点,我们讨论如何根据团队的技术栈、项目周期和资源情况来选取合适的自动化测试框架。文章还将涉及持续集成环境下自动化测试框架的最佳实践,以及新兴测试技术对现有框架选择的潜在影响。
|
7天前
|
IDE Java 测试技术
Java中JUnit等测试框架的使用
Java中JUnit等测试框架的使用
|
7天前
|
敏捷开发 自然语言处理 JavaScript
探索自动化测试框架的选择标准与实践应用
【5月更文挑战第30天】 在软件开发的复杂多变环境中,自动化测试已成为确保产品质量和加快上市速度的关键。本文深入探讨了选择自动化测试框架时需考虑的标准,并通过具体案例分析如何在项目中成功实施。我们将覆盖框架选择过程中的性能、可靠性、易用性及可维护性四个核心要素,并结合业界最佳实践,提出一套实用的框架评估与应用流程。
|
7天前
|
Dart 前端开发 测试技术
移动应用开发的未来:跨平台框架与原生系统的融合深入理解软件测试中的持续集成与持续部署(CI/CD)
【5月更文挑战第30天】 在本文中,我们将深入探讨移动应用开发领域的最新趋势:跨平台开发框架与原生操作系统的融合。随着移动设备成为日常生活的核心,高效、灵活且性能卓越的应用程序需求日益增长。文章分析了当前主流的跨平台工具如React Native和Flutter,并探讨了它们如何与iOS和Android等原生系统相互作用,以及这种融合对开发者、用户和整个移动生态系统意味着什么。我们还将预测未来可能的技术发展,并提出相应的策略建议。