googletest:sample7分析

news/2025/3/1 12:15:56/文章来源:https://www.cnblogs.com/fortunely/p/18744200

目录
  • 待测文件
  • 测试文件
  • 小结
  • 参考

待测文件

同sample6,都是prime_tables.h文件

PrimeTable类声明了素数表的一系列接口,包括
1)IsPrime:判断当前输入数n是否为素数;
2)GetNextPrime:找比输入数n大的下一个素数.

文件内容略.

测试文件

sample6的测试,类型参数化测试,利用"typed test" "type-parameterized tests" 2种方法复用test,对不同类型的派生类进行测试.

sample7的测试,接口测试,利用"value-parameterized tests" 复用test,测试接口的多个实现的公共属性.

步骤:
1)利用工厂方法CreateOnTheFlyPrimeTable, CreatePreCalculatedPrimeTable创建待测对象;
2)利用夹具类的Setup(),TearDown()负责待测对象的创建、销毁;
3)利用TEST_P()定义test;
4)利用INSTANTIATE_TEST_SUITE_P初始化作为测试参数的值列表.


tips: TEST_P(test_suite_name, test_name)定义一个test,test_suite_name必须匹配测试夹具名,test_name是自定义test名称.


// This sample shows how to test common properties of multiple
// implementations of an interface (aka interface tests) using
// value-parameterized tests. Each test in the test case has
// a parameter that is an interface pointer to an implementation
// tested.// The interface and its implementations are in this header.
#include "prime_tables.h"
#include "gtest/gtest.h"
namespace {using ::testing::TestWithParam;
using ::testing::Values;// As a general rule, to prevent a test from affecting the tests that come
// after it, you should create and destroy the tested objects for each test
// instead of reusing them.  In this sample we will define a simple factory
// function for PrimeTable objects.  We will instantiate objects in test's
// SetUp() method and delete them in TearDown() method.
typedef PrimeTable* CreatePrimeTableFunc();PrimeTable* CreateOnTheFlyPrimeTable() { return new OnTheFlyPrimeTable(); }template <size_t max_precalculated>
PrimeTable* CreatePreCalculatedPrimeTable() {return new PreCalculatedPrimeTable(max_precalculated);
}// Inside the test body, fixture constructor, SetUp(), and TearDown() you
// can refer to the test parameter by GetParam().  In this case, the test
// parameter is a factory function which we call in fixture's SetUp() to
// create and store an instance of PrimeTable.
class PrimeTableTestSmpl7 : public TestWithParam<CreatePrimeTableFunc*> {public:~PrimeTableTestSmpl7() override { delete table_; }void SetUp() override { table_ = (*GetParam())(); }void TearDown() override {delete table_;table_ = nullptr;}protected:PrimeTable* table_;
};TEST_P(PrimeTableTestSmpl7, ReturnsFalseForNonPrimes) {EXPECT_FALSE(table_->IsPrime(-5));EXPECT_FALSE(table_->IsPrime(0));EXPECT_FALSE(table_->IsPrime(1));EXPECT_FALSE(table_->IsPrime(4));EXPECT_FALSE(table_->IsPrime(6));EXPECT_FALSE(table_->IsPrime(100));
}TEST_P(PrimeTableTestSmpl7, ReturnsTrueForPrimes) {EXPECT_TRUE(table_->IsPrime(2));EXPECT_TRUE(table_->IsPrime(3));EXPECT_TRUE(table_->IsPrime(5));EXPECT_TRUE(table_->IsPrime(7));EXPECT_TRUE(table_->IsPrime(11));EXPECT_TRUE(table_->IsPrime(131));
}TEST_P(PrimeTableTestSmpl7, CanGetNextPrime) {EXPECT_EQ(2, table_->GetNextPrime(0));EXPECT_EQ(3, table_->GetNextPrime(2));EXPECT_EQ(5, table_->GetNextPrime(3));EXPECT_EQ(7, table_->GetNextPrime(5));EXPECT_EQ(11, table_->GetNextPrime(7));EXPECT_EQ(131, table_->GetNextPrime(128));
}// In order to run value-parameterized tests, you need to instantiate them,
// or bind them to a list of values which will be used as test parameters.
// You can instantiate them in a different translation module, or even
// instantiate them several times.
//
// Here, we instantiate our tests with a list of two PrimeTable object
// factory functions:
INSTANTIATE_TEST_SUITE_P(OnTheFlyAndPreCalculated, PrimeTableTestSmpl7,Values(&CreateOnTheFlyPrimeTable,&CreatePreCalculatedPrimeTable<1000>));}  // namespace

小结

3个宏TEST, TEST_F, TEST_P, TYPED_TEST区别:

  • TEST

用于创建最简单的test,定义一个测试函数,在其中可定义任何C++代码并用gtest提供的断言进行检查. 不需要继承任何类.

语法:

TEST(test_suite_name, test_name)

其中,test_suite_name 测试组件名,test_name 测试名.

示例:sample1, sample2, sample4

  • TEST_F

用于创建需要共享测试对象的test,需要搭配自定义test fixture(测试夹具,继承自testing::Test)类使用,用virtual Setup(), TearDown()管理测试对象执行test前的初始化、执行后的清理工作.

TEST_F(test_fixture, test_name)

其中,test_fixture 测试夹具名,test_name 测试名.

示例:sample3, sample5

  • TEST_P

用于参数化test. 允许开发者为同一个test提供多个参数,自动为每个参数生成一个单独的test. 通过INSTANTIATE_TEST_SUITE_P指定数据集,GTest自动为每个数据在运行时生成相应的test并执行.

TEST_P(test_suite_name, test_name)

其中,test_suite_name 测试组件名,需匹配测试夹具名,test_name测试名.

示例:sample7

  • TYPED_TEST

用于类型化test,针对多种类型需要复用同一test的情形. 基于C++模板实现.

TYPED_TEST(CaseName, TestName)

其中,CaseName 用例名,需要匹配测试夹具名,TestName 测试名.

示例:sample6

参考

gtest中TEST和TEST_F和TEST_P的区别是什么

【C++ 单元测试】 GTest 指南:剖析 TEST_P 与 TYPED_TEST

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/891510.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AutoCAD 2024软件下载与安装教程

【AutoCAD 2024软件下载与安装教程】 1-安装包 扫描下方二维码关注「软知社」,后台回复【034】三位数字即可免费获取分享链接,无广告拒绝套路; 安装教程双击Setup.exe安装,弹窗安装对话框安装准备选择我同意,点击下一步选择安装目录,点击下一步默认不勾选,点击安装等待…

Alpine和CSP,最速败北传说

描述 alpine是一个轻量级的响应式框架,但是当我将其写到用户脚本中后,我发现了一些问题。试作解决 下面这个文档中有提到为什么会出现问题。 https://alpinejs.dev/advanced/csp https://github.com/alpinejs/alpine/discussions/1944 https://github.com/alpinejs/alpine/di…

三思万能拉力试验机——驱动高分子材料创新研发的新引擎

一、引言 在当今工业升级与绿色制造的大背景下,高分子材料凭借其轻质、高强、耐腐蚀和环保等优势正被广泛应用于航空航天、汽车、电子、医疗等各个领域。与此同时,高分子材料产品在研发过程中对力学性能、耐久性和环境适应性等方面提出了更高要求。作为研发和质量控制的核心装…

【蓝队】access日志分析

一、access日志常见的目录 IIS 通常情况下,IIS日志文件存储在以下位置:C:\inetpub\logs\LogFiles。在这个目录下,您将看到以日期命名的子文件夹,每个子文件夹对应一个日期。在每个日期的文件夹中,您将找到具体的日志文件,通常以W3SVC开头,后面跟着一个唯一的标识符。Apa…

【蓝队】关于安全告警的正报样本

样本一:命令执行 常见的命令攻击语句 GET /simple/tests/tmssql.php?do=phpinfo GET /detail.php?id=/winnt/system32/cmd.exe?/c+dir+c:%5c GET /cgi/maker/ptcmd.cgi?cmd=;cat+/tmp/config/usr.ini GET /cgi/maker/ptcmd.cgi?cmd=;cat+/etc/passwd攻击语句出现在Get 、…

使用idea的restClient功能

模拟http请求的restClient工具 post请求 get请求:

【蓝队】关于安全告警的误报样本

背景: 一些网站实现存在安全隐患,用户的一些正常流量,也可以被攻击者篡改,直接发起攻击。常见问题:url参数实现时直接传递sql语句 url参数实现时可以传递js脚本 url参数实现时用../进行目录穿越访问文件 url参数实现时直接调用一些系统函数 url参数可以进行域名重定向 系统…

RStudio 2024 软件下载与安装教程

【RStudio 2024 软件下载与安装教程】 1-安装包 扫描下方二维码关注「软知社」,后台回复【033】三位数字即可免费获取分享链接,无广告拒绝套路; 2-安装教程双击R-4.4.2-win.exe安装,弹窗安装对话框选择语言,点击确定点击下一步选择安装目录,选择C盘以外,点击下一步点击…

H3C路由器与Centos8对接L2TP

linux做为LNS 1.安装xl2tpd yum install -y xl2tpd 2.配置文件 vim /etc/xl2tpd/xl2tpd.confvim /etc/ppp/options.xl2tpdvim /etc/ppp/chap-secrets3.启动 systemctl restart xl2tpd.service systemctl enable xl2tpd.service4.添加路由 ip link add name veth1 type veth ip …

DeepSeek开源DeepGEMM:有哪些技术亮点?

近日,DeepSeek再次凭借开源举措惊艳众人,其发布的DeepGEMM,一款开源的FP8通用矩阵乘法库,为AI算力提升开辟了新路径。这已经是他们开源周的第三个项目,前两个是FlashMLA和DeepEP,各有千秋,但DeepGEMM,在我看来,才是真正捅破窗户纸的那一个。本文将深入剖析DeepGEMM的技…

Maple2023软件下载与安装教程

【Maple2023软件下载与安装教程】 1、安装包 扫描下方二维码关注「软知社」,后台回复【032】三位数字即可免费获取分享链接,无广告拒绝套路; 2、安装教程双击setup-windows.exe安装,弹窗安装对话框默认英语版本,点击下一步点击下一步选择I accept ,点击Next选择安装路径…

Lambda表达式的省略规则--java进阶day03

1.省略规则2.流程讲解 主方法中调用useStringhandler,该方法的形参是接口,所以我们要给实现类对象,这里我们使用匿名内部类 use...方法进栈,形参也是变量,接收到匿名内部类(如下图),相当于创建出接口对象,并且重写了方法,最后调用方法3.规则讲解 清楚了流程后,我们以…