Google单元测试框架gtest之官方sample笔记3--值参数化测试

news2024/11/24 17:15:51

1.7 sample7--接口测试

值参数不限定类型,也可以是类的引用,这就可以实现对类接口的测试,一个基类可以有多个继承类,那么可以测试不同的子类功能,但是只需要写一个测试用例,然后使用参数列表实现对每个子类的测试。

使用值参数测试法去测试多个实现了相同接口(类)的共同属性(又叫做接口测试)

using ::testing::TestWithParam;
using ::testing::Values;
​
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(1));
  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:
#define INSTANTIATE_TEST_SUITE_P INSTANTIATE_TEST_CASE_P
INSTANTIATE_TEST_SUITE_P(OnTheFlyAndPreCalculated, PrimeTableTestSmpl7,
                         Values(&CreateOnTheFlyPrimeTable,
                                &CreatePreCalculatedPrimeTable<1000>));

1.8sample8--值参数测试

有些时候,我们需要对代码实现的功能使用不同的参数进行测试,比如使用大量随机值来检验算法实现的正确性,或者比较同一个接口的不同实现之间的差别。gtest把“集中输入测试参数”的需求抽象出来提供支持,称为值参数化测试(Value Parameterized Test)。

参数值序列生成函数含义
Bool()生成序列 {false, true}
Range(begin, end[, step])生成序列 {begin, begin+step, begin+2*step, ...} (不含 end), step默认为1
Values(v1, v2, ..., vN)生成序列 {v1, v2, ..., vN}
ValuesIn(container)ValuesIn(iter1, iter2)枚举STL container,或枚举迭代器范围 [iter1, iter2)
Combine(g1, g2, ..., gN)生成 g1g2, ..., gN的笛卡尔积,其中g1g2, ..., gN均为参数值序列生成函数(要求C++0x的<tr1/tuple>

代码实现

class HybridPrimeTable : public PrimeTable {
 public:
  HybridPrimeTable(bool force_on_the_fly, int max_precalculated)
      : on_the_fly_impl_(new OnTheFlyPrimeTable),
        precalc_impl_(force_on_the_fly
                          ? nullptr
                          : new PreCalculatedPrimeTable(max_precalculated)),
        max_precalculated_(max_precalculated) {}
  ~HybridPrimeTable() override {
    delete on_the_fly_impl_;
    delete precalc_impl_;
  }
​
  bool IsPrime(int n) const override {
    if (precalc_impl_ != nullptr && n < max_precalculated_)
      return precalc_impl_->IsPrime(n);
    else
      return on_the_fly_impl_->IsPrime(n);
  }
​
  int GetNextPrime(int p) const override {
    int next_prime = -1;
    if (precalc_impl_ != nullptr && p < max_precalculated_)
      next_prime = precalc_impl_->GetNextPrime(p);
​
    return next_prime != -1 ? next_prime : on_the_fly_impl_->GetNextPrime(p);
  }
​
 private:
  OnTheFlyPrimeTable* on_the_fly_impl_;
  PreCalculatedPrimeTable* precalc_impl_;
  int max_precalculated_;
};
​
using ::testing::TestWithParam;
using ::testing::Bool;
using ::testing::Values;
using ::testing::Combine;
​
// To test all code paths for HybridPrimeTable we must test it with numbers
// both within and outside PreCalculatedPrimeTable's capacity and also with
// PreCalculatedPrimeTable disabled. We do this by defining fixture which will
// accept different combinations of parameters for instantiating a
// HybridPrimeTable instance.
class PrimeTableTest : public TestWithParam< ::std::tuple<bool, int> > {
 protected:
  void SetUp() override {
    bool force_on_the_fly;
    int max_precalculated;
    std::tie(force_on_the_fly, max_precalculated) = GetParam();
    table_ = new HybridPrimeTable(force_on_the_fly, max_precalculated);
  }
  void TearDown() override {
    delete table_;
    table_ = nullptr;
  }
  HybridPrimeTable* table_;
};

PrimeTableTest类继承于TestWithParam,是测试固件类。接收参数tuple<bool,int>,如果bool为true时,使用OnTheFlyPrimeTable类的接口,当bool变量为false时,使用PreCalculatedPrimeTable接口测试。

测试编写:

TEST_P(PrimeTableTest, 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(PrimeTableTest, 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(PrimeTableTest, 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));
}
​
​
#define INSTANTIATE_TEST_SUITE_P INSTANTIATE_TEST_CASE_P
INSTANTIATE_TEST_SUITE_P(MeaningfulTestParameters, PrimeTableTest,
                         Combine(Bool(), Values(1, 10)));

共计3个测试case,测试名为MeaningfulTestParameters,输入的参数是一个comine类,生成正交参数集合:

Combine(Bool(), Values(1, 10)));
//  Combine() allows the user to combine two or more sequences to produce
//            values of a Cartesian product of those sequences' elements. 
/*
 |--Bool--|--------- Value---------|
 |        |    1      |     10     |
 |  true  | (true,1)  | (true,10)  |
 | false  | (false,1) | (false,10) |
*/

本例有3个测试,参数正交后是4组参数,每组参数运行一次测试,所以输出12个测试结果。运行截图如下。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

m基于可见光通信系统的RFID接口过程以及ALOHA防碰撞算法的matlab仿真

目录 1.算法描述 2.matlab算法仿真效果 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 射频识别技术(Radio Frequency Identification&#xff0c;RFID)是一种非接触式自动识别技术&#xff0c;与传统的识别方式相比&#xff0c;它无需直接接触、无需光学可视、无需人工干预即…

产品经理的七大定律的总结

最近学习了产品经理的七大定律&#xff0c;这些设计准则都基于人类心理学&#xff1a;人们如何感知、学习、推理、记忆&#xff0c;以及把意图转换为行动。 1、菲茨&#xff08;Paul Fitt&#xff09;定律 菲茨定律的对于产品设计时的启示&#xff1a; 1&#xff09;按钮等可…

SpringBoot 3.0 新特性,内置声明式HTTP客户端

http interface 从 Spring 6 和 Spring Boot 3 开始&#xff0c;Spring 框架支持将远程 HTTP 服务代理成带有特定注解的 Java http interface。类似的库&#xff0c;如 OpenFeign 和 Retrofit 仍然可以使用&#xff0c;但 http interface 为 Spring 框架添加内置支持。 什么是…

steam deck科普、上手教程及模拟器配置指南

steam_deck前言 早在2021年得时候&#xff0c;坊间就开始流传steam deck这个东西要问世了。但是中途跳了几次票&#xff0c;直到2022年2月&#xff0c;第一批steam deck才正式面向大众玩家。在熟悉steam deck之前&#xff0c;我们有必要了解如下的知识: Steam 准确来说&…

G1D27-deberta右键创建md文档

回家啦&#xff01;&#xff01;&#xff01;中午的炒饭太好吃了&#xff01;&#xff01;吃的好撑&#xff01;&#xff01;回家后和mm去了超市&#xff0c;买了冰淇淋、薯片和水果&#xff0c;好开心&#xff01;&#xff01;&#xff01; 下午睡了一会觉&#xff0c;真的好舒…

Spring MVC处理用户请求的完整流程

Spring MVC 框架是高度可配置的&#xff0c;包含多种视图技术&#xff0c;例如 JSP 技术、Velocity、Tiles、iText 和 POI。 Spring MVC 框架并不关心使用的视图技术&#xff0c;也不会强迫开发者只使用 JSP 技术&#xff0c;但教程中使用的视图是 JSP&#xff0c;本节主要介绍…

猿如意 | 带你手把手安装 Visual Studio Code

目录 一、什么是猿如意 二、借助猿如意安装Visual Studio Code 1、安装猿如意 2、安装Visual Studio Code 三、总结 一、什么是猿如意 猿如意是CSDN推出来的一款面向开发者的工具&#xff0c;他能够帮助开发者&#xff0c;找到自己心仪的开发工具提高自己的开发效率。 目标…

华为云两台机器内网互联

文章目录1. 前言2. ping公网ip3. 不同账号需要在同一大区4. 创建虚拟私有云5. 更换服务器所属的VPC网段6. 创建对等连接7. 填写对端项目ID和对端VPC ID8. 配置对等连接9. 添加对等连接路由10. 测试是否联通11. 后记1. 前言 最近在华为云买了两台低配Linux机器&#xff0c;35一…

聚焦出海 长城汽车50多国家和地区经销商集团齐聚泰国车博会

11月30日&#xff0c;长城汽车携新能源豪华阵容登陆第39届泰国国际汽车博览会&#xff08;简称“泰国车博会”&#xff09;。以“GWM Light the Future”&#xff08;长城汽车点亮未来&#xff09;为参展主题&#xff0c;长城汽车旗下中大型商务豪华SUV坦克500 HEV量产版、欧拉…

[附源码]Python计算机毕业设计SSM留守儿童管理平台(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

英文Paper写作如何正确掌握质量情况?

在国外留学的学子们要想完成高质量高水平的作业&#xff08;assignment与Paper&#xff09;&#xff0c;那么首先就要在心里想想这些基本必要的问题&#xff0c;等有了这些问题的轮廓之后&#xff0c;相信留学的朋友都能够写出满意自足的Paper或assignment。 1&#xff0e;Why …

TypeError: can only concatenate list (not “int“) to list

参考 TypeError: can only concatenate list (not "int") to list - 云社区 - 腾讯云 观察是否将列表和非列表的类型相连。 入队enqueue_op 5会报错&#xff0c;改成乘5就不会了。

Springboot整合策略模式概念->使用场景->优缺点->企业级实战

一、前言 策略模式可能是在工作中使用最多的&#xff0c;也是在面试中最常提到的&#xff0c;代码重构和优化的必备&#xff01; 小编之前也是一直说&#xff0c;其实没有真正的实战&#xff1b;最近有了机会实战了一下&#xff0c;来分享一下使用心得和在企业级的使用&#x…

Mac装机清理工具CleanMyMac2022最新版功能介绍

从最初开始下载CleanMyMac开始&#xff0c;CMM一直在提供智能的清理&#xff0c;从颇受小白用户喜爱的自动清理特性开始&#xff0c;仅需一键即可快速而安全地清理系统各角落垃圾&#xff0c;释放宝贵硬盘空间&#xff0c;CMM或许可以说是是 Mac上最知名的系统清理工具了。 Cl…

java EE初阶 —— 线程的安全问题

文章目录1.线程安全1.1 代码体现线程的不安全1.2 线程安全问题分析1.3 产生线程安全问题的原因1.4 线程安全问题的解决办法1.5 synchronized 的使用方法1.线程安全 多线程的抢占式执行&#xff0c;带来的随机性是线程安全问题的罪魁祸首&#xff0c;万恶之源。 如果没有多线程…

国内表格软件-FineReport Count函数

1. 概述 1.1 函数作用 计算数组或数据区域中所含项的个数&#xff0c;例如统计「地区数」和「销售员个数」&#xff0c;如下图所示&#xff1a; 也可与其他函数嵌套使用&#xff0c;例如进行「条件计数」&#xff0c;计算除孙林以外的销售员个数&#xff0c;如下图所示&#x…

Lactoferrin-PEG-alginate 乳铁蛋白-聚乙二醇-海藻酸钠

产品名称&#xff1a;乳铁蛋白-聚乙二醇-海藻酸钠 英文名称&#xff1a;Lactoferrin-PEG-alginate 纯度&#xff1a;95% 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 外观:固体或粘性液体&#xff0c;取决于分子量 PEG分子量可选&#xff1a;350、550、750、1k、…

VBA驱动SAP GUI自动化:查找页面元素FindAllByName

我们在VBA中嵌入SAP原生的【脚本录制与回放】功能生成的VBS脚本&#xff0c;可以实现很多自动化操作。但只有我们对SAP做了一系列动作&#xff0c;才会得到这些动作的脚本。然而&#xff0c;一旦我们需要用代码提前做一些判断&#xff0c;然后再决定后续的动作时&#xff0c;这…

MBR主引导记录

主引导记录&#xff08;Master Boot Record&#xff0c;缩写&#xff1a;MBR&#xff09;&#xff0c;又叫做主引导扇区&#xff0c;是计算机开机后访问硬盘时所必须要读取的首个扇区&#xff0c;它在硬盘上的三维地址为&#xff08;柱面&#xff0c;磁头&#xff0c;扇区&…

基于ARM的环境参数检测系统设计(Labview+STM32+ZigBee)

目 录 1 绪论 1 1.1 研究背景和意义 1 1.2 研究现状 2 1.3 研究内容 3 2 系统概述和相关原理 4 2.1 系统的功能分析与设计 4 2.2 LabVIEW介绍 5 2.3 ZigBee技术 5 2.3.1 ZigBee技术概述 5 2.3.2 ZigBee网络协议 6 2.3.3 ZigBee网络拓扑结构 7 2.4 GSM技术 8 2.5 本章小结 8 3 …