googletest:sample1分析

news/2025/2/27 16:42:34/文章来源:https://www.cnblogs.com/fortunely/p/18741214

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

待测文件

sample1 包含2个功能:

  1. Factorial: 求n!;
  2. IsPrime: 判断n是否为素数.

sample1.h

// Returns n! (the factorial of n).  For negative n, n! is defined to be 1.
int Factorial(int n);// Returns true if and only if n is a prime number.
bool IsPrime(int n);

sample1.cc

#include "sample1.h"// Returns n! (the factorial of n).  For negative n, n! is defined to be 1.
int Factorial(int n) {int result = 1;for (int i = 1; i <= n; i++) {result *= i;}return result;
}// Returns true if and only if n is a prime number.
bool IsPrime(int n) {// Trivial case 1: small numbersif (n <= 1) return false;// Trivial case 2: even numbersif (n % 2 == 0) return n == 2;// Now, we have that n is odd and n >= 3.// Try to divide n by every odd number i, starting from 3for (int i = 3;; i += 2) {// We only have to try i up to the square root of nif (i > n / i) break;// Now, we have i <= n/i < n.// If n is divisible by i, n is not prime.if (n % i == 0) return false;}// n has no integer factor in the range (1, n), and thus is prime.return true;
}

测试文件

sample1_unittest.cc

#include "sample1.h"#include <limits.h>#include "gtest/gtest.h"
namespace {// Tests Factorial().// Tests factorial of negative numbers.
TEST(FactorialTest, Negative) {// This test is named "Negative", and belongs to the "FactorialTest"// test case.EXPECT_EQ(1, Factorial(-5));EXPECT_EQ(1, Factorial(-1));EXPECT_GT(Factorial(-10), 0);// <TechnicalDetails>//// EXPECT_EQ(expected, actual) is the same as////   EXPECT_TRUE((expected) == (actual))//// except that it will print both the expected value and the actual// value when the assertion fails.  This is very helpful for// debugging.  Therefore in this case EXPECT_EQ is preferred.//// On the other hand, EXPECT_TRUE accepts any Boolean expression,// and is thus more general.//// </TechnicalDetails>
}// Tests factorial of 0.
TEST(FactorialTest, Zero) { EXPECT_EQ(1, Factorial(0)); }// Tests factorial of positive numbers.
TEST(FactorialTest, Positive) {EXPECT_EQ(1, Factorial(1));EXPECT_EQ(2, Factorial(2));EXPECT_EQ(6, Factorial(3));EXPECT_EQ(40320, Factorial(8));
}// Tests IsPrime()// Tests negative input.
TEST(IsPrimeTest, Negative) {// This test belongs to the IsPrimeTest test case.EXPECT_FALSE(IsPrime(-1));EXPECT_FALSE(IsPrime(-2));EXPECT_FALSE(IsPrime(INT_MIN));
}// Tests some trivial cases.
TEST(IsPrimeTest, Trivial) {EXPECT_FALSE(IsPrime(0));EXPECT_FALSE(IsPrime(1));EXPECT_TRUE(IsPrime(2));EXPECT_TRUE(IsPrime(3));
}// Tests positive input.
TEST(IsPrimeTest, Positive) {EXPECT_FALSE(IsPrime(4));EXPECT_TRUE(IsPrime(5));EXPECT_FALSE(IsPrime(6));EXPECT_TRUE(IsPrime(23));
}
}  // namespace

对于函数Factorial的测试,定义了测试组件FactorialTest,而每个测试用例对应一个名称. 分别有:

  • Negative: 代表输入的n为负数;
  • Zero:代表输入的n为0;
  • Positive:代表输入的n为正数.

数据检查:

EXPECT_EQ(1, Factorial(-5)); 断言值相等,相当于非致命的assert 1 == Factorial(-5).
EXPECT_GT(Factorial(-10), 0); 断言大小,相当于非致命的assert Factorial(-10) > 0. "<"断言用EXPECT_LT.

对于函数IsPrime的测试,定义了组件IsPrimeTest,每个测试用例对应一个名称,可与FactorialTest组件的测试用例名同名. 分别有:

  • Negative: 代表输入的n为负数;
  • Trivial: 简单的用例,通常是验证代码基本功能和边界条件;
  • Positive:代表输入的n为正数.

小结

TEST用于用户定义测试函数,一个TEST(TestSuiteName, TestName)代表一个测试用例,TestSuiteName表示测试组件名,TestName表示测试用例名TestName. 每个测试用例,都归属一个测试组件;一个测试组件,通常包含多个测试用例.

注意:
1)用户定义的TestSuiteNameTestName都不应当包含下划线("_");
2)googletest 保证用户定义的测试函数只执行一次;
3)用户编写的测试,其测试结果不应依赖于测试顺序.

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

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

相关文章

HTTP协议与RESTful API实战手册(二):用披萨店故事说透API设计奥秘

title: HTTP协议与RESTful API实战手册(二):用披萨店故事说透API设计奥秘 🍕 date: 2025/2/27 updated: 2025/2/27 author: cmdragon excerpt: 📦 本系列第二篇通过披萨店创业的完整案例,手把手教你: 用外卖订单理解HTTP协议细节 5个RESTful设计常见误区与修正方案 …

全局注册svg批量自动引入,动态修改svg以及样式配置问题

1.安装依赖npm i vite-plugin-svg-icons2.文件存放svg 3.全局组件svg-icon(直接放到全局组件目录下)<template><svg class="svg-icon"><use :xlink:href="`#icon-${props.name}`" class="mySVG":style="stroke: + props.…

msyql中单表语句

二、聚合函数 (1)max 最小值 select max(math) from student (2)min 最大值 select min(math) from student (3)sum 总数 select sum(math) from student (4)avg平均数 select avg(math) from student (5)count 统计个数 select count(math) from stu…

Java SpringBoot实现简易扫码登录流程 附项目代码

SpringBoot实现简易扫码登录流程,附项目代码先总结流程:移动端请求扫码登录,服务端生成二维码并缓存二维码ID和状态,将二维码的Base64格式返回给前端展示; PC端页面轮询检查二维码状态; 手机扫码后调用扫码接口,携带移动端的Token和二维码ID请求服务端,服务端根据扫码的…

Salesforce宣布2025年不招工程师,技术岗位真的会消失吗?

Salesforce CEO Marc Benioff 最近放出了一条让科技圈热议的消息:2025年,Salesforce将不再招聘新的软件工程师。作为全球最大的CRM软件提供商之一,这一决定引发了许多人对AI对就业市场影响的思考。 AI改变工作模式,工程师岗位需求减少 Marc Benioff 在采访中透露,2024年,…

mysql查询语句

一、查询语句 1、select查询一个表中的所有数据 格式: select * from 表名 ; 案例: select * from student ;2、查询部分字段信息数据 格式: select 字段1,字段2 from 表名; 案例: select name,math from student;3、查询字段可以用as 取别名 格式: select 字…

Vue3安装配置+VSCode开发环境搭建,超详细保姆级教程(图文)

目录1. node.js 下载安装2. 查看 node.js 是否安装成功3. 配置 npm 下载的默认安装、缓存环境(1) 添加文件夹(2) 设置系统环境变量(3) 修改下载模块的存放路径4. npm 镜像源配置(1) 输入cmd打开命令提示符窗口,(2) 如果配置报错(3) 查看镜像配置是否成功5. 安装 vue-cli 工具6.…

Windows下Redis哨兵模式配置以及在.NetCore中使用StackExchange.Redis连接哨兵

一,Redis哨兵模式配置 1,下载Redis,然后解压复制5个文件夹分别如下命名。 2,哨兵模式配置 (1)修改主节点Redis-6379中redis.windows.conf配置文件如下 (2)修改从节点Redis-6380中redis.windows.conf配置文件如下(3)配置哨兵,在哨兵文件夹下添加Sentinel.conf配置文件…

zabbix监控http

一、模版复制与配置变更 1、模版复制2、修改宏 全克隆并修改好宏端口二、测试httpd服务状态 1、检查模块是否启用 apachectl -M | grep status修复 #ServerName www.example.com:80 ServerName 192.168.0.152:13000 重新执行后正常2、检查状态 http://112.81.86.33:13001/serve…

Ubuntu 22.04 或更高版本的系统中安装.NET Core 3.1的解决方案(使用1panel进行可视化演示)

第一步:先安装长期支持版本.NET 6 或更高 (这一步不是必须的,如果是干净的服务器建议这么做,因为安装完后会自动创建路径和环境变量方便后续操作)安装方法sudo apt update sudo apt install -y dotnet6如果安装时出现异常:A fatal error occurred. The folder [/usr/lib/dot…

考古新视野:LiDAR 揭开雨林下的玛雅古城!

一、当科技遇见文明:LiDAR 的考古革命茂密的雨林曾是考古学家的噩梦——藤蔓缠绕的树冠遮蔽了地面,人力勘探耗时费力,无数古代遗迹深藏其中。然而,激光雷达(LiDAR)技术的出现,如同一把“数字X光刀”,穿透了雨林的绿色屏障,将玛雅文明的失落之城从历史的尘埃中重新点亮…

mysql知识面试day2

mysql具有哪些锁 按锁的粒度分配:行级锁,表级锁,页级锁。mvcc的实现原理 MVCC--一份数据保留多个版本的一种方式,查询时通过readview和版本链获得对应版本的数据 好处:提升并发性能,对于高并发场景,mvcc比行级锁开销更小 实现原理 MVCC的实现依赖于版本链,版本链具有三个隐…