国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

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開發自動化打渠道包

2012-03-05 12:17:24

H3C機場定制化

2015-02-27 11:35:20

云平臺云測試自動化測試

2016-09-26 16:42:19

JavaScript前端單元測試

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技術棧公眾號

亚州av电影免费在线观看 | 九色91在线视频| 无套内精的网站| 欧美色综合影院| 精品av中文字幕在线毛片| 91免费国产视频网站| 中文字幕在线日韩 | 在线观看污视频| 国产91久久久久蜜臀青青天草二| 国产一区二区三区站长工具| 亚洲3atv精品一区二区三区| 国产精品av网站| 国产在线观看黄| 久久aⅴ乱码一区二区三区| 欧美三级在线看| 樱花www成人免费视频| 国产又色又爽又黄刺激在线视频| 日本一区二区免费在线| 国产欧美精品xxxx另类| 在线āv视频| 中文字幕欧美日韩一区| 成人亲热视频网站| 亚洲美女炮图| 中文字幕一区二区5566日韩| 波多野结衣久草一区| 蜜臀91精品国产高清在线观看| 99麻豆久久久国产精品免费| 精品国模在线视频| av天在线观看| 不卡的看片网站| 五月婷婷综合激情| 情趣网站在线观看| 国产精品久久久久久久app| 欧美高清一级片在线观看| 国产偷国产偷亚洲高清97cao| 国产在线一二三| 免费成人在线视频观看| 国产日本欧美视频| 四季av一区二区凹凸精品| 国产成人小视频在线观看| 日韩国产一区二区| 免费在线成人| 自拍偷拍一区二区三区四区| 精品国产乱码久久久久久图片 | 欧美在线激情视频| 国产在线日韩欧美| 免费黄色在线看| 亚洲欧美日韩国产中文| 精品美女一区| 午夜精品久久久久久久99热浪潮| 少妇精品久久久| 国产欧美一区二区三区四区 | 国产精品大片免费观看| 国产精品99免视看9| 亚洲精品资源| 国产免费xxx| 亚洲精品在线观看91| 中文字幕亚洲专区| 超碰在线免费公开| 日韩一区二区中文字幕| 亚洲区小说区图片区qvod按摩| 草莓污污视频在线观看| 日韩精品中文字幕有码专区| 亚洲欧美日韩国产综合精品二区| 99reav2| 亚洲成a人v欧美综合天堂下载| 日本在线视频1区| 亚洲色图综合网| 青青草国产成人a∨下载安卓| 欧美一级高清免费播放| 亚洲人成久久| 性欧美高清come| 97超碰在线资源站| 日韩一区二区精品在线观看| 99久久香蕉| 免费高清一区二区三区| 亚洲免费观看在线观看| 男人的天堂avav| 68精品久久久久久欧美| www.成人在线.com| 亚洲网站在线观看| 欧美日韩破处| 999精品视频一区二区三区| 国产成人av| 99re在线国产| 国产成人高清视频| 中文字幕在线免费观看| 欧美日韩中字一区| 国产精品电影| 国产99久久精品一区二区永久免费 | 国产视频精品久久久| 日本伊人久久| 五月天色一区| 一区二区三区在线播| 性爱视频在线播放| 国产精品制服诱惑| 日韩二区在线观看| 蜜桃麻豆91| 精品一区二区影视| 在线精品日韩| 无吗不卡中文字幕| 日韩一区二区在线免费| 小黄鸭精品aⅴ导航网站入口| 999sesese| 911国产精品| 哺乳一区二区三区中文视频| 日韩精品伦理第一区| 亚洲免费观看高清完整版在线观看熊 | 丁香花视频在线观看| 亚洲电影免费观看| 精品少妇av| 欧美精品一区二区三区免费播放| 久久亚洲精品中文字幕冲田杏梨| 欧美日韩日本国产| 成人在线国产| 欧美黄页免费| 精品自拍一区| 看电影就来5566av视频在线播放| 9久久9毛片又大又硬又粗| 日韩精品在线免费观看视频| 久久精品欧美日韩精品| 精品视频一区二区三区四区五区| 婷婷亚洲婷婷综合色香五月| 疯狂欧美牲乱大交777| 国产午夜伦鲁鲁| 精品女厕一区二区三区| 99蜜月精品久久91| 成a人片在线观看| 久久精品中文字幕一区二区三区 | 天天综合国产| 被灌满精子的波多野结衣| 日韩三级免费观看| 麻豆一区在线| 中文字幕在线中文字幕二区| 欧美成人合集magnet| 91在线一区二区三区| 999久久久国产999久久久| 亚洲国产精品日韩| 欧美成人激情免费网| 六月天综合网| 国产资源在线看| 视频一区亚洲| 久久久久久久999精品视频| 国产精品久久久久久户外露出| 欧美肉体xxxx裸体137大胆| 免费yellow网站| 国产成人jvid在线播放| 粉嫩蜜臀av国产精品网站| 日本电影在线观看网站| 久久精品国产亚洲精品| 国产美女精品人人做人人爽 | 成人免费在线电影网| 欧美激情在线观看视频| 久久综合av免费| 桃子视频成人app| 亚洲色成人一区二区三区小说| 亚洲精品福利资源站| 国产高清在线精品| 成人免费无遮挡| 第三区美女视频在线| 美女黄毛**国产精品啪啪| 伊人亚洲福利一区二区三区| 在线视频一区二区三| 久久国产精品成人免费观看的软件| 欧美成人中文字幕在线| 亚洲嫩模很污视频| 亚洲黄色免费三级| 欧美日韩日日夜夜| 91精品国产综合久久香蕉麻豆| 欧美成人aa大片| 欧美综合在线第二页| 你懂的视频在线一区二区| 国产精品亚洲片夜色在线| 欧美日韩一区精品| 狠狠干狠狠久久| 男女视频网站免费观看| 亚洲 日韩 国产第一区| 欧美制服第一页| 99c视频在线| 国产精品美女www爽爽爽视频| 午夜dj在线观看高清视频完整版| 成人羞羞国产免费| 欧美日韩一二三| 国产乱淫av一区二区三区| 国产极品久久久久久久久波多结野| 女人喷潮完整视频| 青青久久av北条麻妃黑人| 亚洲国产aⅴ成人精品无吗| 欧美a级片网站| 日本视频一区二区不卡| 亚洲一二三在线| 中日韩av电影| 在线观看的日韩av| 精品众筹模特私拍视频| 五月天亚洲视频| 成人性生交大片免费观看嘿嘿视频| 欧美午夜精品一区| 99热在这里有精品免费| 韩国av电影免费观看| 日韩国产欧美一区|