Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C++ 项目之Googletest单元测试

C++ 项目之Googletest单元测试

作者头像
公众号guangcity
发布于 2019-09-20 09:41:49
发布于 2019-09-20 09:41:49
4.2K00
代码可运行
举报
文章被收录于专栏:光城(guangcity)光城(guangcity)
运行总次数:0
代码可运行

C++ 项目之Googletest单元测试

1.Clion集成Googletest单元测试

Googletest - Google Testing and Mocking Framework

源码下载地址:

https://github.com/google/googletest/releases

Googletest中包含两个模块,分别是gtest与gmock,需要分别源码编译,编译完后,到指定目录去拷贝includes文件夹与.so文件到下面路径的指定位置.

然后项目中创建ext目录,里面分为两块

  • 第一块:includes

包含gmock与gtest的include文件,对应于gcc -I参数,头文件路径,包含以.h结尾的头文件

  • 第二块:libs

包含gmock与gtest的libs文件,对应gcc -L参数,库文件路径,里面包含的是一些.so或.dll等动态或静态链接库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
├── ext
│   ├── includes
│   │   ├── gmock
│   │   └── gtest
│   └── libs
│       ├── gmock
│       └── gtest

上述本地项目路径配置好后,在CmakeLists.txt中进行配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# ext
set(BASE_INCLUDES ext/includes)
set(BASE_LIBS ext/libs)

# googletest
set(GTEST_INCLUDE_DIR ${BASE_INCLUDES}/gtest/include)
set(GMOCK_INCLUDE_DIR ${BASE_INCLUDES}/gmock/include)
set(GTEST_LINK_DIR ${BASE_LIBS}/gtest/lib/)
set(GMOCK_LINK_DIR ${BASE_LIBS}/gmock/lib/)

# 去哪里找头文件 相当于gcc/clang 中的-I(i的大写字母)参数
include_directories(${GTEST_INCLUDE_DIR})
include_directories(${GMOCK_INCLUDE_DIR})

# 去哪里找库文件 .so .dll .dylib 相当于gcc 中的-L参数
link_directories(${GTEST_LINK_DIR})
link_directories(${GMOCK_LINK_DIR})

然后为每个test配上链接库即可.

例如,现在有个测试file,文件名为:了l1.cpp

那么在CmakeLists.txt中配置为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
add_executable(l1 l1.cpp)
target_link_libraries(l1 gtest gtest_main)  

2.gtest之Helloworld

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main(int argc, char* argv[])
{
    // 接收命令行参数
    testing::InitGoogleTest(&argc, argv);
    vector<int> x={1,2,3,5};
    // EXPECT_EQ使用
    for (int i = 0; i < x.size(); ++i)
    {
        EXPECT_EQ(x[i], 1) << "Vectors x and y differ at index " << i;
    }
    RUN_ALL_TESTS();
  
    return 0;
}

例如上述就是个完整的例子,每次运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
testing::InitGoogleTest(&argc, argv);

然后使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RUN_ALL_TESTS();

运行所有的Test,每个Test编写参考后面断言.

我们看看运行效果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
l1.cpp:113: Failure
Expected equality of these values:
  x[i]
    Which is: 2
  1
Vectors x and y differ at index 1
l1.cpp:113: Failure
Expected equality of these values:
  x[i]
    Which is: 3
  1
Vectors x and y differ at index 2
l1.cpp:113: Failure
Expected equality of these values:
  x[i]
    Which is: 5
  1
Vectors x and y differ at index 3
[==========] Running 0 tests from 0 test cases.
[==========] 0 tests from 0 test cases ran. (0 ms total)
[  PASSED  ] 0 tests.
[  FAILED  ] 0 tests, listed below:

 0 FAILED TESTS

3.gtest初识之断言

关于断言Google包装了一系列EXPECTASSERT的宏,而EXPECT系列和ASSERT系列的区别是:

  • EXPECT 失败时,案例继续往下执行。
  • ASSERT 失败时,直接在当前函数中返回,当前函数中ASSERT后面的语句将不会执行。

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
TEST(ASSERTTest, ASSERT_VS_EXPECT)
{
    ASSERT_TRUE(10<2);  // ASSERT失败,直接在当前函数中返回,后面语句不执行
    ASSERT_FALSE(10<2);
    EXPECT_EQ(6, Foo(310, 18));
}

每个Test是个宏,Test底层源码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name)

对应test_case名与test名.

上述代码中10<2为False,而使用了ASSERT_TRUE,该Test后面所有内容就不会执行,如果换成EXPECT_TRUE则正常运行!

布尔值检查

Fatal assertion

Nonfatal assertion

Verifies

ASSERT_TRUE(condition);

EXPECT_TRUE(condition);

condition is true

ASSERT_FALSE(condition);

EXPECT_FALSE(condition);

condition is false

数值型数据检查

Fatal assertion

Nonfatal assertion

Verifies

ASSERT_EQ(expected,actual);

EXPECT_EQ(expected,actual);

expected == actual

ASSERT_NE(val1,val2);

EXPECT_NE(val1,val2);

val1 != val2

ASSERT_LT(val1,val2);

EXPECT_LT(val1,val2);

val1 < val2

ASSERT_LE(val1,val2);

EXPECT_LE(val1,val2);

val1 <= val2

ASSERT_GT(val1,val2);

EXPECT_GT(val1,val2);

val1 > val2

ASSERT_GE(val1,val2);

EXPECT_GE(val1,val2);

val1 >= val2

字符串检查

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
TEST(StringCmpTest, Demo)
{
    char* pszCoderZh = "CoderZh";
    wchar_t* wszCoderZh = L"CoderZh";
    std::string strCoderZh = "CoderZh";
    std::wstring wstrCoderZh = L"CoderZh";

    EXPECT_STREQ("CoderZh", pszCoderZh);
    EXPECT_STREQ(L"CoderZh", wszCoderZh);

    EXPECT_STRNE("CnBlogs", pszCoderZh);
    EXPECT_STRNE(L"CnBlogs", wszCoderZh);

    EXPECT_STRCASEEQ("coderzh", pszCoderZh);
    //EXPECT_STRCASEEQ(L"coderzh", wszCoderZh);    不支持

    EXPECT_STREQ("CoderZh", strCoderZh.c_str());
    EXPECT_STREQ(L"CoderZh", wstrCoderZh.c_str());
}

其中STREQ和STRNE同时支持char和wchar_t类型的,STRCASEEQSTRCASENE却只接收char*

显示返回成功或失败

直接返回成功:SUCCEED();

返回失败:

Fatal assertion

Nonfatal assertion

FAIL();

ADD_FAILURE();

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 返回成功与否
TEST(ExplicitTest, Demo)
{
    ADD_FAILURE() << "这行打印失败 Sorry"; // None Fatal Asserton,继续往下执行。

    //FAIL(); // Fatal Assertion,不往下执行该案例。
    EXPECT_TRUE(1==2)<<"1==2 failed!";      // 为了验证上述失败后是否执行下面

    SUCCEED();
}

异常检查

分为三个:

EXPECT_NO_THROW(statement); 不抛出异常

EXPECT_ANY_THROW(statement);抛出任意类型异常

EXPECT_THROW(statement, exception_type); 抛出指定类型异常

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
TEST(ExceptionTest,et) {
    // 抛出任意类型异常
    EXPECT_ANY_THROW(10/0); //Expected: 10/0 throws an exception.
    // 抛出指定类型异常
    EXPECT_THROW(1/0,int); //Expected: 1/0 throws an exception of type int.
}

Predicate Assertions

检查一个函数的返回值TRUE还是FALSE时,希望能够输出传入的参数是什么,以便失败后好跟踪

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 预测断言
bool MN(int m, int n)
{
    return m>n;
}
//检查一个函数的返回值TRUE还是FALSE时,希望能够输出传入的参数是什么,以便失败后好跟踪
TEST(PredicateAssertionTest, Demo)
{
    int m = 5, n = 6;
    EXPECT_PRED2(MN, m, n); //只提供<=5个参数  传递参数要与函数MN对应
}

`EXPECT_PRED2(pred2, val1, val2);ASSERT类似.PRED2可以到PRED5

最多支持5个参数.

浮点型检查

EXPECT_FLOAT_EQ(expected, actual)EXPECT_DOUBLE_EQ(expected, actual)

ASSERT类似.

对相近的两个数比较:

EXPECT_NEAR(val1, val2, abs_error);

ASSERT类似.

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 浮点型
TEST(FloatDoubleTest,Demo) {
    ASSERT_DOUBLE_EQ(1.1,1.1);
    EXPECT_FLOAT_EQ(1.2,4.0);
    EXPECT_NEAR(1.234,1.888,0.9);
//    EXPECT_PRED_FORMAT2(testing::FloatLE, val1, val2);
//    EXPECT_PRED_FORMAT2(testing::DoubleLE, val1, val2);
    EXPECT_PRED_FORMAT2(testing::FloatLE,1,0);      // LE表示小于等于 也就是value1<=value2
    EXPECT_PRED_FORMAT2(testing::DoubleLE,0.1,0.2);
}

类型检查

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 类型检查
template <typename T>
class Tt{
public:
    void foo() {
        testing::StaticAssertTypeEq<bool, T>();     // 与下面调用一致就不报错,否则报错
    }
};
TEST(TypeAssertionTest, Demo)
{
    Tt<bool> tt;
    tt.foo();
}

学习参考自:https://www.cnblogs.com/coderzh/archive/2009/04/06/1430364.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 光城 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
美化你的单细胞亚群比例图
最近,郑州大学第一附属医院的史阳同学无私的分享了他对这些基础函数的改造,颜值说不上巅峰,但打败基础函数是没有问题的, 同时也算是抛砖引玉吧,希望广大生信技能树粉丝们都投稿分享自己的创作,投稿请发邮件到 jmzeng1314@163.com
生信技能树
2022/03/03
1.2K0
美化你的单细胞亚群比例图
美化你的单细胞各个亚群特异性高表达基因小提琴图
最近,郑州大学第一附属医院的史阳同学无私的分享了他对这些基础函数的改造,颜值说不上巅峰,但打败基础函数是没有问题的, 同时也算是抛砖引玉吧,希望广大生信技能树粉丝们都投稿分享自己的创作,投稿请发邮件到 jmzeng1314@163.com
生信技能树
2022/03/03
2.8K0
美化你的单细胞各个亚群特异性高表达基因小提琴图
单细胞亚群绝对数量和相对比例的探索
前面我在:单细胞转录组降维聚类分群过滤基因和过滤细胞的区别 介绍了文献,题目为“Revealing the transcriptional heterogeneity of organ-specific metastasis in human gastric cancer using single-cell RNA Sequencing”。通讯作者是浙江大学的范骁辉教授,于2022年发表在Clin Transl Med杂志(IF=10.6),这个胃癌单细胞数据集GSE163558的单细胞转录组在降维聚类分群后,就可以看细胞比例的变化情况。
生信技能树
2024/11/21
1370
单细胞亚群绝对数量和相对比例的探索
单细胞测序—PDA文章复现_单分组(Fig.1_Fig.2)
最近在学习复现Cellular heterogeneity during mouse pancreatic ductal adenocarcinoma progression at single-cell resolution,这篇文章的内容。这里记录下Fig1和Fig2的复现过程。
sheldor没耳朵
2024/09/03
2310
单细胞测序—PDA文章复现_单分组(Fig.1_Fig.2)
文献复现-单细胞揭示新辅助治疗后NSCLC的免疫微环境变化
文章在这:Tumor microenvironment remodeling after neoadjuvant immunotherapy in non-small cell lung cancer revealed by single-cell RNA sequencing 方法:来自3名治疗前和12名接受新辅助PD-1阻断联合化疗的非小细胞肺癌(NSCLC)患者的~92,000个单细胞的转录组。根据病理反应将12个治疗后样本分为两组:MPR(n = 4)和非MPR(n = 8)。
生信菜鸟团
2023/09/09
1.7K0
文献复现-单细胞揭示新辅助治疗后NSCLC的免疫微环境变化
胃癌单细胞数据集GSE163558复现(三):细胞分群注释
Hello小伙伴们大家好,我是生信技能树的小学徒”我才不吃蛋黄“。今天是胃癌单细胞数据集GSE163558复现系列第三期。第二期我们走了Seurat V5标准流程,利用harmony整合去批次后,按标准流程进行了降维聚类分群。本期,我们将在第二期基础上选择合适的分辨率,对细胞亚群进行注释。
生信技能树jimmy
2024/06/25
1.2K1
胃癌单细胞数据集GSE163558复现(三):细胞分群注释
细胞亚群细分的时候仍然是要选择harmony等算法去除样品差异
然后绝大部分文章都是抓住免疫细胞亚群进行细分,包括淋巴系(T,B,NK细胞)和髓系(单核,树突,巨噬,粒细胞)的两大类作为第二次细分亚群。说起来很简单,但是实际上每次做到单细胞数据集的细分亚群就非常的头疼,尤其是myeloid的髓系,(单核,树突,巨噬,粒细胞)有时候根本就分不清楚,而且分完之后仍然是可以继续细分。
生信技能树
2021/07/06
1.8K0
单细胞——从降维聚类分群、细胞命名、到批量富集分析,一文打通GSE104154博来霉素小鼠模型单细胞数据
注意:这个数据使用了ensemble id作为基因名,后续需要换为gene symbol
生信菜鸟团
2023/09/09
3.4K0
单细胞——从降维聚类分群、细胞命名、到批量富集分析,一文打通GSE104154博来霉素小鼠模型单细胞数据
接之前推文复现--关于细胞亚群注释的问题
文献复现及简介—胰腺癌的单细胞水平肿瘤异质性 https://mp.weixin.qq.com/s/gWz-Jl5baz4vRUjhLrYN7Q
生信菜鸟团
2023/09/08
4550
接之前推文复现--关于细胞亚群注释的问题
scRNA分析|单细胞文献Fig1中的分组umap图和细胞比例柱形图
类似2021年CELL 文章Single-cell landscape of the ecosystem in early-relapse hepatocellular carcinoma,单细胞文献的Fig1一般会有细胞类型的全局umap图,分样本 和 分组的umap图 ,以及分样本 和 分组的细胞类型比例柱形图。
生信补给站
2022/11/11
7.5K0
scRNA分析|单细胞文献Fig1中的分组umap图和细胞比例柱形图
单细胞实战之样本整理,细胞注释和部分图表绘制---从入门到进阶(初级篇1)
在完成了马拉松课程后,我们应该对单细胞分析有了基本了解。接下来,我们将开启新的篇章——单细胞实战:从入门到进阶。
凑齐六个字吧
2025/02/08
2050
单细胞实战之样本整理,细胞注释和部分图表绘制---从入门到进阶(初级篇1)
单细胞文章复现-抗PD-1免疫治疗联合雄激素剥夺治疗可诱导转移性去势敏感前列腺癌的强免疫浸润
首先下载数据 https://data.mendeley.com/datasets/5nnw8xrh5m/1
生信菜鸟团
2023/12/12
3960
单细胞文章复现-抗PD-1免疫治疗联合雄激素剥夺治疗可诱导转移性去势敏感前列腺癌的强免疫浸润
除了SPP1+Macro,还有其他亚型可分析吗?看看Cell杂志分析组织驻留FOLR2+巨噬细胞
这个气泡图展示了一些常见的细胞marker基因在四个亚群中的表达模式特征,也是单细胞数据分析中常用的图:
生信技能树
2025/03/28
1220
除了SPP1+Macro,还有其他亚型可分析吗?看看Cell杂志分析组织驻留FOLR2+巨噬细胞
一篇单细胞文献复现及代码部分更新
https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE151177
生信菜鸟团
2023/12/14
1.7K0
一篇单细胞文献复现及代码部分更新
GSE163558单细胞数据处理流程分享
https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE163558 ,GEO数据库搜索GEO数据号,下载并整理成Seurat所需的格式。
生信医道
2025/02/06
2120
GSE163558单细胞数据处理流程分享
这也能画?
其实就是一个单细胞的降维聚类分群,特殊之处在于它出现了一个能被人类想象力丰富起来的造型,所以就有了左边他们全体实验室自己摆pose并且着装不同颜色衣服的模拟。
生信技能树
2021/11/04
5970
这也能画?
【单细胞中性粒】慢性病毒性肝炎(复现fig1)
这里我画的确实不咋美观呢【此外,似乎原文的marker不是按照top基因来选的?】
生信菜鸟团
2024/06/11
1200
【单细胞中性粒】慢性病毒性肝炎(复现fig1)
中性粒细胞的质量值到底是多低呢?
今天来看看一篇文献中使用BD单细胞测序技术,鉴定到的一大群中性粒细胞,这就来分析看看!多一点对中性粒细胞的实际认知~
生信技能树
2025/04/11
580
中性粒细胞的质量值到底是多低呢?
学徒单细胞作业:敲除Dnmt1基因对小鼠肺部发育的影响
另外,前两天在《生信技能树》和《单细胞天地》等公众号都推出来了一个10X单细胞转录组钜惠套餐,详见:2个分组的单细胞项目标准分析,原价15~20万的6个10x单细胞转录组套餐,现价10万。其实本文介绍的就是:敲除Dnmt1基因前后分组的两个单细胞转录组数据分析。
生信技能树
2021/11/23
9490
单细胞水平这样的细胞比例变化可靠吗
更麻烦的是因为文献里面的两个分组每个组内都是3个样品而已,而文章大家结论缺依赖于这个单细胞水平的细胞比例变化。其实早期(2018-2021时候)单细胞转录组费用居高不下,所以绝大部分情况下大家做两个分组,每个组内也就是三五个样品而已。这样的话两个分组之间的不同单细胞亚群的比例差异其实往往是需要最后使用流式细胞等价格相对低廉的实验技术去扩大样品队列去验证一下。
生信技能树
2024/01/18
2290
单细胞水平这样的细胞比例变化可靠吗
推荐阅读
相关推荐
美化你的单细胞亚群比例图
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验