最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

google c++程序測(cè)試框架googletest使用教程詳解

 更新時(shí)間:2021年08月20日 14:35:12   作者:令狐掌門  
​GoogleTest 是 Google 的 C++ 測(cè)試和模擬框架,可以幫助程序員測(cè)試C++程序的結(jié)果預(yù)期,這篇文章主要介紹了google c++程序測(cè)試框架googletest使用教程,需要的朋友可以參考下

什么是googletest?

googletest簡(jiǎn)介

​GoogleTest 是 Google 的 C++ 測(cè)試和模擬框架,可以幫助程序員測(cè)試C++程序的結(jié)果預(yù)期,GoogleTest 的代碼用cmake管理,可以使用cmake進(jìn)行編譯程dll在程序中使用。googletest一般也可以簡(jiǎn)稱為gtest, 最新版本GoogleTest 需要符合 C++11 標(biāo)準(zhǔn)或更新標(biāo)準(zhǔn)的代碼庫(kù)和編譯器。

​ gtest官網(wǎng):https://google.github.io/googletest/
​ git倉(cāng)庫(kù):https://github.com/google/googletest

誰(shuí)在使用 GoogleTest?

除了 Google 的許多內(nèi)部項(xiàng)目,GoogleTest 還被以下著名項(xiàng)目使用:

  • 鉻項(xiàng)目(Chrome瀏覽器和Chrome OS背后)。
  • LLVM編譯器。
  • Protocol Buffers,Google 的數(shù)據(jù)交換格式。
  • OpenCV的計(jì)算機(jī)視覺(jué)庫(kù)。 相關(guān)開(kāi)源項(xiàng)目

相關(guān)開(kāi)源項(xiàng)目

GTest Runner是一個(gè)基于 Qt5 的自動(dòng)化測(cè)試運(yùn)行器和圖形用戶界面,具有適用于 Windows 和 Linux 平臺(tái)的強(qiáng)大功能。

GoogleTest UI是一個(gè)測(cè)試運(yùn)行器,它運(yùn)行您的測(cè)試二進(jìn)制文件,允許您通過(guò)進(jìn)度條跟蹤其進(jìn)度,并顯示測(cè)試失敗列表。單擊一個(gè)顯示失敗文本。GoogleTest UI 是用 C# 編寫(xiě)的。

GTest TAP ListenerGoogleTest 的一個(gè)事件監(jiān)聽(tīng)器,它實(shí)現(xiàn)了測(cè)試結(jié)果輸出的 TAP 協(xié)議。如果您的測(cè)試運(yùn)行器了解 TAP,您可能會(huì)發(fā)現(xiàn)它很有用。

gtest-parallel是一個(gè)測(cè)試運(yùn)行器,它并行運(yùn)行來(lái)自二進(jìn)制文件的測(cè)試以提供顯著的加速。

GoogleTest Adapter 是一個(gè) VS Code 擴(kuò)展,允許在樹(shù)視圖中查看 GoogleTest,并運(yùn)行/調(diào)試您的測(cè)試。

C++ TestMate是一個(gè) VS Code 擴(kuò)展,允許在樹(shù)視圖中查看 GoogleTest,并運(yùn)行/調(diào)試您的測(cè)試。

Cornichon是一個(gè)小型 Gherkin DSL 解析器,可為 GoogleTest 生成存根代碼。

googletest的下載與編譯

github鏈接:https://github.com/google/googletest

cmake gui編譯

添加代碼路徑和生成后的目錄,點(diǎn)擊configure, 我編譯的是win32版本

在這里插入圖片描述

增加一個(gè)編譯選項(xiàng) CMAKE_DEBUG_POSTFIX,類型為STRING, value為 _d(這個(gè)隨便寫(xiě),只是為了區(qū)分debug和release的

庫(kù))這樣編譯后的debug庫(kù)就會(huì)自帶一個(gè)d后綴,與release的好區(qū)分。

在這里插入圖片描述

點(diǎn)擊generate

在這里插入圖片描述

出現(xiàn)以上結(jié)果表示sln生成ok, 點(diǎn)擊open project即可打開(kāi)項(xiàng)目,一共66個(gè)子項(xiàng)目,其中有l(wèi)ib和googletest的測(cè)試代碼。

在這里插入圖片描述

右鍵INSTALL項(xiàng)目,生成解決方案,即可把.h .lib .dll 提取到cmake編譯時(shí)設(shè)置的CMAKE_INSTALL_PREFIX目錄里,我的生成結(jié)果:

在這里插入圖片描述

bin目錄里是dll

在這里插入圖片描述

很多項(xiàng)目都可以用cmake進(jìn)行編譯,只要在源碼根目錄看到了CMakeLists.txt, 那么這種項(xiàng)目就可以使用cmake進(jìn)行編譯,比如:

  • VTK
  • OpenCV
  • jsoncpp
  • log4cplus
  • googletest
  • google chromium
  • webrtc
  • glog
  • 還有很多 。。。

在vs2019中使用googletest

一般編譯后,都是.h .lib .dll, 在vs中進(jìn)行配置就可以使用,下面是gtest的測(cè)試代碼:

#include <iostream>
#include "gtest/gtest.h"

#pragma comment(lib, "gtestd.lib")

int add(int a, int b) 
{
    return a + b;
}

//編寫(xiě)測(cè)試case
TEST(testCase, test0) 
{
    EXPECT_EQ(add(2, 3), 5);   //判斷結(jié)果是不是等于5,EXPECT_EQ表示 "等于"
}

int main(int argc, char** argv) 
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

運(yùn)行結(jié)果

在這里插入圖片描述

GTest的一些基本概念

要測(cè)試一個(gè)類或函數(shù),我們需要對(duì)其行為做出斷言。當(dāng)一個(gè)斷言失敗時(shí),Google Test會(huì)在屏幕上輸出該代碼所在的源文件及其所在的位置行號(hào),以及錯(cuò)誤信息。也可以在編寫(xiě)斷言時(shí),提供一個(gè)自定義的錯(cuò)誤信息,這個(gè)信息在失敗時(shí)會(huì)被附加在Google Test的錯(cuò)誤信息之后。

斷言常常成對(duì)出現(xiàn),它們都測(cè)試同一個(gè)類或者函數(shù),但對(duì)當(dāng)前功能有著不同的效果。ASSERT_*版本的斷言失敗時(shí)會(huì)產(chǎn)生致命失敗,并結(jié)束當(dāng)前函數(shù)。EXPECT_*版本的斷言產(chǎn)生非致命失敗,而不會(huì)中止當(dāng)前函數(shù)。通常更推薦使用EXPECT_*斷言,因?yàn)樗鼈冞\(yùn)行一個(gè)測(cè)試中可以有不止一個(gè)的錯(cuò)誤被報(bào)告出來(lái)。但如果在編寫(xiě)斷言如果失敗,就沒(méi)有必要繼續(xù)往下執(zhí)行的測(cè)試時(shí),你應(yīng)該使用ASSERT_*斷言。 因?yàn)槭〉腁SSERT_*斷言會(huì)立刻從當(dāng)前的函數(shù)返回,可能會(huì)跳過(guò)其后的一些的清潔代碼,這樣也許會(huì)導(dǎo)致空間泄漏。

GTest的斷言

1、布爾值檢查

Fatal assertion Nonfatal assertion Verifies
ASSERT_TRUE(condition); EXPECT_TRUE(condition); condition is true
ASSERT_FALSE(condition); EXPECT_FALSE(condition); condition is false

2、數(shù)值型數(shù)據(jù)檢查

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

3、字符串比較

Fatal assertion Nonfatal assertion Verifies
ASSERT_STREQ(expected_str, actual_str); EXPECT_STREQ(expected_str, actual_str); 兩個(gè)C字符串有相同的內(nèi)容
ASSERT_STRNE(str1, str2); EXPECT_STRNE(str1, str2); 兩個(gè)C字符串有不同的內(nèi)容
ASSERT_STRCASEEQ(expected_str, actual_str); EXPECT_STRCASEEQ(expected_str, actual_str); 兩個(gè)C字符串有相同的內(nèi)容,忽略大小寫(xiě)
ASSERT_STRCASENE(str1, str2); EXPECT_STRCASENE(str1, str2); 兩個(gè)C字符串有不同的內(nèi)容,忽略大小寫(xiě)

4、異常檢查

Fatal assertion Nonfatal assertion Verifies
ASSERT_THROW(statement, exception_type); EXPECT_THROW(statement, exception_type); statement throws an exception of the given type
ASSERT_ANY_THROW(statement); EXPECT_ANY_THROW(statement); statement throws an exception of any type
ASSERT_NO_THROW(statement); EXPECT_NO_THROW(statement); statement doesn't throw any exception

5、浮點(diǎn)型檢查

Fatal assertion Nonfatal assertion Verifies
ASSERT_FLOAT_EQ(expected, actual); EXPECT_FLOAT_EQ(expected, actual); the two float values are almost equal
ASSERT_DOUBLE_EQ(expected, actual); EXPECT_DOUBLE_EQ(expected, actual); the two double values are almost equal

對(duì)相近的兩個(gè)數(shù)比較:

Fatal assertion Nonfatal assertion Verifies
ASSERT_NEAR(val1, val2, abs_error); EXPECT_NEAR*(val1, val2, abs_error*); the difference between val1 and val2 doesn't exceed the given absolute error

6、此外還有類型檢查、謂詞檢查等

事件機(jī)制

全局事件

要實(shí)現(xiàn)全局事件,必須寫(xiě)一個(gè)類,繼承testing::Environment類,實(shí)現(xiàn)里面的SetUp和TearDown方法。

  1. SetUp()方法在所有案例執(zhí)行前執(zhí)行
  2. TearDown()方法在所有案例執(zhí)行后執(zhí)行

還需要告訴gtest添加這個(gè)全局事件,我們需要在main函數(shù)中通過(guò)testing::AddGlobalTestEnvironment方法將事件掛進(jìn)來(lái),也就是說(shuō),我們可以寫(xiě)很多個(gè)這樣的類,然后將他們的事件都掛上去。

TestSuite事件

我們需要寫(xiě)一個(gè)類,繼承testing::Test,然后實(shí)現(xiàn)兩個(gè)靜態(tài)方法

  1. SetUpTestCase() 方法在第一個(gè)TestCase之前執(zhí)行
  2. TearDownTestCase() 方法在最后一個(gè)TestCase之后執(zhí)行

在編寫(xiě)測(cè)試案例時(shí),我們需要使用TEST_F這個(gè)宏,第一個(gè)參數(shù)必須是我們上面類的名字,代表一個(gè)TestSuite。

TestCase事件

TestCase事件是掛在每個(gè)案例執(zhí)行前后的,實(shí)現(xiàn)方式和上面的幾乎一樣,不過(guò)需要實(shí)現(xiàn)的是SetUp方法和TearDown方法:

  1. SetUp()方法在每個(gè)TestCase之前執(zhí)行
  2. TearDown()方法在每個(gè)TestCase之后執(zhí)行

以下案例解決說(shuō)明上述三個(gè)事件的使用

#include <iostream>
#include <map>
#include "gtest/gtest.h"


#pragma comment(lib, "gtestd.lib")

using namespace std;


class Student 
{
public:
    Student() 
    {
        age = 0;
    }

    Student(int a) 
    {
        age = a;
    }

    void print() 
    {
        cout << "*********** " << age << " **********" << endl;;
    }

private:
    int age;
};

class FooEnvironment : public testing::Environment 
{
public:
    virtual void SetUp()
    {
        std::cout << "Foo FooEnvironment SetUP" << std::endl;
    }

    virtual void TearDown()
    {
        std::cout << "Foo FooEnvironment TearDown" << std::endl;
    }
};

static Student* s;

//在第一個(gè)test之前,最后一個(gè)test之后調(diào)用SetUpTestCase()和TearDownTestCase()
class TestMap :public testing::Test
{
public:
    static void SetUpTestCase()
    {
        cout << "SetUpTestCase()" << endl;
        s = new Student(23);
    }

    static void TearDownTestCase()
    {
        delete s;
        cout << "TearDownTestCase()" << endl;
    }

    void SetUp()
    {
        cout << "SetUp() is running" << endl;

    }

    void TearDown()
    {
        cout << "TearDown()" << endl;
    }
};

TEST_F(TestMap, Test1)
{
    // you can refer to s here
    s->print();
}

int main(int argc, char** argv)
{
    testing::AddGlobalTestEnvironment(new FooEnvironment);
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

運(yùn)行結(jié)果

在這里插入圖片描述

參數(shù)化

​ 當(dāng)考慮多次要為被測(cè)函數(shù)傳入不同的值的情況時(shí),可以按下面的方式去測(cè)試。必須添加一個(gè)類,繼承testing::TestWithParam。其中T就是你需要參數(shù)化的參數(shù)類型,如下面的案例是int型參數(shù)。(官方文檔上的案例)

#include<gtest/gtest.h>
// Returns true iff n is a prime number.
bool IsPrime(int n)
{
    // Trivial case 1: small numbers
    if (n <= 1) return false;
    // Trivial case 2: even numbers
    if (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 3
    for (int i = 3; ; i += 2) {
        // We only have to try i up to the squre root of n
        if (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;
}

class IsPrimeParamTest : public::testing::TestWithParam<int>{};
TEST_P(IsPrimeParamTest, HandleTrueReturn)
{
 int n =  GetParam();
 EXPECT_TRUE(IsPrime(n));
}
//被測(cè)函數(shù)須傳入多個(gè)相關(guān)的值
INSTANTIATE_TEST_CASE_P(TrueReturn, IsPrimeParamTest, testing::Values(3, 5, 11, 23, 17));
int main(int argc, char **argv)
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

gtest的使用就介紹這么多,大家有興趣的話,可以加到自己的C++項(xiàng)目中做代碼測(cè)試。

到此這篇關(guān)于google c++程序測(cè)試框架googletest使用教程的文章就介紹到這了,更多相關(guān)c++程序測(cè)試框架googletest內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入解析 C++中std::stoul 函數(shù)

    深入解析 C++中std::stoul 函數(shù)

    std::stoul是 C++ 標(biāo)準(zhǔn)庫(kù)中的一個(gè)字符串轉(zhuǎn)換函數(shù),它用于將?std::string?或?std::wstring?轉(zhuǎn)換為?unsigned long?類型的整數(shù),下面就來(lái)介紹一下
    2025-04-04
  • 一篇文章帶你入門C語(yǔ)言數(shù)據(jù)結(jié)構(gòu):緒論

    一篇文章帶你入門C語(yǔ)言數(shù)據(jù)結(jié)構(gòu):緒論

    這篇文章主要介紹了C語(yǔ)言的數(shù)據(jù)解構(gòu)基礎(chǔ),希望對(duì)廣大的程序愛(ài)好者有所幫助,同時(shí)祝大家有一個(gè)好成績(jī),需要的朋友可以參考下,希望能給你帶來(lái)幫助
    2021-08-08
  • C/C++?Qt?StatusBar底部狀態(tài)欄應(yīng)用教程

    C/C++?Qt?StatusBar底部狀態(tài)欄應(yīng)用教程

    Qt窗體中默認(rèn)會(huì)附加一個(gè)QstatusBar組件,狀態(tài)欄組件位于主窗體的最下方,其作用是提供一個(gè)工具提示功能。本文主要介紹了StatusBar底部狀態(tài)欄的應(yīng)用教程,需要的同學(xué)可以學(xué)習(xí)一下
    2021-12-12
  • C語(yǔ)言中使用快速排序算法對(duì)元素排序的實(shí)例詳解

    C語(yǔ)言中使用快速排序算法對(duì)元素排序的實(shí)例詳解

    這篇文章主要介紹了C語(yǔ)言中使用快速排序算法對(duì)元素排序的實(shí)例詳解,文中細(xì)分了幾個(gè)情況來(lái)舉例,在注釋里有說(shuō)明,需要的朋友可以參考下
    2016-04-04
  • C語(yǔ)言中的指針 初階

    C語(yǔ)言中的指針 初階

    這篇文章主要介紹的是關(guān)于初級(jí)階段學(xué)習(xí)C語(yǔ)言中指針的一些內(nèi)容,那就是指針是什么?簡(jiǎn)單的說(shuō),就是通過(guò)它能找到以它為地址的內(nèi)存單元。下面文章我們就來(lái)詳細(xì)介紹該內(nèi)容,需要的朋友可以參考一下
    2021-10-10
  • 詳解C語(yǔ)言中結(jié)構(gòu)體的使用

    詳解C語(yǔ)言中結(jié)構(gòu)體的使用

    結(jié)構(gòu)體是一些值的集合,這些值稱為成員變量,結(jié)構(gòu)體的每個(gè)成員可以是不同類型的變量。本文將通過(guò)示例為大家詳細(xì)講講C語(yǔ)言中結(jié)構(gòu)體的使用,需要的可以參考一下
    2022-07-07
  • 基于MATLAB神經(jīng)網(wǎng)絡(luò)圖像識(shí)別的高識(shí)別率代碼

    基于MATLAB神經(jīng)網(wǎng)絡(luò)圖像識(shí)別的高識(shí)別率代碼

    今天小編就為大家分享一篇關(guān)于基于MATLAB神經(jīng)網(wǎng)絡(luò)圖像識(shí)別的高識(shí)別率代碼,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • c++中的兩種getline用法詳解

    c++中的兩種getline用法詳解

    c++中有2種getline函數(shù),一種在頭文件 <istream> 中,是istream類的成員函數(shù);另一種是在頭文件 <string> 中,是普通函數(shù)。這篇文章主要介紹了c++中的兩種getline用法,需要的朋友可以參考下
    2020-02-02
  • 詳解C++編程中的析構(gòu)函數(shù)

    詳解C++編程中的析構(gòu)函數(shù)

    這篇文章主要介紹了C++編程中的析構(gòu)函數(shù),是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • c++動(dòng)態(tài)內(nèi)存管理詳解(new/delete)

    c++動(dòng)態(tài)內(nèi)存管理詳解(new/delete)

    作為一名編程初學(xué)者,通常學(xué)習(xí)中,發(fā)生內(nèi)存錯(cuò)誤是件非常麻煩的事情,下面這篇文章主要給大家介紹了關(guān)于c++動(dòng)態(tài)內(nèi)存管理new/delete的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03

最新評(píng)論

卢湾区| 固阳县| 阿尔山市| 虹口区| 桐城市| 阿坝县| 宜州市| 类乌齐县| 安塞县| 宁晋县| 宁安市| 奉化市| 蒙山县| 搜索| 平乡县| 甘孜县| 大安市| 庐江县| 禹城市| 河西区| 澎湖县| 普定县| 江口县| 小金县| 连山| 济宁市| 通化市| 仁布县| 若羌县| 瑞安市| 浑源县| 固阳县| 咸阳市| 黄骅市| 海南省| 托克托县| 云龙县| 芮城县| 池州市| 锦州市| 朝阳市|