亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

蟲蟲首頁| 資源下載| 資源專輯| 精品軟件
登錄| 注冊

您現在的位置是:首頁 > 技術閱讀 >  現代C++測試工具鏈(是時候拋棄gtest/google bench了)

現代C++測試工具鏈(是時候拋棄gtest/google bench了)

時間:2024-02-09

gtest的問題

gtest需要安裝有時候帶來很多不方便,比如需要經常切換gcc和clang的時候就比較麻煩,安裝的gtest可能在另一個編譯器下編譯不過, 編寫跨平臺程序的時候需要多次安裝gtest,非常不便。另外一個問題是網絡原因,下載安裝gtest或者git上拉gtest都可能因為網絡原因失敗。

現代C++ unit test庫

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

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

doctest基本用法

#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
#include "doctest.h"

TEST_CASE("vectors can be sized and resized") {
std::vector<int> v(5);

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

SUBCASE("adding to the vector increases it's size") {
v.push_back(1);

CHECK(v.size() == 6);
CHECK(v.capacity() >= 6);
}
SUBCASE("reserving increases just the capacity") {
v.reserve(6);

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

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

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

doctest的斷言宏

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

<LEVEL> is one of 3 possible: REQUIRE/CHECK/WARN.

<LEVEL>_EQ(left, right) - same as <LEVEL>(left == right)
<LEVEL>_NE(left, right) - same as <LEVEL>(left != right)
<LEVEL>_GT(left, right) - same as <LEVEL>(left > right)
<LEVEL>_LT(left, right) - same as <LEVEL>(left < right)
<LEVEL>_GE(left, right) - same as <LEVEL>(left >= right)
<LEVEL>_LE(left, right) - same as <LEVEL>(left <= right)
<LEVEL>_UNARY(expr) - same as <LEVEL>(expr)
<LEVEL>_UNARY_FALSE(expr) - same as <LEVEL>_FALSE(expr)

判斷異常的宏

CHECK_THROWS_AS(func(), const std::exception&);
CHECK_THROWS_AS(func(), std::exception); // same as above

CHECK_THROWS_WITH(func(), "invalid operation!");

CHECK_THROWS_WITH_AS(func(), "invalid operation!", std::runtime_error);

<LEVEL>_NOTHROW(expression)

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

也許有人會說gtest除了這些基本的測試斷言之外還有gmock呀,doctest沒有gmock這樣的mock庫。是的,doctest確實沒有mock庫,但是doctest很容易和其它現代C++的mock庫結合起來使用,比如FakeIt。

現代C++ mock庫

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

struct SomeInterface {
virtual int foo(int) = 0;
virtual int bar(string) = 0;
};

Mock<SomeInterface> mock;

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

SomeInterface &i = mock.get();

// Production code
i.foo(1);

// Verify method mock.foo was invoked.
Verify(Method(mock,foo));

// Verify method mock.foo was invoked with specific arguments.
Verify(Method(mock,foo).Using(1));

用doctest+FakeIt兩個header only的庫就可以完美替代gtest了。那么還有一個就是benchmark了,google有一個benchmark庫也是需要編譯/安裝的,有沒有什么現代C++的benchmark庫來替代google 的benchmark庫呢?當然有,比如nanobench。

現代C++ benchmark庫

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

#define ANKERL_NANOBENCH_IMPLEMENT
#include <nanobench.h>

int main() {
double d = 1.0;
ankerl::nanobench::Bench().run("some double ops", [&] {
d += 1.0 / d;
if (d > 5.0) {
d -= 5.0;
}
ankerl::nanobench::doNotOptimizeAway(d);
});
}

測試結果:

|               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 | `some double ops`

總結

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


    出自:purecpp

    來源:www.purecpp.org


亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品一区=区| 亚洲高清在线| 香蕉成人伊视频在线观看| 99综合电影在线视频| 国产精品国产三级国产aⅴ入口| 欧美韩国日本一区| 国产精品老女人精品视频| 黄色小说综合网站| 亚洲精品影院| 久久久91精品国产一区二区三区 | 国产精品视频| 有码中文亚洲精品| 亚洲伊人网站| 欧美激情bt| 国产婷婷精品| 亚洲一区二区三区777| 另类春色校园亚洲| 国产亚洲欧美日韩美女| 9国产精品视频| 久久一区二区三区av| 国产精品美女久久久久av超清| 亚洲电影免费| 久久成人一区| 国产精品久久久久aaaa樱花| 亚洲啪啪91| 久久综合五月| 伊人精品久久久久7777| 久久丁香综合五月国产三级网站| 久久久精品一品道一区| 国产精品www994| 亚洲精品一区二区网址| 另类人畜视频在线| 亚洲成色精品| 久久人人97超碰精品888| 国产精品一二一区| 午夜精品久久久久久 | 亚洲黄色影片| 久久精品免费电影| 国产欧美一区二区精品仙草咪| 中文在线不卡| 国产精品www网站| 99视频精品在线| 欧美日韩精品二区| 一区二区三区黄色| 欧美特黄一级| 亚洲午夜羞羞片| 国产精品视频第一区| 亚洲欧美成人精品| 国产精品日本一区二区| 欧美一级视频一区二区| 国产精品视频午夜| 久久av在线| 欧美视频在线免费看| 亚洲字幕在线观看| 国产日韩欧美在线一区| 久久这里有精品15一区二区三区| 在线日韩成人| 欧美日韩高清在线播放| 一区二区激情视频| 国产精品日韩在线观看| 久久久久国产精品www| 亚洲国产精品第一区二区| 欧美激情成人在线| 亚洲制服av| 激情久久五月| 欧美黑人一区二区三区| 亚洲一级在线观看| 尤物网精品视频| 欧美日韩精品在线观看| 欧美一区二区三区久久精品茉莉花 | 欧美人在线视频| 亚洲综合另类| 国产字幕视频一区二区| 牛牛国产精品| 亚洲欧美国产一区二区三区| 在线观看视频日韩| 国产精品稀缺呦系列在线| 亚洲精品视频在线| 国产裸体写真av一区二区| 久久一区视频| 亚洲综合视频一区| 在线电影欧美日韩一区二区私密| 国产精品成人一区二区| 免费一级欧美在线大片| 欧美亚洲视频在线观看| 91久久视频| 国模私拍视频一区| 国产精品美女主播| 欧美日韩国产综合视频在线观看中文 | 欧美在线观看视频一区二区| 亚洲黄色毛片| 国模 一区 二区 三区| 国产精品亚洲欧美| 欧美日韩精品在线播放| 欧美成人三级在线| 久久先锋影音| 久久精品99国产精品| 亚洲影院污污.| 亚洲精品视频免费| 亚洲国产天堂久久综合| 黄色成人av网| 国内外成人在线| 国产嫩草一区二区三区在线观看| 欧美日韩一级视频| 欧美人成免费网站| 欧美第一黄色网| 米奇777超碰欧美日韩亚洲| 久久久国产精品一区| 久久黄色网页| 欧美一级在线亚洲天堂| 欧美一区二区三区播放老司机| 性做久久久久久| 欧美在线视频一区| 久久成人综合网| 久久成人免费网| 久久亚裔精品欧美| 久色成人在线| 欧美国产在线视频| 欧美午夜视频在线| 国产精品日韩久久久| 国产精品久在线观看| 国产精品一级| 国产欧美一区二区精品性| 国产精品自拍一区| 久久夜色精品| 欧美不卡视频| 欧美日韩国产精品一区二区亚洲| 欧美日韩久久不卡| 国产精品久久久久久久久免费| 国产精品嫩草久久久久| 国内精品视频一区| 亚洲国产成人一区| 宅男噜噜噜66一区二区66| 欧美一区二区三区在线看| 午夜视频一区二区| 欧美va日韩va| 欧美日韩在线一区二区| 国产日韩一区二区三区| 日韩午夜三级在线| 久久激情婷婷| 欧美午夜一区二区| 黄色av一区| 亚洲少妇最新在线视频| 久久午夜影视| 国产精品高精视频免费| 国产欧美日韩视频一区二区| 亚洲区在线播放| 亚洲一区二区欧美日韩| 欧美在线观看视频一区二区三区| 久久午夜国产精品| 国产精品毛片大码女人| 亚洲人成在线影院| 久久久久国产精品午夜一区| 国产精品免费一区豆花| aa日韩免费精品视频一| 美女成人午夜| 雨宫琴音一区二区在线| 欧美一区二区三区日韩视频| 国产精品成人国产乱一区| 一二三四社区欧美黄| 欧美黄色影院| 亚洲国产精品久久| 久久久综合激的五月天| 国产亚洲欧美激情| 欧美在线不卡视频| 国产女同一区二区| 亚洲欧美激情精品一区二区| 欧美日韩一区二区在线| 一本大道av伊人久久综合| 欧美日韩1区| 国产视频亚洲| 久久狠狠亚洲综合| 韩日成人av| 裸体素人女欧美日韩| 国精品一区二区| 久久久久国产精品麻豆ai换脸| 国产一区二区三区av电影| 午夜精品国产更新| 国产日韩精品一区二区三区 | 亚洲欧洲综合| 欧美精品三级日韩久久| 久久综合成人精品亚洲另类欧美 | 国产精品另类一区| 国产一区二区精品久久| 亚洲精品资源| 亚洲一区www| 欧美特黄视频| 亚洲三级色网| 欧美有码在线视频| 国产精品久久久久久亚洲毛片| 亚洲国产裸拍裸体视频在线观看乱了中文 | 香蕉久久夜色精品国产使用方法| 久久免费视频网站| 国产精品永久免费观看| 欧美一二三区精品| 欧美视频在线观看| 亚洲黄网站在线观看| 久久久久久电影| 亚洲欧洲精品成人久久奇米网| 久久综合一区二区|