一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

現(xiàn)代C++ unit test庫(kù)之doctest基本用法

Linux愛(ài)好者 ? 來(lái)源:Linux愛(ài)好者 ? 作者:Linux愛(ài)好者 ? 2022-10-09 16:38 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

gtest的問(wèn)題

gtest需要安裝有時(shí)候帶來(lái)很多不方便,比如需要經(jīng)常切換gcc和clang的時(shí)候就比較麻煩,安裝的gtest可能在另一個(gè)編譯器下編譯不過(guò), 編寫跨平臺(tái)程序的時(shí)候需要多次安裝gtest,非常不便。另外一個(gè)問(wèn)題是網(wǎng)絡(luò)原因,下載安裝gtest或者git上拉gtest都可能因?yàn)榫W(wǎng)絡(luò)原因失敗。

現(xiàn)代C++ unit test庫(kù)

除了gtest之外,還有很多輕量級(jí)易用的單元測(cè)試庫(kù),比如doctest和catch,相比gtest需要編譯/安裝,他們都是header only的,直接包含到工程里就可以做單元測(cè)試了,portable又沒(méi)有任何依賴,而且對(duì)編譯器版本要求也不高,只需要C++11就行了,用了之后只有一個(gè)字:爽!

這里推薦使用doctest(https://github.com/doctest/doctest),原因是它的性能比catch更好(https://github.com/doctest/doctest/blob/master/doc/markdown/benchmarks.md),當(dāng)然也比gtest好, 來(lái)看看doctest怎么用的吧。

doctest基本用法

#defineDOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
#include"doctest.h"

TEST_CASE("vectorscanbesizedandresized"){
std::vectorv(5);

REQUIRE(v.size()==5);
REQUIRE(v.capacity()>=5);

SUBCASE("addingtothevectorincreasesit'ssize"){
v.push_back(1);

CHECK(v.size()==6);
CHECK(v.capacity()>=6);
}
SUBCASE("reservingincreasesjustthecapacity"){
v.reserve(6);

CHECK(v.size()==5);
CHECK(v.capacity()>=6);
}
}

這里使用CHECK做斷言和gtest的EXPECT_xx是類似的,我覺(jué)得doctest更酷更實(shí)用的一個(gè)特性是SUBCASE, 允許在當(dāng)前case下增加更多的子case去測(cè)試一些special一些的東西,非常實(shí)用,這也是相比gtest更好的一個(gè)地方。

doctest提供了很多豐富的宏,完全可以滿足我們的測(cè)試需要。

doctest的斷言宏

CHECK宏是只檢查并不會(huì)終止測(cè)試,REQUIRE宏則會(huì)終止測(cè)試和gtest里面的ASSET_XX宏類似,這兩個(gè)宏也是平時(shí)做單測(cè)時(shí)用得最多的兩個(gè)宏了。除此之外,還有更豐富的宏。比如:

isoneof3possible:REQUIRE/CHECK/WARN.

_EQ(left,right)-sameas(left==right)
_NE(left,right)-sameas(left!=right)
_GT(left,right)-sameas(left>right)
_LT(left,right)-sameas(left_GE(left,right)-sameas(left>=right)
_LE(left,right)-sameas(left<=?right)
_UNARY(expr)-sameas(expr)
_UNARY_FALSE(expr)-sameas_FALSE(expr)

判斷異常的宏

CHECK_THROWS_AS(func(),conststd::exception&);
CHECK_THROWS_AS(func(),std::exception);//sameasabove

CHECK_THROWS_WITH(func(),"invalidoperation!");

CHECK_THROWS_WITH_AS(func(),"invalidoperation!",std::runtime_error);

_NOTHROW(expression)

doctest異常的宏非常有特色,比gtest的異常斷言更強(qiáng)大,可以同時(shí)比較異常類型和異常信息。

也許有人會(huì)說(shuō)gtest除了這些基本的測(cè)試斷言之外還有g(shù)mock呀,doctest沒(méi)有g(shù)mock這樣的mock庫(kù)。是的,doctest確實(shí)沒(méi)有mock庫(kù),但是doctest很容易和其它現(xiàn)代C++的mock庫(kù)結(jié)合起來(lái)使用,比如FakeIt。

現(xiàn)代C++ mock庫(kù)

FakeIt(https://github.com/eranpeer/FakeIt)是C++11寫的header only的mock庫(kù),用起來(lái)也很方便:

structSomeInterface{
virtualintfoo(int)=0;
virtualintbar(string)=0;
};

Mockmock;

When(Method(mock,foo)).Return(0);

SomeInterface&i=mock.get();

//Productioncode
i.foo(1);

//Verifymethodmock.foowasinvoked.
Verify(Method(mock,foo));

//Verifymethodmock.foowasinvokedwithspecificarguments.
Verify(Method(mock,foo).Using(1));

用doctest+FakeIt兩個(gè)header only的庫(kù)就可以完美替代gtest了。那么還有一個(gè)就是benchmark了,google有一個(gè)benchmark庫(kù)也是需要編譯/安裝的,有沒(méi)有什么現(xiàn)代C++的benchmark庫(kù)來(lái)替代google 的benchmark庫(kù)呢?當(dāng)然有,比如nanobench。

現(xiàn)代C++ benchmark庫(kù)

nanobench(https://github.com/martinus/nanobench)也是C++11寫的header only的庫(kù),使用起來(lái)也很簡(jiǎn)單,包含頭文件即可。

#defineANKERL_NANOBENCH_IMPLEMENT
#include

intmain(){
doubled=1.0;
ankerl::Bench().run("somedoubleops",[&]{
d+=1.0/d;
if(d>5.0){
d-=5.0;
}
ankerl::doNotOptimizeAway(d);
});
}

測(cè)試結(jié)果:

|ns/op|op/s|err%|ins/op|cyc/op|IPC|bra/op|miss%|total|benchmark
|--------------------:|--------------------:|--------:|----------------:|----------------:|-------:|---------------:|--------:|----------:|:----------
|7.52|132,948,239.79|1.1%|6.65|24.07|0.276|1.00|8.9%|0.00|`somedoubleops`

總結(jié)

用現(xiàn)代C++測(cè)試工具鏈:doctest+FakeIt+nanobench, 可以完美地替代gtest/gmock和google bench,沒(méi)有任何依賴,無(wú)需安裝,直接包含頭文件就可以用,非常容易集成和使用,是時(shí)候拋棄google test和google bench了!

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 文件
    +關(guān)注

    關(guān)注

    1

    文章

    579

    瀏覽量

    25359
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2119

    瀏覽量

    75276
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1662

    瀏覽量

    50205

原文標(biāo)題:現(xiàn)代 C++ 測(cè)試工具鏈(是時(shí)候拋棄 gtest/google bench 了)

文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    現(xiàn)代C++項(xiàng)目的最佳實(shí)踐

    本系列是開(kāi)源書C++ Best Practises[1]的中文版,全書從工具、代碼風(fēng)格、安全性、可維護(hù)性、可移植性、多線程、性能、正確性等角度全面介紹了現(xiàn)代C++項(xiàng)目的最佳實(shí)踐。本文是該系列的第三篇。
    發(fā)表于 09-29 11:32 ?1516次閱讀

    C++STL算法(二)

    C++STL算法(二)
    的頭像 發(fā)表于 07-18 14:49 ?1805次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>之</b>STL算法(二)

    c++STL算法(三)

    c++STL算法(三)
    的頭像 發(fā)表于 07-18 15:00 ?2085次閱讀
    <b class='flag-5'>c++</b><b class='flag-5'>之</b>STL算法(三)

    C++文件操作

    C++文件操作
    的頭像 發(fā)表于 07-21 10:52 ?1392次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>之</b>文件操作

    用Visual C++做數(shù)據(jù)庫(kù)開(kāi)發(fā)

    實(shí)驗(yàn) 用Visual C++做數(shù)據(jù)庫(kù)開(kāi)發(fā) 一、實(shí)驗(yàn)?zāi)康?、了解數(shù)據(jù)庫(kù)的訪問(wèn)方式,掌握ADO 方式訪問(wèn)數(shù)據(jù)庫(kù)2、用 Visual C++制作
    發(fā)表于 05-10 10:54 ?2550次閱讀

    c++標(biāo)準(zhǔn)庫(kù)手冊(cè)

    C++的標(biāo)準(zhǔn)庫(kù)手冊(cè),新手學(xué)習(xí)的好資料,同時(shí)也是開(kāi)發(fā)人員的必備手冊(cè)。里面涵蓋了標(biāo)準(zhǔn)C++的所有的庫(kù)函數(shù)。
    發(fā)表于 11-03 14:05 ?43次下載

    The C++ Standard Library

    C++標(biāo)準(zhǔn)庫(kù)英文版。 C++強(qiáng)大的功能來(lái)源于其豐富的類庫(kù)及庫(kù)函數(shù)資源。
    發(fā)表于 05-13 14:41 ?0次下載

    Linux下C/C++編譯器gcc使用指南

    1.gcc包含的c/c++編譯器 gcc,cc與c++,g++ gcc和cc是一樣的,c++和g++是一樣的。一般c程序就用gcc編譯,
    發(fā)表于 11-02 10:59 ?0次下載

    C語(yǔ)言和C++的特點(diǎn)與用法詳細(xì)說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是C語(yǔ)言和C++的特點(diǎn)與用法詳細(xì)說(shuō)明。
    的頭像 發(fā)表于 12-26 10:58 ?4814次閱讀

    doctest基本用法

    現(xiàn)代C++測(cè)試工具鏈:doctest+FakeIt+nanobench, 可以完美地替代gtest/gmock和google bench,沒(méi)有任何依賴,無(wú)需安裝,直接包含頭文件就可以用,非常容易集成和使用,是時(shí)候拋棄googl
    發(fā)表于 08-05 10:43 ?1356次閱讀

    C++設(shè)計(jì)新思維-泛型編程與設(shè)計(jì)應(yīng)用

    C++設(shè)計(jì)新思維-泛型編程與設(shè)計(jì)應(yīng)用
    發(fā)表于 11-16 15:59 ?3次下載

    C++學(xué)習(xí)筆記c++的基本認(rèn)識(shí)

    自這篇文章我們即將開(kāi)始C++的奇幻之旅,其內(nèi)容主要是讀C++ Primer的總結(jié)和筆記,有興趣可以找原版書看看,對(duì)于學(xué)習(xí)C++還是有很大幫助的。這篇文章將從一個(gè)經(jīng)典的程序開(kāi)始介紹C++
    的頭像 發(fā)表于 03-17 13:57 ?976次閱讀

    C++學(xué)習(xí)筆記順序容器

    C++中的順序容器是一種用于存儲(chǔ)和管理元素序列的數(shù)據(jù)結(jié)構(gòu)。它們提供了一組有序的元素,并支持在序列的任意位置插入和刪除元素。C++標(biāo)準(zhǔn)庫(kù)中提供了多種順序容器,包括vector、deque、list、forward_list和arr
    的頭像 發(fā)表于 05-11 17:05 ?867次閱讀

    CC++編寫環(huán)境下LabVIEW如何調(diào)用動(dòng)態(tài)庫(kù)?

    C語(yǔ)言編寫的動(dòng)態(tài)鏈接庫(kù)相比,不同的地方在于extern int “C” __declspec(dllexport) add(int x,int y) 這一導(dǎo)出語(yǔ)句,在C代碼中沒(méi)有”
    發(fā)表于 06-11 09:15 ?9193次閱讀
    <b class='flag-5'>C</b>和<b class='flag-5'>C++</b>編寫環(huán)境下LabVIEW如何調(diào)用動(dòng)態(tài)<b class='flag-5'>庫(kù)</b>?

    C++之父新作帶你勾勒現(xiàn)代C++地圖

    為了幫助大家解決這些痛點(diǎn)問(wèn)題,讓大家領(lǐng)略現(xiàn)代C++美,掌握其中的精髓,更好地使用C++C++之父Bjarne Stroustrup坐不住
    的頭像 發(fā)表于 10-30 16:35 ?1292次閱讀
    <b class='flag-5'>C++</b>之父新作帶你勾勒<b class='flag-5'>現(xiàn)代</b><b class='flag-5'>C++</b>地圖