精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

xxxx黄色片| 日韩视频在线视频| 99久久久久久久| 在线成人www免费观看视频| 日韩久久午夜影院| 国产喷水theporn| 手机av在线播放| 久久久久国色av免费看影院| 成人精品一区二区三区| 精品无码人妻一区二区三区| 国产亚洲电影| 日韩欧美一区二区不卡| 国产熟人av一二三区| 亚洲91av| 国产精品卡一卡二卡三| 国产欧美在线一区二区| 6—12呦国产精品| 国产一区二区三区的电影 | 亚洲午夜激情| 欧美肥妇毛茸茸| 久久久久久久久久久免费视频| 成人在线播放免费观看| 国产欧美日韩另类视频免费观看| 国产精品国产三级国产专区53| 中文字幕一区二区三区人妻四季 | 亚洲国产精品精华液ab| 好吊妞www.84com只有这里才有精品| 夜夜躁日日躁狠狠久久av| 国模一区二区三区| 久久久91精品国产一区不卡| 欧洲av一区二区三区| 欧美爱爱网站| 亚洲成人黄色在线观看| 亚洲色图偷拍视频| 久久av日韩| 91极品视觉盛宴| 女人和拘做爰正片视频| 国产美女情趣调教h一区二区| 国产精品久久一卡二卡| 亚洲精品白虎| 福利片在线观看| 久久美女高清视频| 久久99精品国产一区二区三区| 国产日本精品视频| 精品午夜久久福利影院| 国产欧美日韩亚洲精品| 成人黄色三级视频| 日韩国产欧美视频| 国产高清在线不卡| 免费又黄又爽又猛大片午夜| 欧美专区18| 青青久久aⅴ北条麻妃| www.中文字幕在线观看| 国产精品视频| 欧美最顶级的aⅴ艳星| 欧美日韩一二三四区| 亚洲综合精品| 国产91成人在在线播放| 天天干天天干天天干天天| 激情黄产视频在线免费观看| 天堂av资源在线观看| 国产精品久久久久久久久晋中 | 久热精品在线视频| 国产精品白丝喷水在线观看| 亚洲成人一区| 欧美日韩福利在线观看| 久久久久久久蜜桃| 一本色道久久综合亚洲精品不卡| 欧美在线视频a| 国产精品乱码一区二区视频| 麻豆一区二区在线| 91精品视频一区| 午夜精品久久久久久久96蜜桃 | 久久精品国语| 国产精品视频不卡| 99久久精品国产色欲| 成人av在线资源| 久久久影院一区二区三区| 黄色片在线播放| 亚洲品质自拍视频| 亚洲中文字幕无码av永久| 日本综合字幕| 在线成人午夜影院| 欧亚乱熟女一区二区在线 | 五月天男人天堂| 午夜伦理在线视频| 欧美性猛交xxxx久久久| 亚洲欧美aaa| 精品网站aaa| 在线色欧美三级视频| 北条麻妃在线观看视频| 亚洲黄色视屏| 国产成人综合久久| 国产av无码专区亚洲a∨毛片| 99精品国产91久久久久久| 亚洲高清视频在线观看| 国产99re66在线视频| 在线观看亚洲成人| 岛国精品一区二区三区| 精品国产aⅴ| 久久人人爽人人爽人人片av高请 | 欧美一区二区精美| 18禁裸乳无遮挡啪啪无码免费| 91久久夜色精品国产按摩| 2021国产精品视频| 99热这里只有精| 日本一区二区不卡视频| 精品视频免费在线播放| 国产精品欧美一区二区三区不卡| 亚洲精品中文字幕av| www.av成人| 日韩av网站免费在线| 国产视频精品网| 动漫一区在线| 在线观看欧美日本| 亚洲欧美日本一区| 欧美日本一区| 成人中文字幕+乱码+中文字幕| 亚洲人视频在线观看| 亚洲自拍欧美精品| 日本精品一区在线| 色97色成人| 国产91精品网站| 无码精品人妻一区二区| 亚洲主播在线观看| 国产大片一区二区三区| 成人嘿咻视频免费看| 欧美亚洲在线视频| 特黄视频在线观看| 亚洲国产裸拍裸体视频在线观看乱了 | 日韩欧美视频在线| 免费成年人视频在线观看| 久久国产综合精品| 视频一区不卡| 日韩高清不卡| 国产性猛交xxxx免费看久久| 日本午夜视频在线观看| 成人av资源在线观看| a级黄色小视频| 国产极品模特精品一二| 欧美激情欧美激情在线五月| a天堂在线观看视频| 亚洲天堂久久久久久久| 亚洲欧美天堂在线| 91精品国产91久久综合| 成人欧美一区二区三区在线| 九色porny丨首页在线| 91精品国产综合久久久久久漫画| 黄色av片三级三级三级免费看| 日韩av中文在线观看| 天天好比中文综合网| 99久久er| www.精品av.com| 午夜精品久久久久久久第一页按摩| 17c精品麻豆一区二区免费| 一区二区久久精品| 亚洲欧美综合| 国产精品一区二区不卡视频| 美女露胸视频在线观看| 国产婷婷成人久久av免费高清| 中文字幕第15页| 国产亚洲欧美激情| 日韩欧美国产片| 欧美阿v一级看视频| 国产福利一区二区三区在线观看| xxx在线免费观看| 日韩精品中文字幕有码专区| 国产熟妇一区二区三区四区| 国产精品色哟哟网站| 超碰在线免费av| 亚洲美女少妇无套啪啪呻吟| 免费成人av网站| 日韩一区二区三免费高清在线观看| www国产精品视频| 高清毛片aaaaaaaaa片| 欧美日韩国产一区二区| 久久久久久国产免费a片| 精品影视av免费| cao在线观看| 欧美丝袜丝交足nylons172| 91麻豆桃色免费看| 美女高潮在线观看| 日韩专区中文字幕| 色欲av伊人久久大香线蕉影院| 一本大道av一区二区在线播放| 91香蕉视频污在线观看| 国产不卡在线视频| 天天天干夜夜夜操| 国产精品v亚洲精品v日韩精品 | 影音先锋国产精品| 欧美精品一区二区三区在线看午夜| 亚洲精品三区| 69久久夜色精品国产7777| 岛国视频免费在线观看| 日韩欧美一卡二卡| 成人黄色激情视频| 午夜精品久久久久久久99樱桃 | 亚洲成人日韩| 欧美日韩一区二区视频在线 | 欧美成人黑人| 美女少妇精品视频| 精品乱码一区二区三四区视频| 欧美一区二区大片| 波多野结衣高清在线| 亚洲午夜在线视频| 美女网站视频色| xfplay精品久久| 亚洲少妇一区二区三区| 久久国产成人午夜av影院| 欧美日韩在线视频一区二区三区| 97精品国产| 欧美精品一区二区视频| 成人av资源网址| 亚洲最大av网| 国产精品原创视频| 日av在线播放中文不卡| 女子免费在线观看视频www| 视频在线观看99| 国产免费永久在线观看| 日韩精品中文字| 天堂av资源网| 亚洲国产精品视频在线观看 | 不卡的av中国片| 日韩av影视大全| 美国毛片一区二区| 欧美一级黄色影院| 免费在线成人| 日韩在线综合网| 在线观看日韩av电影| 91精品国产吴梦梦| 国产高清一区| 欧美日韩在线免费观看视频| 超碰成人久久| 亚洲国产精品综合| 欧美日韩激情在线一区二区三区| 精品亚洲欧美日韩| 欧美丝袜足交| 精品午夜一区二区| 亚洲另类春色校园小说| 免费不卡亚洲欧美| 九九视频免费观看视频精品| 久久99精品久久久久久久青青日本 | 精品欧美一区二区在线观看视频| 视频在线观看免费影院欧美meiju| 91精品中国老女人| 视频一区在线| 国产精品久久久久久免费观看| 97色成人综合网站| 国产伦精品一区二区三区照片| 久久悠悠精品综合网| 精品综合久久| 国产不卡一二三区| 亚洲激情图片| 亚洲破处大片| 美女扒开大腿让男人桶| 亚洲精品韩国| 无码aⅴ精品一区二区三区浪潮 | 国产欧美日韩中文字幕在线| 一区在线不卡| 成人三级在线| 天天久久夜夜| 亚洲成人一区二区三区| 亚欧美无遮挡hd高清在线视频| 无码人妻aⅴ一区二区三区日本| 欧美激情aⅴ一区二区三区| 免费人成自慰网站| 免费看的黄色欧美网站| 天天干天天操天天玩| 黄页视频在线91| 国产免费a级片| 久久先锋资源网| 午夜国产福利视频| 亚洲丰满少妇videoshd| 日韩精品成人免费观看视频| 欧美日韩久久一区二区| 国产jzjzjz丝袜老师水多| 亚洲第一黄色网| av在线电影网| 欧美激情第99页| 亚洲天堂一区二区| 91在线中文字幕| 亚洲欧美成人vr| 青青视频免费在线观看| 国产手机视频一区二区| 亚洲精品www.| 99re在线精品| 丝袜 亚洲 另类 欧美 重口| 精品成人在线视频| 亚洲特级黄色片| 亚洲国产成人精品久久| 91精彩在线视频| 海角国产乱辈乱精品视频| 欧美一级大黄| 国产精品视频免费一区二区三区| 国产精品欧美三级在线观看| 51xx午夜影福利| 日韩精品亚洲专区| 中文字幕视频观看| 中文字幕制服丝袜一区二区三区| 国语对白一区二区| 欧美精选午夜久久久乱码6080| 日本精品一区二区在线观看| 色婷婷**av毛片一区| 丝袜诱惑一区二区| 91精品国产高清久久久久久91裸体| 一区二区小说| 东北少妇不带套对白| 国内精品写真在线观看| 国产精品天天干| 欧美日韩国产精品一区二区三区四区 | www.国产精品一二区| 成人做爰视频www网站小优视频| 97神马电影| 97精品视频在线看| 97公开免费视频| 91久色porny| 日本免费一二三区| 日韩一级黄色片| 日本在线视频站| 国产精品第一第二| 美日韩中文字幕| 日韩av综合在线观看| 国产91精品一区二区| 永久免费看片直接| 欧美三级中文字幕| 九九九伊在人线综合| 97在线看免费观看视频在线观看| 一级毛片精品毛片| 成人午夜视频免费观看| 国产一区二区影院| 日韩在线一卡二卡| 在线播放亚洲一区| 欧美成人视屏| 成人a在线视频| 国产精品7m凸凹视频分类| 国产成人黄色网址| 中文字幕乱码一区二区免费| 国产字幕在线观看| 亚洲人午夜色婷婷| 欧美色999| 视频一区不卡| 久久99精品久久久久久国产越南| 99精品全国免费观看| 欧美日韩一级大片网址| а√天堂中文在线资源bt在线| 国产成人精品电影久久久| 国产一区毛片| 污片在线免费看| 国产精品超碰97尤物18| 国产情侣激情自拍| 欧美国产高跟鞋裸体秀xxxhd| 日韩综合一区二区三区| 日韩精品 欧美| 久久免费电影网| 中文在线资源天堂| 久久久极品av| 大奶一区二区三区| 一本大道熟女人妻中文字幕在线 | 日韩视频在线免费播放| 国产精品中文字幕欧美| 久久精品久久国产| 亚洲精品美女网站| 天天免费亚洲黑人免费| 亚洲国产激情一区二区三区| 国产一区啦啦啦在线观看| 久久午夜鲁丝片午夜精品| 日韩av在线网| 色猫猫成人app| 亚洲图片都市激情| 粉嫩绯色av一区二区在线观看| 日本少妇激情视频| 亚洲天天在线日亚洲洲精| 日韩美女在线| 国产一线二线三线女| 久久精品亚洲麻豆av一区二区| 伊人网综合在线| 久久久久久久网站| 国产欧美日韩精品一区二区三区 | 美女黄色片视频| 亚洲精品一二三| 青青草手机在线| 成人国产精品日本在线| 亚洲精品社区| 国产在线观看免费视频软件| 欧美变态tickling挠脚心| 毛片无码国产| 国产日产欧美一区二区| 久久香蕉国产线看观看99| av片免费播放| 国产成人久久久精品一区| 欧美精品大片| 亚洲精品乱码久久久久久久久久久久 | 秋霞视频一区二区| 国产精品久久久久一区二区| 欧美三级网页| 日本爱爱小视频| 亚洲欧洲日产国产网站| 日韩精品中文字幕吗一区二区| 三级4级全黄60分钟| 亚洲一区二区三区中文字幕在线|