精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C/C++ 單元自動化測試解決方案實踐

開發
本文主要介紹如何利用GCC插件來實現提升C/C++開發者的單元效率工具解決方案,希望對大家在提升單元測試效率上有所啟發。

作者 | vivo 互聯網服務器團隊 - Li Qingxin

C/C++ 開發效率一直被業內開發人員詬病,單元測試開發效率也是如此,以至于開發人員不愿花時間來寫單元測試。那么我們是不是可以通過改善編寫單元測試的效率來提升項目的測試用例覆蓋率?

本文主要介紹如何利用GCC插件來實現提升C/C++開發者的單元效率工具解決方案,希望對大家在提升單元測試效率上有所啟發。

一、動機

上圖展示了C/C++單元測試的基本流程,在日常開發過程中寫單元測試是一項比較大工程量的事情,C/C++ 目前單元測試代碼都需要自己手動寫,而且對于一些私有方法打樁就更加麻煩。

目前業內無開源的自動化測試框架或者工具,倒是有一些商業的自動測試工具,下圖展示了我們自動化測試工具及單元測試庫:

即使開源界有gtest等測試庫的支持,我們仍然需要編寫大量的單元測試用例代碼。對于一些private、protected的類方法,編寫單元測試用例的效率就更低,需要手動打樁(mock)。同時我們分析測試用例發現,存在很多邊界的用例,它們基本上都是很固定或者有一定模式,比如int 最大最小值等。

如何改善編寫單元測試的效率,提升C/C++同學開發效率以及程序質量?我們可以通過提取源文件中的函數、類等信息,然后生成對應的單元測試用例。自動生成用例時需要依賴函數的聲明、類的聲明等信息,那么我們應該如何獲取這些信息呢?

例如:如下的函數定義:

void test(int arg) {}

我們希望能夠從上面的函數定義中得到函數的返回值類型、函數名稱、函數參數類型、函數作用域。通常我們可以通過以下幾種方式得到:

1.1 方法1:使用正則表達式

無奈C/C++ 格式比較復雜能夠雖然能夠使用多種組合來獲取對應的函數聲明等信息:

 void test(int arg){}
void test1(template<template<string>> arg,...){}
void test2(int(*func)(int ,float,...),template<template<string>> arg2){}

那么就需要寫一系列的正則表達式:

  • 提取函數名稱、參數名:[z-aA-Z_][0-9]+
  • 提取函數返回值:^[a-zA-Z_]

關鍵詞提取出來了,但是他有一個很大的問題:怎么判斷文件中書寫的代碼是符合C/C++語法描述呢?

1.2 方法2:使用flex/bison 分析c/c++源碼文件

這當然是一種很好的方式,但是工作量巨大,相當于實現一個具備詞法、語法分析器簡易版本的編譯器,而且要適配不同的語法格式,雖然bison可以解決上述的如何判斷語法是否正確問題,但是仍然很復雜。

1.3 方法3:利用編譯已經生成的AST 來生成代碼

通常我們了解到的GCC編譯的過程是以下四個階段:

源文件->預處理->編譯->匯編→鏈接

但實際上GCC為了支持更多的編程語言、不同的CPU架構做了很多的優化,如下圖所示:

上圖展示了GCC處理源碼及其他優化過程,在前端部分生成的Generic 語言是gcc編譯過程中為源碼生成的一種與源碼語言無關的抽象語法表現形式(AST)。既然GCC編譯過程中生成了AST樹,那么我們可以通過GCC插件來提取GCC 前端生成的抽象語法樹關鍵信息比如函數返回值、函數名稱、參數類型等。總體難度也很高,一方面業內可參考資料很少,只能通過分析GCC的源碼來分析AST語法樹上的各個節點描述。

本文所描述的自動化生成單元測試用例的解決方案(我們稱之為TU:Translate Unit,后文統稱為TU)就是基于方法3來實現的,下面我們先來看看我們的自動化測試用例解決方案的效果展示。

二、效果展示

2.1 業務代碼零修改, 直接使用TU生成邊界用例

在該用例中我們不需要修改任何業務代碼就能夠為業務代碼生成邊界測試用例,而且函數參數可邊界值實現全排列,大大降低用例遺漏風險。大家可能發現這種沒有做任何修改生成的用例是沒有斷言的,雖然沒有斷言,它仍然能夠幫助發現單元是否會存在邊界值引起coredump。

那么如果想要給他加上斷言、mock函數,是否沒有辦法呢?通過C++11 [[]] 新的屬性語法,只需要在方法聲明或者定義時添加下根據TU的格式添加斷言即可,對業務邏輯無侵入。

2.2 使用注解tu::case生成用戶自定義用例

很多情況下默認生成的邊界測試用例還不能覆蓋到核心邏輯,所以我們也提供tu::case 來給用戶自定義自己的測試用例及斷言。比如有一個int foo (int x,long y) 方法,現在想新增一個測試用例返回值123,函數實參1,1000,那么只要在函數聲明前加入,以下代碼即可:

[[tu::case("NE","123","1","1000")]]

2.3 使用注解tu::mock 自動生成mock方法

開發過程中我們也常需要對某個方法進行mock(即對原有方法設置一個臨時代替方法并且調用方式保持一致),比如某個函數訪問Redis、DB這種情況下進行單元測試往往需要對這些方法進行mock,方便其他函數調用進行單元測試,為了方便進行單元測試我們往往會對其進行mock,所以為了方便開發人員進行快速的mock,所以我們提供了tu::mock 的注解幫助開發同學快速的定義注解,然后TU會自動生成對應的mock函數。例如:現在給foo_read 方法mock一個函數,讓mock的函數返回10:

三、TU實現方案

3.1 AST 是什么?

GENERIC、GIMPLE和RTL三者構成了gcc中間語言的全部,它們以GIMPLE為核心,由GENERIC承上,由RTL啟下,在源文件和目標指令之間的鴻溝之上構建了一個三層的過渡。

GCC在語法分析過程中,所有識別出來的語言部件都用一個叫TREE的變量保存著。這個TREE就是GCC語法樹(AST),這個過程叫做GENERIC。實際上它也是GCC的符號表,因為變量名、類型等等這些信息都由TREE關聯起來。

下面我們通過gcc編譯選項來看下gcc的ast表現形式:

3.2 AST(Abstract syntax tree)

GCC 可以通過添加編譯選項-fdump-tree-all 來生成ast 樹,ast樹文件內容如下:

AST 各個類型描述可以參考:https://gcc.gnu.org/onlinedocs/gccint/Types.html

雖然上圖中簡單看下一下可以發現,gcc這種表現形式節點與節點之間還存在依賴,比較難于理解,沒有clang生成的直觀更容易閱讀。雖然不利于閱讀,但是不影響通過編碼來提取AST信息。

3.3 方案

如上圖所示,我們通過使用不同的插件收集被測試源文件的AST信息、頭文件信息、函數注解(屬性),將這些重要信息保存起來。GCC將用戶注冊插件事件保存到數組中:

然后在編譯構建過程中到就會去查找對應的事件有沒有設置回調方法如果設置則進行調用,TU主要使用以下幾種插件:

  • PLUGIN_INCLUDE_FILE 用于獲取當前文件的所包含的頭文件
  • PLUGIN_OVERRIDE_GATE 用戶獲取普通函數、類
  • PLUGIN_PRE_GENERICIZE 用于獲取模板函數的具現化
  • PLUGIN_ATTRIBUTES 用于實現自定義屬性或者注解(tu::case\tu::mock ....)

GCC 支持的所有插件類型如下圖所示:(摘自gcc 6.3.0 源碼)

四、TU 插件使用的簡易程度對比

如果僅僅只是做邊界測試那么僅需要修改構建的腳本比如cmake 添加對應的插件參數即可。

五、使用TU的優點

  • 接入簡單、邊界單元測試可以做到業務代碼0修改
  • 函數參數可邊界值實現全排列,大大降低用例遺漏風險、減少大量重復性的工作
  • 快速生成用戶自定義用例、mock方法等

六、TU支持的功能

七、總結與展望

1、文章中對比了三種方法自動生成測試用例的方法,下面對這幾種方法進行對比:

2、文章中還主要介紹了TU的功能特點以及基于GCC-AST的實現自動生成測試用例的解決方案。

TU解決方案目前在構建時能夠自動生成測試用例已經極大降低了單元測試門檻提升單元測試覆蓋率,未來我們也希望能夠把TU與IDE相結合,探索更高效便捷的使用方式,通過更加便捷的方式生成指定方法的測試用例。比如通過在函數、方法上,通過快捷鍵生成當前方法的測試用例等。

責任編輯:未麗燕 來源: vivo互聯網技術
相關推薦

2013-05-16 11:07:37

Android開發Android應用自動化測試

2010-02-05 10:16:35

C++斷點無效

2022-08-05 09:30:57

單元測試C++

2021-09-03 09:56:18

鴻蒙HarmonyOS應用

2009-08-19 09:00:48

單元測試框架自動化測試

2010-01-15 14:10:42

C++單元測試

2010-02-06 14:54:11

C++指針漂移

2012-03-19 10:41:33

ibmdw

2014-05-13 13:41:51

iOS開發自動化打渠道包

2016-09-26 16:42:19

JavaScript前端單元測試

2015-02-27 11:35:20

云平臺云測試自動化測試

2012-03-05 12:17:24

H3C機場定制化

2009-08-26 18:17:26

C#基于Object解

2023-11-21 07:21:39

火山引擎計算治理自動化

2014-04-24 13:43:37

CC++單元測試框架

2009-08-07 17:01:22

C#調用QuickTe

2012-03-30 15:52:51

ibmdw

2017-01-16 13:38:05

前端開發自動化

2022-09-12 16:02:32

測試企業工具
點贊
收藏

51CTO技術棧公眾號

热久久这里只有| 成年网站在线视频网站| 欧美一级网址| 国产精品普通话对白| 欧美高清视频一二三区| 久久亚洲免费| 豆国产97在线 | 亚洲| av在线首页| 国产深夜精品| 色999日韩欧美国产| 日韩手机在线观看视频| 三级视频在线看| 欧美精品黄色| 日韩欧美亚洲国产另类 | 在线免费观看av网址| 亚洲一区二区电影| 亚洲欧美国产毛片在线| 成人激情综合网| 国产福利在线导航| 欧美性生活一级| 五月天一区二区三区| 国产精品999| 亚洲精品成人无码熟妇在线| 97超碰免费在线| 成人黄色av网站在线| 欧美精品电影在线| 一边摸一边做爽的视频17国产| 色爱综合区网| 成人手机在线视频| 久久乐国产精品| 尤物网站在线观看| 擼擼色在线看观看免费| 26uuu精品一区二区三区四区在线| 欧美激情亚洲激情| 亚洲毛片亚洲毛片亚洲毛片| 激情av综合| 欧美性猛交xxxxx水多| 欧美日韩一区二区三区在线视频 | 精品福利免费观看| 欧美精品一区二区性色a+v| 亚洲无码久久久久| 亚洲国产一区二区在线观看 | 日本亚洲不卡| 岛国精品视频在线播放| 蜜桃传媒视频麻豆一区| 亚洲国产精品久久久久久6q| 尹人成人综合网| 精品亚洲精品福利线在观看| 激情五月亚洲色图| 日本最黄一级片免费在线| 激情五月婷婷综合| 久久久久久久久电影| 亚洲AV成人无码网站天堂久久| 色诱色偷偷久久综合| 色嗨嗨av一区二区三区| av动漫免费观看| 人妻妺妺窝人体色www聚色窝| 国产精品一国产精品k频道56| 久久久久久久久久久久久久久久久久av | 国产不卡视频在线播放| 国模私拍视频一区| 妺妺窝人体色www在线下载| 国产日韩三级| 欧美性一区二区| 久久亚洲a v| 欧洲亚洲精品视频| 国产一区欧美日韩| 欧美在线亚洲一区| 国产又黄又粗又爽| 亚洲国产精品久久久天堂| 日韩在线观看免费高清| 久久人妻少妇嫩草av无码专区 | 国产精品美女久久久免费| 国产精品亚洲成人| 亚洲一卡二卡在线观看| 一级二级三级欧美| 在线观看免费av网址| 国产二区三区在线| 99视频一区二区| 国产精品美女免费看| 老熟妇一区二区三区| 日韩高清一区在线| 午夜精品一区二区三区在线视| 级毛片内射视频| 香蕉成人app| 欧美午夜在线一二页| 一本岛在线视频| 亚洲性受xxx喷奶水| 亚洲欧美韩国综合色| 中文字幕一区二区在线观看| 国产精品亲子伦对白| yellow视频在线观看一区二区| 日韩在线视频免费播放| 亚洲深爱激情| 国产精品视频久| 精品乱子伦一区二区| 男人的j进女人的j一区| 91po在线观看91精品国产性色| 丁香花五月激情| 粉色视频免费看| 久久久亚洲欧洲日产国码aⅴ| 成人黄色av电影| 新版的欧美在线视频| 久久精品五月天| 欧美一区在线看| 亚洲一区二区国产| 五月开心播播网| 1769国产精品视频| 日韩精品免费视频| 男人网站在线观看| 成人91在线| 中文字幕日韩欧美| 五月婷婷欧美激情| 精品欧美久久| 在线观看久久av| 欧美波霸videosex极品| 极品裸体白嫩激情啪啪国产精品| 国产成人综合精品| 成人爽a毛片一区二区| 国产福利一区二区三区| av在线不卡观看| av在线免费观看网站| 五月综合激情婷婷六月色窝| 中文字幕一区二区在线观看视频| 亚洲tv在线| 亚洲欧美日韩图片| 69xxx免费| 亚洲在线视频| 国产精品偷伦一区二区| 亚洲午夜精品久久久| 91视频免费播放| 欧美日韩不卡在线视频| 黄色在线网站噜噜噜| 日韩欧美精品中文字幕| 亚洲美女高潮久久久| 日韩高清成人在线| 在线观看日韩www视频免费| 日本a在线观看| 老鸭窝91久久精品色噜噜导演| 国产精品精品视频| 99国产在线播放| 成人av第一页| 欧美在线观看视频免费| 蜜桃视频在线观看播放| 欧美成人精品1314www| 日本丰满少妇裸体自慰| 精品免费视频| 国产精品久久久久久久久久久久久久| 神马精品久久| 亚洲欧洲性图库| 男人添女荫道口图片| 秋霞一区二区三区| 色综合久久久888| 69视频免费在线观看| 紧缚奴在线一区二区三区| 色一情一区二区三区四区| 污污网站在线观看| 日韩美女一区二区三区| 久久久久久天堂| 日韩av不卡在线观看| 成人区精品一区二区| 第一福利在线| 亚洲国产精品久久人人爱 | 免费黄视频在线观看| 精品久久97| 国模极品一区二区三区| 欧美剧情电影在线观看完整版免费励志电影 | 男人的天堂一区二区| 日韩高清不卡一区| 艳色歌舞团一区二区三区| 99精品国产九九国产精品| 日韩成人中文字幕| 无码人妻久久一区二区三区不卡| 日本一区二区三级电影在线观看| 精品国产av无码一区二区三区| 69堂免费精品视频在线播放| 欧美精品 国产精品| 久艹在线观看视频| 日日夜夜免费精品视频| 伊人av成人| 精品国模一区二区三区| 亚洲激情国产精品| 精品99在线观看| 99国产精品一区| 国产一区 在线播放| 麻豆精品av| 国产精品男女猛烈高潮激情| av片在线观看永久免费| 欧美色综合网站| 国产人妻一区二区| 中文亚洲免费| 亚洲精品在线免费看| 中文字幕日本一区二区| 欧美成人免费全部观看天天性色| 中文字幕乱码无码人妻系列蜜桃| 久久久综合九色合综国产精品| 成人免费观看在线| 精品国产精品久久一区免费式| 91久久极品少妇xxxxⅹ软件 | 中文字幕无线码一区| 亚洲精品中文在线影院| 国产色视频一区二区三区qq号| 精品夜夜嗨av一区二区三区| 久久久久久久久久网| 日韩中文字幕一区二区高清99| 热久久免费视频精品| 色av手机在线| 丝袜美腿亚洲一区二区| 手机看片一区二区| 欧美日韩第一区日日骚| 99久久99久久精品免费| 波多野结衣中文字幕一区| 一级黄色录像在线观看| 免费亚洲婷婷| 丁香婷婷综合激情| 成人av国产| 青娱乐一区二区| 国产人妖一区| 久久精品中文字幕| 国产v片在线观看| 亚洲国产美国国产综合一区二区| 久久美女免费视频| 99久久精品99国产精品| japan高清日本乱xxxxx| 在线中文一区| 国产精品二区三区| 国产精品视频一区二区三区综合| 久久视频精品在线| 亚洲成人777777| 欧美日本国产视频| 日韩欧美国产另类| 中文字幕一区二区三区不卡| 国产精品无码久久久久一区二区| 丁香桃色午夜亚洲一区二区三区| 国产一级片自拍| 蜜桃91丨九色丨蝌蚪91桃色| 一本久道综合色婷婷五月| 久久国产精品亚洲77777| www.中文字幕在线| 日本一二区不卡| 亚洲综合社区网| 国产精品13p| 久久久久久久国产| bl在线肉h视频大尺度| 欧美高清视频在线播放| 欧美精品a∨在线观看不卡| 欧美丝袜第三区| 波多野结衣黄色网址| 91豆麻精品91久久久久久| 国产99免费视频| 91久久精品一区二区| jizz国产在线观看| 91久久国产综合久久| 欧美三级网站在线观看| 一区二区三区欧美日| 亚欧美一区二区三区| 国产欧美不卡| 欧美牲交a欧美牲交aⅴ免费真| 99精品国产一区二区三区| 国产精品免费在线| 久久亚洲资源中文字| 国产精品中文字幕久久久| 成人在线免费| 91精品久久久久久久久久入口| 91精品国产一区二区在线观看| 91色琪琪电影亚洲精品久久| 欧洲亚洲两性| 欧美黄色性视频| 捆绑调教日本一区二区三区| 日韩男女性生活视频| 国产www视频在线观看| 97视频免费在线观看| 亚洲成人激情社区| 91精品啪在线观看麻豆免费| 麻豆一区在线| 国产精品亚洲第一区| 国产精品久一| 精品中文字幕人| 8x国产一区二区三区精品推荐| 狠狠色综合色区| 精品国产一区二区三区久久久樱花 | 国产jzjzjz丝袜老师水多| 亚洲第一区在线| 国产不卡av在线播放| 亚洲精品aⅴ中文字幕乱码| 成人高清免费在线播放| 久久亚洲私人国产精品va| sm性调教片在线观看| 国产精品免费在线免费| 99ri日韩精品视频| 91嫩草国产在线观看| 欧美成人基地| 亚洲最新免费视频| 亚洲欧美日韩国产一区二区| 久久久精品高清| 99久久国产综合精品色伊| 一二三四在线观看视频| 亚洲成人中文在线| 国产尤物在线观看| 欧美另类变人与禽xxxxx| 免费av一级片| 日韩在线视频免费观看| 天天综合av| 97se亚洲综合| 欧美自拍偷拍第一页| 久久久久久亚洲精品美女| 激情综合网av| 欧美一区二区观看视频| 国产mv久久久| 日本在线啊啊| 成人黄色av免费在线观看| 美女福利一区| 国产手机视频在线观看| 久久久久久黄| 在线播放第一页| 国产精品久久三| 91丝袜一区二区三区| 欧美日韩午夜视频在线观看| 99久久精品国产成人一区二区| 精品在线欧美视频| gogo高清在线播放免费| 91免费在线视频网站| 欧美色图国产精品| 国产成人亚洲精品无码h在线| 国产69精品久久久久777| 日韩精品123区| 一区二区三区在线视频观看| 国产精品高清无码| 国产视频在线观看一区二区| 国产嫩草在线视频| 3d动漫啪啪精品一区二区免费| 日韩精品首页| 亚洲天堂av线| 精品一区二区免费| 日本一区二区三区在线免费观看| 欧美国产一区视频在线观看| 五月婷婷视频在线| 亚洲精品国产免费| 1234区中文字幕在线观看| 高清一区二区三区视频| 欧美99久久| 色欲无码人妻久久精品| 亚洲人成人一区二区在线观看 | www.日本xxxx| 日本一区二区免费在线观看视频| 日本免费在线观看视频| 亚洲人永久免费| 免费观看在线午夜影视| 欧美国产高跟鞋裸体秀xxxhd| 电影一区二区三区久久免费观看| 艳色歌舞团一区二区三区| 精品一区二区三区免费| 午夜剧场免费在线观看| 51久久夜色精品国产麻豆| 手机在线不卡av| 韩国精品久久久999| 人妖一区二区三区| 国产亚洲天堂网| 国产网站一区二区三区| 久久中文字幕在线观看| 精品国产一区a| 成人高清免费在线播放| 国产精品自产拍在线观| 91精品国产自产在线观看永久∴ | 中文字幕亚洲自拍| 日韩深夜福利网站| 波多野结衣 作品| www.久久久久久久久| 天天爽夜夜爽夜夜爽精品| 国产亚洲精品美女久久久| 婷婷精品久久久久久久久久不卡| 精品国产一区二区三区在线| 久久九九精品| www色com| 欧美日韩性视频| av在线第一页| 亚洲xxxxx性| 亚洲专区一区| 久草手机视频在线观看| 精品少妇一区二区三区免费观看| 女人让男人操自己视频在线观看| 日本一区网站| 国产精品一二| 又色又爽的视频| 欧美mv日韩mv国产| japanese23hdxxxx日韩| 在线观看成人免费| 91美女片黄在线观看91美女| 日本一区二区三区久久| 欧美激情一区二区三区高清视频| 爽爽窝窝午夜精品一区二区| 国内国产精品天干天干| 亚洲成a人片综合在线| 国产福利小视频在线观看| 91一区二区三区| 日韩福利电影在线| 久久久久亚洲AV| 色婷婷成人综合| 久久男人av| 樱花草www在线|