Google test使用
gtest 参数
Google Test (gtest) 是一个广泛使用的C++ 测试框架。
在使用gtest 时,可以通过命令行参数来控制测试的执行方式和输出。
以下是一些常用的gtest 命令行参数:--gtest_filter=POSTIVE_PATTERNS[-NEGATIVE_PATTERNS]:只运行与POSITIVE_PATTERNS 匹配但与NEGATIVE_PATTERNS 不匹配的测试。
例如,--gtest_filter=*:-DisabledTests 将运行除了DisabledTests 之外的所有测试。
--gtest_also_run_disabled_tests:运行所有测试,包括被标记为DISABLED 的测试。
--gtest_repeat=N:重复运行所有测试N 次。
--gtest_break_on_failure:在第一个失败的测试中暂停。
这在调试时非常有用。
--gtest_catch_exceptions=0:禁用gtest 对C++ 异常的捕获。
默认情况下,gtest 会捕获并报告未捕获的异常。
--gtest_output=xml[:DIRECTORY_PATH/|:FILE_PATH]:生成XML 格式的测试结果输出。
如果指定了DIRECTORY_PATH,gtest 将在该目录下为每个测试套件创建一个XML 文件。
如果指定了FILE_PATH,gtest 会将所有测试结果写入一个XML 文件。
--gtest_list_tests:列出所有测试的名称,而不实际运行它们。
--gtest_print_time:在测试结果中显示每个测试的运行时间。
--gtest_throw_on_failure:当测试失败时,抛出一个异常而不是返回失败状态码。
--gtest_shuffle:随机运行测试用例的顺序。
这有助于发现潜在的测试间依赖关系。
--gtest_shuffle_seed=NUMBER:设置随机种子,以便在多次运行之间重现随机化的测试用例顺序。
googletest测试框架使用教程
1 在 VS2008 中使用 GOOGLETEST ..........................................................................................................2
1.1 下载 .................................................................................................................................................. 2 1.2 编译 GTEST 库 .................................................................................................................................... 2
2 GOOGLETEST 教程 ...............................................................................................................................8
2.1 断言 .................................................................................................................................................. 8 2.1.1 示例 ............................................................................................................................................. 8 2.1.2 分类 ............................................................................................................................................. 9
利用googletest与QTest进行GUI测试
利用googletest与QTest进行GUI测试利用google test 与QTest进行GUI 测试分类: Qt 2009-11-10 15:29 926人阅读评论(0) 收藏举报利用google test 与QTest进行GUI 测试Jingwenlai 2009-11-10Google test写测试用例非常方便,而且相对于QTest来说,提供了更多的比较宏,但其并未提供测试GUI的方法,相反,Qt Test lib 虽然仅提供了QCOMPARE等少数的宏,但QtTest提供了诸如keyClick,keyClicks,mouseClicks,mouseClick等模拟UI行为的测试方法。
可以将两者结合起来对QT的GUI程序进行测试,同时,也能够利用Google Test的便利性来写测试程序。
please refer to QtAssitant.exe for more informations about QtTest lib.下面是一个示例程序这个示例完成如下功能,根据用户的输入对显示的值进行增减。
执行了五个测试,其中一个是初始化测试,另外两个是正常情况的测试,还有两种情况是极端情况的测试。
以下是测试代码/**T esting Code;*/#ifndef TEST_PANELITEM_HPP#define TEST_PANELITEM_HPP#include <gtest/gtest.h>#include "PanelItem.h"#include <QtTest/QtTest> //for testing Gui#include <QString>class GPanelItemTest : public ::testing::Test{protected:virtual void SetUp(){panelItem = new GPanelItem();}virtual void TearDown(){delete panelItem;}GPanelItem * panelItem;};TEST_F(GPanelItemTest,testInit){}//GUI testing using QtTestTEST_F(GPanelItemTest,testIncButton){panelItem->reset();QTest::mouseClick(panelItem->getIncreaseButton(),Qt::LeftB utton);QCOMPARE(panelItem->getNumLabel()->text(),QString("1" ));}TEST_F(GPanelItemTest,testDescButton){panelItem->setValue(1);QCOMPARE(panelItem->getNumLabel()->text(),QString("1" ));QTest::mouseClick(panelItem->getDecreaseButton(),Qt::Left Button);QCOMPARE(panelItem->getNumLabel()->text(),QString("0" ));}TEST_F(GPanelItemTest,testIncButtonEdge){panelItem->setValue(9);QTest::mouseClick(panelItem->getIncreaseButton(),Qt::LeftB utton);QCOMPARE(panelItem->getNumLabel()->text(),QString("9" ));}TEST_F(GPanelItemTest,testDescButtonEdge){panelItem->setValue(0);QTest::mouseClick(panelItem->getDecreaseButton(),Qt::Left Button);QCOMPARE(panelItem->getNumLabel()->text(),QString("0" ));}#endif//PenalItem 类:#ifndef PANELITEM_H#define PANELITEM_H#include <QWidget>#include <QHBoxLayout>#include <QVBoxLayout>#include <QPushButton>#include <QLabel>#include <QObject>class GPanelItem : public QWidget{Q_OBJECTpublic:GPanelItem(QWidget * parent = 0) : QWidget(parent){increaseButton = new QPushButton(QString(tr("<")),this);QObject::connect(increaseButton,SIGNAL(clicked()),this,SLO T(increaseNum()));decreaseButton = new QPushButton(QString(tr(">")),this);QObject::connect(decreaseButton,SIGNAL(clicked()),this,SLO T(decreaseNum()));value = 0;numLabel = new QLabel();numLabel->setNum(value);}~GPanelItem(){delete increaseButton;delete decreaseButton;delete numLabel;}public:void reset(){setValue(0);}void setValue(int value){this->value = value;numLabel->setNum(value);}private slots:void increaseNum(){if(value < 9)value++;numLabel->setNum(value);}void decreaseNum(){if(value > 0)value--;numLabel->setNum(value);}public:QPushButton * getIncreaseButton() { return increaseButton; }QPushButton * getDecreaseButton() { return decreaseButton; }QLabel * getNumLabel() { return numLabel; }private:QPushButton* increaseButton;QPushButton* decreaseButton;QLabel * numLabel;private:int value;};#endif//主程序#include <QApplication>#include "PanelItem.hpp"#include <gtest/gtest.h>#include "test.hpp"int main(int argc,char ** argv){QApplication app(argc,argv);::testing::InitGoogleTest(&argc,argv);RUN_ALL_TESTS();GPanelItem * panelItem = new GPanelItem();panelItem->show();return app.exec();}对应的CMakeLists.txt 如下:project(QViewpad)cmake_minimum_required(VERSION 2.6)set(SOURCES main.cpp PanelItem.cpp)set(HEADERS PanelItem.hpp)find_package(Qt4 COMPONENTS QtTest QtGui QtCore REQUIRED)if(QT4_FOUND)include(${QT_USE_FILE})endif()qt4_wrap_cpp(GPanelItem_Moc PanelItem.hpp)add_executable(viewpad ${SOURCES} ${GPanelItem_MOC}) target_link_libraries(viewpad ${QT_LIBRARIES} gtest gtest_main)。
一种c++单元测试用例自动生成方法
自动生成 C++ 单元测试用例的方法有很多,其中一种比较常见的方式是使用测试
框架(例如 Google Test)结合代码生成工具(例如 Google Test 的代码生成工具gtestgen 或者其他工具)。
以下是使用 Google Test 和 gtestgen 自动生成 C++ 单元测试用例的一般步骤:
1. 安装 Google Test 和 gtestgen:
首先,确保你的项目中已经集成了 Google Test。
你可以从 Google Test 的 GitHub
页面下载源代码,然后编译和安装。
同时,你也可以使用包管理工具,如CMake、vcpkg 等,来方便地安装 Google Test。
2. 定义被测试的代码:
在你的 C++ 项目中,先定义需要进行单元测试的函数或类。
3. 使用 gtestgen 生成测试用例:
运行 gtestgen 命令,指定被测试的源文件和头文件,它会自动生成测试用例代码。
4. 查看生成的测试用例代码:
gtextgen 将在当前目录下生成一个以_test.cpp结尾的文件,包含生成的测试用例代码。
5. 编译并运行测试:
将生成的测试用例代码添加到你的测试项目中,然后使用你的构建工具(例如CMake、Makefile、Visual Studio 等)编译并运行测试。
6. 检查测试结果:
查看测试结果,确保你的代码在各种情况下都能正确运行。
这种方法的优点是自动生成的测试用例可以覆盖到你的代码的各个分支和边界情况,提高测试的全面性。
不过,生成的测试用例可能需要进一步调整,以适应你的具体需求和代码规范。
googletest
google开源测试框架的使用(googletest)googletest和CppUnit有点类似,功能和作用在文档(它是一篇googletest官方文档的中译版)上面有很详细的描述,本文写了两个实例,它能概括googletest的基本使用。
googletest的框架可以从上下载到,本文用的是1.0.1版本的。
内容难免有不足和错误,请大家多多指教!1.googletest的框架的组成解压完googletest1.0.1,目录如下:include: 头文件msvc和samples是一些例子src就是googletest的源文件2.第一个例子在举例之间,我们先了解一些常用的断言:ASSERT_*版本的断言失败时会产生致命失败,并结束当前函数。
EXPECT_*版本的断言产生非致命失败,而不会中止当前函数。
通常更推荐使用EXPECT_*断言,因为它们运行一个测试中可以有不止一个的错误被报告出来。
但如果在编写断言如果失败,就没有必要继续往下执行的测试时,你应该使用ASSERT_*断言。
…】.注意断言名称中出现的“CASE”意味着大小写被忽略了。
例子:(1)我们先新建一个空的Win32控制台应用程序gtest,把googletest中的include下的头文件都加到gtest的头文件中,把src下的实现文件都加到gtest的实现文件中。
然后把项目的“配置属性”->“配置类型”改为“静态库(.lib)”。
然后我们在同一个工作区内添加一个Win32控制台应用程序SimpleTest,把gtest设为依赖项目。
并添加被测文件的头文件和实现文件,代码如下头文件:(Sometimes, you want to run only a subset of the tests . for debugging or quickly verifying a change). If you set the GTEST_FILTER environment variable or the --gtest_filter flag to a filter string, Google Test will only run the tests whose full names (in the form of match the filter.The format of a filter is a ':'-separated list of wildcard patterns (called the positive patterns) optionally followed by a '-' and another ':'-separated pattern list (called the negative patterns). A test matches the filter if and only if it matches any of the positive patterns but does not match any of the negative patterns.A pattern may contain '*' (matches any string) or '' (matches any single character). For convenience, the filter '*-NegativePatterns' can be also written as'-NegativePatterns'.For example: (重要)./foo_test Has no flag, and thus runs all its tests../foo_test --gtest_filter=* Also runs everything, due to the singlematch-everything * value../foo_test --gtest_filter=FooTest.* Runs everything in test caseFooTest.!./foo_test --gtest_filter=*Null*:*Constructor* Runs any test whose full name contains either "Null" or "Constructor"../foo_test --gtest_filter=-*DeathTest.* Runs all non-death tests../foo_test --gtest_filter=FooTest.* Runs everything in test caseFooTest except .默认情况下,googletest是把所有定义的测试实例都运行一遍,也许你想只运行这些测试的一部分(比如说你想迅速验证一下你自己修改后的某一段代码是否通过测试,而不是全部的代码是否通过测试),那么你可以使用--gtest_filter 这个标签来过滤一下测试用例.定义完--gtest_filter之后,googletest只会运行测试名称和--gtest_filter定义一样的测试.(我们以上面的第一个例子SimpleTest为例子, 我电脑上这个工程生成的可执行文件是在D:\testtest\gtest\debug),比如我们只想运行BOOLTEST这个测试用例,则我们在控制台上输入:--gtest_filter=BOOLTEST.*的意思是运行BOOLTEST这个测试实例下的所有测试,当然如果你要运行全部测试实例,就直接输入SimpleTest,后面什么都不要加.则输出:由上面我们可以看出,此时只运行了BOOLTEST这个测试实例.如果我们要运行多个测试实例,则我们可以用冒号”:”(冒号前后不要有空格,不然会出错)把它们连起来,比如我们要运行BOOLTEST和ADDTEST 下的所有测试,我们这么写:)输出如下:关于更多测试名字如何过滤的方法,上面英文红色部分都描述了,熟悉它们可以很好得帮助我们过滤测试有例!。
GTest使用手册【精选文档】
玩转Google开源C++单元测试框架Google Test系列(gtest)(总)前段时间学习和了解了下Google的开源C++单元测试框架Google Test,简称gtest,非常的不错. 我们原来使用的是自己实现的一套单元测试框架,在使用过程中,发现越来越多使用不便之处,而这样不便之处,gtest恰恰很好的解决了。
其实gtest本身的实现并不复杂,我们完全可以模仿gtest,不断的完善我们的测试框架,但最后我们还是决定使用gtest取代掉原来的自己的测试框架,原因是:1。
不断完善我们的测试框架之后就会发觉相当于把gtest重新做了一遍,虽然轮子造的很爽,但是不是必要的。
2。
使用gtest可以免去维护测试框架的麻烦,让我们有更多精力投入到案例设计上。
3。
gtest提高了非常完善的功能,并且简单易用,极大的提高了编写测试案例的效率。
如果想对gtest内部探个究竟,就把它的代码下载下来研究吧,这就是开源的好处,哈!官方已经有如此完备的文档了,为什么我还要写呢?一方面是自己记记笔记,好记性不如烂笔头,以后自己想查查一些用法也可以直接在这里查到,一方面是对于不想去看一大堆英文文档的朋友,在我这里可以快速的找到gtest相关的内容。
一、初识gtest1、前言本篇将介绍一些gtest的基本使用,包括下载,安装,编译,建立我们第一个测试Demo工程,以及编写一个最简单的测试案例。
2、下载如果不记得网址, 直接在google里搜gtest,第一个就是。
目前gtest的最新版本为1.3。
0 3、编译下载解压后, 里面有个msvc目录:使用VS的同学可以直接打开msvc里面的工程文件, 如果你在使用的是VS2005或是VS2008,打开后会提示你升级,升完级后,我们直接编译里面的“gtest”工程,可以直接编过的.这里要提醒一下的是,如果你升级为VS2008的工程,那么你的测试Demo最好也是VS2008工程,不然你会发现很郁闷,你的Demo怎么也编不过,我也曾折腾了好久,当时我升级为了VS2008工程,结果我使用VS2005工程建Demo,死活编不过。
GoogleTest介绍(一)
GoogleTest介绍(⼀)关于 Google Test(有时也称为gtest)的介绍,会分为两篇⽂章。
本⽂主要介绍 google test 的相关知识,另外⼀篇则会演⽰⼀些⽰例程序。
1 Why googletest此处引⽤ google test 在 GitHub 上的介绍:googletest helps you write better C++ tests.googletest is a testing framework developed by the Testing Technology team with Google's specific requirements and constraints in mind. No matter whether you work on Linux, Windows, or a Mac, if you write C++ code, googletest can help you. And it supports any kind of tests, not just unit tests.2 相关知识2.1 Test、Test Case 和 Test Suite此处介绍三个概念:Test、Test Case 和 Test Suite。
这三者在某些场景下容易混淆。
由于某些历史原因,googletest 使⽤ Test Case 来将相关的 Test 归为⼀组,然⽽,当前 ISTQB(International Software Testing Qualifications Board) 和很多关于软件质量书籍都使⽤ Test Suite 替换 Test Case;⽽ googletest 中的 Test 则对应 ISTQB 的 Test Case。
总结后,即下表内容:Meaning googletest Term ISTQB TermExercise a particular program path with specific input values and verify the results TEST() Test CaseA set of several tests related to one component Test Case Test Suite2.2 基本概念使⽤ googletest,最先写的就是断⾔(assertion)。
gtest 用例执行顺序
gtest 用例执行顺序在软件测试中,测试用例的执行顺序是非常重要的,因为不同的执行顺序可能会导致测试结果的不同。
Google Test(简称GTest)是一个流行的C++测试框架,本文将围绕GTest的用例执行顺序进行阐述。
1. GTest的用例执行顺序是依赖于测试程序的命令行参数。
默认情况下,GTest会按照文件名和字典序对用例进行排序,然后按照顺序执行。
例如,我们有两个测试文件:test1.cpp和test2.cpp。
如果运行命令为:./test_suite,则GTest会首先执行test1.cpp中的用例,然后执行test2.cpp中的用例。
2. 如果想要改变测试用例的执行顺序,可以通过测试程序的命令行参数进行设置。
例如,我们想要先执行test2.cpp中的用例,可以改变命令行参数为:./test_suite --gtest_filter=*test2*。
这样,GTest会先执行test2.cpp中的用例,然后再执行test1.cpp中的用例。
3. GTest还提供了SetUp和TearDown函数,分别在每个测试用例执行之前和之后执行。
这可以用来初始化或清理测试环境。
如果一个测试用例依赖于其他测试用例的结果,可以在SetUp函数中进行准备工作。
例如,我们有三个测试用例:test1、test2和test3。
test2依赖于test1的结果,test3依赖于test2的结果。
我们可以将test1和test2的准备工作放在test1的SetUp函数中,将test2和test3的准备工作放在test2的SetUp函数中。
4. GTest还提供了SetUpTestCase和TearDownTestCase函数,分别在测试用例集中的所有测试用例执行之前和之后执行。
这可以用来初始化或清理整个测试用例集的环境。
如果一个测试用例集依赖于其他测试用例集的结果,可以在SetUpTestCase函数中进行准备工作。
gtest单元测试方法
gtest单元测试方法gtest单元测试方法1. 什么是gtest单元测试方法gtest单元测试方法是指使用Google Test(简称gtest)框架进行软件单元测试的一种方法。
gtest是一个开源的C++单元测试框架,它提供了丰富的断言和测试工具,可以帮助开发者编写可靠的、易于维护的单元测试。
2. 使用gtest编写单元测试方法的步骤下面是使用gtest编写单元测试方法的步骤:1.安装gtest框架:首先需要将gtest框架下载到本地,并进行安装和配置。
2.编写测试用例:根据需要,编写需要测试的代码和相应的测试用例,在测试用例中调用待测试代码,并使用gtest的断言进行验证。
3.构建和运行测试:通过编译器构建测试代码,并执行生成的可执行文件,查看测试结果。
4.分析结果:根据测试结果,进行相应的修改和优化。
3. 测试用例的编写测试用例是指对待测试代码的某个功能进行测试的一组测试方法。
在gtest中,测试用例是由宏定义的方式进行定义的,下面是一个测试用例的示例:TEST(TestCaseName, TestName) {// 在这里编写测试代码// 调用待测试代码并使用断言进行验证EXPECT_EQ(4, add(2, 2));}•TEST是一个宏定义,用于定义一个测试用例。
TestCaseName 是测试用例的名称,TestName是具体的测试方法的名称。
•在测试用例中,可以编写测试代码,并调用待测试的代码。
使用EXPECT_*系列的断言检查测试结果,如EXPECT_EQ用于判断两个值是否相等。
4. 编译和运行测试使用gtest编写的测试代码,需要通过编译器进行构建,并执行生成的可执行文件进行测试。
下面是使用命令行进行编译和运行的示例:1.编译测试代码:使用编译器将测试代码编译为可执行文件。
$ g++ -o test -lgtest -lgtest_main2.运行测试:执行生成的可执行文件进行测试。
Google test 高级使用指南
Google Test 框架高级使用指南(一)现在您已经读完 GoogleTestPrimer 并学会了如何用 Google Test 写一些测试程序, 现在是学习更多技巧的时候了。
这篇文章将告诉你更多的断言、如何用流传递复杂的错误信息、传达致命失败、重用并加快你的测试夹具以及在你的测试工程中使用各种的标记。
现在您已经读完GoogleTestPrimer并学会了如何用Google Test 写一些测试程序, 现在是学习更多技巧的时候了。
这篇文章将告诉你更多的断言、如何用流传递复杂的错误信息、传达致命失败、重用并加快你的测试夹具以及在你的测试工程中使用各种的标记。
更多断言本节包括一些不太常用的,但仍然很有意义的断言。
明确声明成功或失败这三个断言并不具体测试某个值或表达式,而是直接产生成功或失败。
象其它用于测试的断言宏一样,你也可以为它们自定义失败信息。
产生一个成功断言,注意,这并不表示整个测试成功。
一次测试成功的充分必要条件是:在整个测试期间没有出现失败的断言。
注:SUCCEED()宏目前不会产生任何输出,实际上它只是被定义而已。
不过,以后我们可能会为它加上自定义输出功能。
FAIL*生成一个致命失败,而ADD_FAILURE*则产生一个非致命失败。
相对于布尔表达式,它们在控制流程时会更有用。
例如,你可以象这样写:1.switch(expression) {2. case 1: ... some checks ...3. case 2: ... some other checks4. ...5. default: FAIL() << "We shouldn't get here.";6.}适用于: Linux, Windows, Mac.异常断言以下断言用于测试一片代码是否会抛出指定类型的异常:例如:1.ASSERT_THROW(Foo(5), bar_exception);2.3.EXPECT_NO_THROW({4. int n = 5;5. Bar(&n);6.});适用于: Linux, Windows, Mac; since version 1.1.0.谓语断言尽管Google Test 有一系列丰富的断言,但它们永远不会足够,因为不可能(也不是好主意)去预计用户可能遇到的所有情况。
GTest使用说明材料
玩转Google开源C++单元测试框架Google Test系列(gtest)(总)前段时间学习和了解了下Google的开源C++单元测试框架Google Test,简称gtest,非常的不错。
我们原来使用的是自己实现的一套单元测试框架,在使用过程中,发现越来越多使用不便之处,而这样不便之处,gtest恰恰很好的解决了。
其实gtest本身的实现并不复杂,我们完全可以模仿gtest,不断的完善我们的测试框架,但最后我们还是决定使用gtest取代掉原来的自己的测试框架,原因是:1.不断完善我们的测试框架之后就会发觉相当于把gtest重新做了一遍,虽然轮子造的很爽,但是不是必要的。
2.使用gtest可以免去维护测试框架的麻烦,让我们有更多精力投入到案例设计上。
3.gtest提高了非常完善的功能,并且简单易用,极大的提高了编写测试案例的效率。
如果想对gtest内部探个究竟,就把它的代码下载下来研究吧,这就是开源的好处,哈!官方已经有如此完备的文档了,为什么我还要写呢?一方面是自己记记笔记,好记性不如烂笔头,以后自己想查查一些用法也可以直接在这里查到,一方面是对于不想去看一大堆英文文档的朋友,在我这里可以快速的找到gtest相关的内容。
一、初识gtest1、前言本篇将介绍一些gtest的基本使用,包括下载,安装,编译,建立我们第一个测试Demo 工程,以及编写一个最简单的测试案例。
2、下载如果不记得网址,直接在google里搜gtest,第一个就是。
目前gtest的最新版本为1.3.0 3、编译下载解压后,里面有个msvc目录:使用VS的同学可以直接打开msvc里面的工程文件,如果你在使用的是VS2005或是VS2008,打开后会提示你升级,升完级后,我们直接编译里面的“gtest”工程,可以直接编过的。
这里要提醒一下的是,如果你升级为VS2008的工程,那么你的测试Demo最好也是VS2008工程,不然你会发现很郁闷,你的Demo怎么也编不过,我也曾折腾了好久,当时我升级为了VS2008工程,结果我使用VS2005工程建Demo,死活编不过。
开源C单元测试框架GoogleTest介绍
开源C++单元测试框架Google Test介绍Google T estGoogle t est是针对c/c++的开源测试项目。
采用的协议是BSD licens e,有很多著名的开源项目采用了它,包括Chro mium(谷歌浏览器开发版)。
安装配置下载主页:http://code.googl/p/google test/官方资料文档:http://code.googl/p/google test/wiki/Google TestP rimerhttp://code.googl/p/google test/wiki/Google TestA dvanc edGui de当前的最新版本是1.5。
包含3种ta r.bz2,tar.gz和zip格式。
解压后的目录结构:其中的msvc就是VS的工程目录,可以直接打开进行编译(vs2008则需要进行工程升级转化),生成相应的lib静态库文件。
在vs中需要在工程中设置3个地方,和ACE的设置一样:1.设置gtest的头文件2.设置gtest的lib文件注:如果测试代码需要上库,附加依赖项建议不要带绝对路径。
3.设置运行时的多线程库支持如果是Release版本,Runtim e Librar y设为/MT。
当然,其实你也可以选择动态链接(/MD),前提是你之前编译的gt est也使用了同样是/MD选项。
如果是在Linux下,就比较方便,和普通的开源软件一样,采用1../config ure –prefix=/your install path (如果不带参数默认为/usr/local下面)2.make3.make install然后就可以在工程中进行使用(如果指定了安装目录,则需要-I和-L来指明,同时也在最后的link加上-lpthre ad –lgtest)下面是一个简易的写法:By the way: 我在192.168.100.119上采用的是默认安装,所以直接加上-lgtest和-lpthre ad就可以了简单例子如果需要使用gtest,则需要包含#includ e"gtest/gtest.h"下面是一个简单例子:编译运行的结果:下面来依次解释:myadd是待测试函数名,TEST是作为gT es t的一次测试(其实它是由g T est包装过的一个宏),第一个参数T est_m yadd是测试用例名,第二个参数IsRetu rnAdd是测试名(这两个参数都是自己任意定义的)。
gtest 参数
gtest 参数1. 什么是 gtest?gtest(Google Test)是一个由 Google 开发的 C++ 测试框架,用于编写和运行单元测试。
它提供了丰富的断言函数和丰富的命令行参数,使得测试代码编写更加简单、灵活和可靠。
2. gtest 的安装与配置2.1 安装 gtest在使用 gtest 进行测试之前,需要先将其安装到开发环境中。
•在 Ubuntu 系统上,可以通过以下命令安装 gtest:sudo apt-get install libgtest-dev•在 Windows 系统上,可以从 [gtest 官方网站]( 下载最新版本的源代码,并将其编译成库文件。
2.2 配置项目完成安装后,需要将 gtest 配置到项目中,以便能够使用其中的功能。
•在 CMakeLists.txt 文件中添加以下内容:find_package(GTest REQUIRED)include_directories(${GTEST_INCLUDE_DIRS})add_executable(tests test.cpp)target_link_libraries(tests ${GTEST_LIBRARIES} pthread)此处假设测试代码文件为 test.cpp。
3. 使用 gtest 进行单元测试3.1 编写测试代码在开始编写测试代码之前,需要确定要进行测试的函数或类,并创建对应的测试文件。
下面是一个示例的测试函数:#include <gtest/gtest.h>// 要测试的函数int add(int a, int b) {return a + b;}// 测试用例TEST(AddTest, PositiveNumbers) {EXPECT_EQ(add(2, 3), 5);}TEST(AddTest, NegativeNumbers) {EXPECT_EQ(add(-2, -3), -5);}3.2 运行测试编写完测试代码后,可以使用 gtest 提供的命令行参数来运行测试。
gtest语法
Google Test(gtest)是一个用于C++的单元测试框架,它提供了丰富的断言宏和功能来帮助开发者编写测试用例。
以下是gtest的一些基础语法:1. TEST() 宏:用于定义一个测试用例。
它接受两个参数,第一个是测试用例的名称,第二个是测试用例所在的测试套件的名称。
2. ASSERT_ 系列宏:用于在测试用例中进行断言。
例如,`ASSERT_TRUE(condition)` 会在条件`condition` 为假时标记测试失败。
3. EXPECT_ 系列宏:与ASSERT_ 类似,但即使条件不满足,测试用例也不会立即失败,而是会继续执行后续的代码。
4. TEST_F() 宏:用于定义一个带有死亡测试(death test)的测试用例。
死亡测试是一种特殊类型的测试,它会检查程序是否因为特定的错误而异常终止。
5. SCOPE_ 系列宏:用于控制测试用例的作用域,例如`SCOPED_TRACE` 可以在测试用例失败时提供更多的上下文信息。
6. main() 函数:所有的测试用例都需要通过main() 函数来运行,通常这个函数不需要手动编写,因为gtest 会自动提供。
7. --gtest_output=xml:这是一个命令行选项,用于将测试结果输出为XML 格式,便于集成到持续集成系统中。
8. --gtest_color=yes:这是另一个命令行选项,用于在控制台输出彩色的测试结果,使得测试报告更加直观。
9. DEATH_TEST:用于声明死亡测试,这是一种特殊的测试,它会检查被测代码是否会因某些特定的原因而崩溃或异常终止。
10. TYPED_TEST:用于声明参数化测试,允许使用不同的参数值多次运行相同的测试用例。
11. ASSERT_PRED1, ASSERT_PRED2, ...:这些宏用于在断言中使用自定义的谓词函数,可以对复杂的条件进行更灵活的检查。
gtest用法
gtest用法Google Test(简称gTest)是谷歌开发的一款C++单元测试框架。
使用gTest可以方便地进行单元测试,它提供了各种各样的断言(比如EXPECT_EQ, ASSERT_EQ,EXPECT_TRUE等),方便开发人员编写测试代码并检测代码的正确性。
下面是使用gtest进行一个简单测试的示例代码:```#include <gtest/gtest.h>#include <string>using namespace std;TEST(testString, stringLen) {// 测试字符串长度string str = "hello world";EXPECT_EQ(str.length(), 11);}int main(int argc, char** argv) {// 初始化gtesttesting::InitGoogleTest(&argc, argv);// 运行所有测试return RUN_ALL_TESTS();}```在上面的代码中,我们使用gTest测试了一个字符串的长度。
首先,我们定义了一个TEST宏,该宏用于指定测试用例的名称和要测试的功能。
然后,我们在测试用例中使用了一个EXPECT_EQ断言,该断言用于判断字符串的长度是否等于11。
在main函数中,我们调用testing::InitGoogleTest()函数初始化gTest,并最终调用RUN_ALL_TESTS()函数运行所有的测试用例。
为了使用gTest,我们需要在项目中包含gtest.h头文件,并将gtest库链接到我们的项目中。
参考官方文档可以轻松完成这些步骤。
总之,gTest是一款非常强大的C++单元测试框架,它可以帮助开发人员编写更加健壮的代码。
googletest安装与使用
TEST(MyTest, AddTest) { EXPECT_EQ(add(1, 2), 3);
}
int main(int argc, char *argv[]) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS();
}
编译
安装
make install
静态库文件默认安装在/usr/local/lib64,头文件在/usr/local/include
测试
测试程序test.cpp
#include <stdio.h> #include <gtest/gtest.h>
int add(int a, int b) { return a + b;
编译
cd googletest mkdir mybuild # 创建编译目录 cd mybuild cmake ../ make -j all
cmake阶段可能会出错,在CMakeLists.txt文件中添加set (CMAKE_CXX_STANDARD 11) 如果需要编译googtest自带测试样例,则使用cmake -Dgtest_build_samples=ON ../
登录后才能查看或发表评论立即登录或者逛逛博客园首页
googletest安 装 与 使 用
简介
googletest是Google公司开发的一款跨平台的c++测试框架。
依赖
Bazel或者CMake(通常用cmake) 支持c++11标准的编译器
安装
下载
git clone https:///google/googletest.git
google test 使用
摘自/blog/google test 使用安装:下载Google C++ Testing Framework,解压...VC2005:直接打开msvc\gtest.vcproj或msvc\gtest.sln,直接编译即可。
Linux/Unix下的GCC:传统过程:./configure makeMingw:BCC:用Mingw和BCB6编译需要修改一些代码,过几天我会上传到/网站上。
使用:首先#include <gtest/gtest.h>,当然工程的头文件路径要设置正确1.简单测试TESTCpp代码1.#include <gtest/gtest.h>2.int Factorial( int n )3. {4. if(n==2) return 100; //故意出个错,嘻嘻5. return n<=0? 1 : n*Factorial(n - 1);6. }7. //用TEST做简单测试8. TEST(TestFactorial, ZeroInput) //第一个参数是测试用例名,第二个参数是测试名:随后的测试结果将以"测试用例名.测试名"的形式给出9. {10. EXPECT_EQ(1, Factorial(0)); //EXPECT_EQ稍候再说,现在只要知道它是测试两个数据是否相等的就行了。
11. }12.13. TEST(TestFactorial, OtherInput)14. {15. EXPECT_EQ(1, Factorial(1));16. EXPECT_EQ(2, Factorial(2));17. EXPECT_EQ(6, Factorial(3));18. EXPECT_EQ(40320, Factorial(8));19. }20.21. int main(int argc, char* argv[])22. {23. testing::InitGoogleTest(&argc,argv); //用来处理Test相关的命令行开关,如果不关注也可不加24. RUN_ALL_TESTS(); //看函数名就知道干啥了25. std::cin.get(); //只是让它暂停而已,不然一闪就没了26. return 0;27. }2.多个测试场景需要相同数据配置的情况,用TEST_FCpp代码1. //用TEST_F做同配置的系列测试2. typedef std::basic_string<TCHAR> tstring;3. struct FooTest : testing::Test {4. //这里定义要测试的东东5. tstring strExe;6. //可以利用构造、析构来初始化一些参数7. FooTest() {}8. virtual ~FooTest() {}9.10. //如果构造、析构还不能满足你,还有下面两个虚拟函数11. virtual void SetUp() {12. // 在构造后调用13. strExe.resize(MAX_PATH);14. GetModuleFileName(NULL, &strExe[0], MAX_PATH);15. }16.17. virtual void TearDown() { } // 在析构前调用18.};19.20.tstring getfilename(const tstring &full) //偶写的从完整路径里取出文件名的函数(路径分隔符假定为'\\')21.{22. return full.substr(full.rfind(_T('\\')));23.}24.25.tstring getpath(const tstring &full) //偶写的从完整路径里取出路径名的函数(Windows路径)26.{27. return full.substr(0, full.rfind(_T('\\')));28.}29.30.TEST_F(FooTest, Test_GFN) //测试getfilename函数31.{32. EXPECT_STREQ(_T("Projectexe"), getfilename(strExe).c_str());33.}34.35.TEST_F(FooTest, Test_GP) //测试getpath函数36.{37. EXPECT_STREQ(_T("D:\\Code\\libs\\google\\gtest-1\\BCC_SPC\\bcc\\ex"), getpath(strExe).c_str());38.}39.40.int main(int argc, TCHAR* argv[]) //主函数还是一样地41.{42. testing::InitGoogleTest(&argc,argv);43. RUN_ALL_TESTS();44. std::cin.get();45. return 0;46.}快速入门:Google提供了两种断言形式,一种以ASSERT_开头,另一种以EXPECT_开头,它们的区别是ASSERT_*一旦失败立马退出,而EXPECT_还能继续下去。
googletest mock 示例
一、背景介绍在软件开发领域,单元测试是非常重要的一环。
而针对 C++ 开发的单元测试,GoogleTest 是一个非常流行的选择。
GoogleTest 提供了丰富的断言和测试框架,可以帮助开发人员编写高质量的测试用例。
而在实际开发中,有时候我们需要使用 mock 对象来模拟一些特定的行为,以便更好地进行单元测试。
二、GoogleTest 中的 MockGoogleTest 提供了一个叫做 GoogleMock 的子框架,用于支持mock 对象的创建和使用。
GoogleMock 提供了丰富的 API,可以灵活地创建和控制 mock 对象的行为。
在实际的项目开发中,我们通常需要使用 GoogleMock 来模拟一些外部依赖,例如文件系统、网络通信、数据库等,以便更好地进行单元测试。
三、示例代码以下是一个简单的示例代码,演示了如何使用 GoogleTest 和GoogleMock 进行单元测试。
```cpp#include <gtest/gtest.h>#include <gmock/gmock.h>// 需要被测试的类class Calculator {public:virtual ~Calculator() {}virtual int add(int a, int b) {return a + b;}};// 测试 Fixtureclass CalculatorMock : public Calculator {public:MOCK_METHOD2(add, int(int, int));};TEST(CalculatorTest, Add) {CalculatorMock calc; // 创建 mock 对象EXPECT_CALL(calc, add(1, 2)).WillOnce(testing::Return(3)); // 设置预期行为EXPECT_EQ(3, calc.add(1, 2)); // 执行测试}```在这个示例中,我们定义了一个简单的 Calculator 类,并使用CalculatorMock 类来创建 mock 对象。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Google C++ Testing Framework Primer翻译:Ray Li (ray.leex@)修改日期:2008年7月6日原文参见:/p/googletest/wiki/GoogleTestPrimerIntroduction:为什么需要Google C++ 测试框架?Google C++ 测试框架帮助你更好地编写C++测试。
无论你是在Linux,Windows,还是Mac环境下工作,只要你编写C++代码,Google 测试框架都可以帮上忙。
那么,哪些因素才能构成一个好的测试?以及,Google C++ 测试框架怎样满足这些因素?我们相信:1.测试应该是独立、可重复的。
因为其他测试成功或失败而导致我们要对自己的测试进行debug是非常痛苦的。
Google C++ 测试框架通过将每个测试在不同的对象中运行,使得测试分离开来。
当一个测试失败时,Google C++ 测试框架允许你独立运行它以进行快速除错。
2.测试应该能够被很好地组织,并反映被测代码的结构。
Google C++ 测试框架将测试组织成测试案例,案例中的测试可以共享数据和程序分支。
这样一种通用模式能够很容易辨识,使得我们的测试容易维护。
当开发人员在项目之间转换,开始在一个新的代码基上开始工作时,这种一致性格外有用。
3.测试应该是可移植、可重用的。
开源社区有很多平台独立的代码,它们的测试也应该是平台独立的。
除开一些特殊情况,Google C++ 测试框架运行在不同的操作系统上、与不同的编译器(gcc、icc、MSVC)搭配,Google C++ 测试框架的测试很容易与不同的配置一起工作。
4.当测试失败时,应该提供尽可能多的、关于问题的信息。
Google C++ 测试框架在第一个测试失败时不会停下来。
相反,它只是将当前测试停止,然后继续接下来的测试。
你也可以设置对一些非致命的错误进行报告,并接着进行当前的测试。
这样,你就可以在一次“运行-编辑-编译”循环中检查到并修复多个bug。
5.测试框架应该能将测试编写人员从一些环境维护的工作中解放出来,使他们能够集中精力于测试的内容。
Google C++ 测试框架自动记录下所有定义好的测试,不需要用户通过列举来指明哪些测试需要运行。
6.测试应该快速。
使用Google C++ 测试框架,你可以重用多个测试的共享资源,一次性完成设置/解除设置,而不用使一个测试去依赖另一测试。
因为Google C++ 测试框架基于著名的xUnit架构,如果你之前使用过JUnit或PyUnit的话,你将会感觉非常熟悉。
如果你没有接触过这些测试框架,它也只会占用你大约10分钟的时间来学习基本概念和上手。
所以,让我们开始吧!Note:本文偶尔会用“Google Test”来代指“Google C++ 测试框架”。
基本概念使用Google Test时,你是从编写断言开始的,而断言是一些检查条件是否为真的语句。
一个断言的结果可能是成功、非致命失败,或者致命失败。
如果一个致命失败出现,他会结束当前的函数;否则,程序继续正常运行。
测试使用断言来验证被测代码的行为。
如果一个测试崩溃或是出现一个失败的断言,那么,该测试失败;否则该测试成功。
一个测试案例(test case)包含了一个或多个测试。
你应该将自己的测试分别归类到测试案例中,以反映被测代码的结构。
当测试案例中的多个测试需要共享通用对象和子程序时,你可以把他们放到一个测试固件(test fixture)类中。
一个测试程序可以包含多个测试案例。
从编写单个的断言开始,到创建测试和测试案例,我们将会介绍怎样编写一个测试程序。
断言Google Test中的断言是一些与函数调用相似的宏。
要测试一个类或函数,我们需要对其行为做出断言。
当一个断言失败时,Google Test会在屏幕上输出该代码所在的源文件及其所在的位置行号,以及错误信息。
也可以在编写断言时,提供一个自定义的错误信息,这个信息在失败时会被附加在Google Test的错误信息之后。
断言常常成对出现,它们都测试同一个类或者函数,但对当前功能有着不同的效果。
ASSERT_*版本的断言失败时会产生致命失败,并结束当前函数。
EXPECT_*版本的断言产生非致命失败,而不会中止当前函数。
通常更推荐使用EXPECT_*断言,因为它们运行一个测试中可以有不止一个的错误被报告出来。
但如果在编写断言如果失败,就没有必要继续往下执行的测试时,你应该使用ASSERT_*断言。
因为失败的ASSERT_*断言会立刻从当前的函数返回,可能会跳过其后的一些的清洁代码,这样也许会导致空间泄漏。
根据泄漏本身的特质,这种情况也许值得修复,也可能不值得我们关心——所以,如果你得到断言错误的同时,还得到了一个堆检查的错误,记住上面我们所说的这一点。
要提供一个自定义的错误消息,只需要使用<<操作符,或一个<<操作符的序列,将其输入到框架定义的宏中。
下面是一个例子:Cpp代码1.ASSERT_EQ(x.size(), y.size()) << "Vectors x and y are of unequallength";2.for (int i = 0; i < x.size(); ++i) {3. EXPECT_EQ(x[i], y[i]) << "Vectors x and y differ at index " <<i;4.}ASSERT_EQ(x.size(), y.size()) << "Vectors x and y are of unequal length"; for (int i = 0; i < x.size(); ++i) {EXPECT_EQ(x[i], y[i]) << "Vectors x and y differ at index " << i;}任何能够被输出到ostream中的信息都可以被输出到一个断言宏中——特别是C 字符串和string对象。
如果一个宽字符串(wchar_t*,windows上UNICODE模式TCHAR*或std::wstring)被输出到一个断言中,在打印时它会被转换成UTF-8编码。
基本断言下面这些断言实现了基本的true/false条件测试。
致命断言非致命断言验证条件ASSERT_TRUE(condition);EXPECT_TRUE(condition);condition为真ASSERT_FALSE(condition);EXPECT_FALSE(condition);condition为假记住,当它们失败时,ASSERT_*产生一个致命失败并从当前函数返回,而EXCEPT_*产生一个非致命失败,允许函数继续运行。
在两种情况下,一个断言失败都意味着它所包含的测试失败。
有效平台:Linux、Windows、Mac。
二进制比较本节描述了比较两个值的一些断言。
致命断言非致命断言验证条件ASSERT_EQ(expected, actual);EXPECT_EQ(expected, actual);expected == actualASSERT_NE(val1, val2);EXPECT_NE(val1, val2);val1 != val2ASSERT_LT(val1, val2);EXPECT_LT(val1, val2);val1 < val2ASSERT_LE(val1, val2);EXPECT_LE(val1, val2);val1 <= val2ASSERT_GT(val1, val2);EXPECT_GT(val1, val2);val1 > val2ASSERT_GE(val1, val2);EXPECT_GE(val1, val2);val1 >= val2在出现失败事件时,Google Test会将两个值(Val1和Val2)都打印出来。
在ASSERT_EQ*和EXCEPT_EQ*断言(以及我们随后介绍类似的断言)中,你应该把你希望测试的表达式放在actual(实际值)的位置上,将其期望值放在expected (期望值)的位置上,因为Google Test的测试消息为这种惯例做了一些优化。
参数值必须是可通过断言的比较操作符进行比较的,否则你会得到一个编译错误。
参数值还必须支持<<操作符来将值输入到ostream中。
所有的C++内置类型都支持这一点。
这些断言可以用于用户自定义的型别,但你必须重载相应的比较操作符(如==、<等)。
如果定义有相应的操作符,推荐使用ASSERT_*()宏,因为它们不仅会输出比较的结果,还会输出两个比较对象。
参数表达式总是只被解析一次。
因此,参数表达式有一定的副作用(side effect,这里应该是指编译器不同,操作符解析顺序的不确定性)也是可以接受的。
但是,同其他普通C/C++函数一样,参数表达式的解析顺序是不确定的(如,一种编译器可以自由选择一种顺序来进行解析),而你的代码不应该依赖于某种特定的参数解析顺序。
ASSERT_EQ()对指针进行的是指针比较。
即,如果被用在两个C字符串上,它会比较它们是否指向同样的内存地址,而不是它们所指向的字符串是否有相同值。
所以,如果你想对两个C字符串(例如,const char*)进行值比较,请使用ASSERT_STREQ()宏,该宏会在后面介绍到。
特别需要一提的是,要验证一个C字符串是否为空(NULL),使用ASSERT_STREQ(NULL, c_string)。
但是要比较两个string对象时,你应该使用ASSERT_EQ。
本节中介绍的宏都可以处理窄字符串对象和宽字符串对象(string和wstring)。
有效平台:Linux、Windows、Mac。
字符串比较该组断言用于比较两个C字符串。
如果你想要比较两个string对象,相应地使用EXPECT_EQ、EXPECT_NE等断言。
致命断言非致命断言验证条件ASSERT_STREQ(expected_str, actual_str);EXPECT_STREQ(expected_str, actual_str);两个C字符串有相同的内容ASSERT_STRNE(str1, str2);EXPECT_STRNE(str1, str2);两个C字符串有不同的内容ASSERT_STRCASEEQ(expected_str, actual_str);EXPECT_STRCASEEQ(expected_str, actual_str);两个C字符串有相同的内容,忽略大小写ASSERT_STRCASENE(str1, str2);EXPECT_STRCASENE(str1, str2);两个C字符串有不同的内容,忽略大小写注意断言名称中出现的“CASE”意味着大小写被忽略了。