只懂黑盒測(cè)試也能學(xué)會(huì)的代碼覆蓋率及精準(zhǔn)化測(cè)試

測(cè)試覆蓋率是對(duì)測(cè)試完成程度的度量绸贡。它通常依據(jù)某種覆蓋準(zhǔn)則來對(duì)測(cè)試用例執(zhí)行情況進(jìn)行衡量闸与,以判斷測(cè)試執(zhí)行得是否充分。??

?——出自《計(jì)算機(jī)科學(xué)技術(shù)名詞 》第三版??


今天文章中我們給大家介紹覆蓋率統(tǒng)計(jì)及覆蓋率分析狰右。在10月13日20:00玖瘸,資深測(cè)試開發(fā)架構(gòu)師思寒將光臨直播間手把手教大家如何搞定精準(zhǔn)化測(cè)試秸讹!??


溫馨提示:你以為代碼覆蓋率與精準(zhǔn)化測(cè)試知識(shí)與黑盒測(cè)試無緣?不雅倒,你只是沒遇到思寒講的這節(jié)課璃诀。






常見覆蓋率統(tǒng)計(jì)工具??






? * emma


? * cobertura


? * jacoco




emma 與 cobertura 是為單元測(cè)試而設(shè)計(jì)的覆蓋率統(tǒng)計(jì),jacoco 與 emma 同屬于一家公司蔑匣,但是是為了更廣泛的覆蓋率統(tǒng)計(jì)而設(shè)計(jì)的工具劣欢。



Jacoco??






jacoco 的文檔中有個(gè) mission 章節(jié),里面對(duì) jacoco

的定位描述的很好裁良。原文的大意是說其他的工具沒有得到積極有效的維護(hù)凿将,而且其他的工具都是為了單一任務(wù)而設(shè)計(jì),他們不是為了 “集成”

而生价脾。從這一點(diǎn)上我們就可以看出 jacoco 的設(shè)計(jì)理念牧抵。




得益于 jacoco 的設(shè)計(jì)理念,以及良好的 api

設(shè)計(jì)侨把,它可以輕松的與已有的工具集成犀变,甚至進(jìn)行平臺(tái)化。它也可以同時(shí)用于單元測(cè)試與集成測(cè)試秋柄,所以是一款非常優(yōu)秀的覆蓋率統(tǒng)計(jì)工具获枝,很多公司的精準(zhǔn)化測(cè)試,就是重度依賴了

jacoco骇笔。



覆蓋率分析原理??






要了解代碼覆蓋率的統(tǒng)計(jì)原理省店,我們就需要去深入了解 jvm 的機(jī)制。這方面的知識(shí)是 java

領(lǐng)域的高端進(jìn)階知識(shí)笨触,限于篇幅萨西,我們只講解下大概的原理,完整內(nèi)容請(qǐng)參考 VM 虛擬機(jī)系列的書籍旭旭,以及 newrelic 早年發(fā)布的若干代碼插樁的資料谎脯。




簡單說下原理,java 源代碼會(huì)被 javac 編譯為 class 文件持寄,class 文件保存了 class 的基本信息與 jvm 的指令集源梭。java

的底層 runtime,也就是 jvm 在解析 class 的時(shí)候稍味,會(huì)把文件格式的 class 讀取到內(nèi)存并運(yùn)行废麻。android

也是借鑒了這一整套的設(shè)計(jì)理念,android 上的 runtime 其實(shí)是 dalvik 與 art模庐。




當(dāng)我們要統(tǒng)計(jì)代碼覆蓋率的時(shí)候烛愧,就需要在代碼的執(zhí)行路徑上加入探針分析。通常是在讀取類的時(shí)候,在關(guān)鍵的指令塊的出口與入口增加標(biāo)記怜姿。當(dāng)指令塊被執(zhí)行后慎冤,就會(huì)命中探針并完成記錄。






要修改最底層的 jvm 字節(jié)碼往往是比較麻煩的沧卢,需要精通 jvm 的各種指令以及 java class

結(jié)構(gòu)蚁堤。這方面的處理目前已有有非常成熟的開源項(xiàng)目可以做大了,如下就是一些知名的字節(jié)碼修改工具但狭。


? * ASM


? * JavaAssist


? * ByteBuddy披诗、BTrace、JVM-Sandbox


其中 ASM 是所有字節(jié)碼操作的底層基礎(chǔ)立磁,是最底層的字節(jié)碼修改工具呈队。其他工具是它之上的一些高級(jí)封裝。借助于這些工具與 JVM

自身的一些調(diào)試特性唱歧,我們就可以對(duì) jvm 代碼或者進(jìn)程進(jìn)行便捷的操縱了宪摧。



插樁方式??




###??




###??




插樁方式有很多種,常見的方式如下


? * 源代碼插樁:offline 插樁迈喉,支持 android


? * 字節(jié)碼插樁:offline 插樁,支持 android


? * javaagent 模式:脫離代碼在運(yùn)行時(shí)插樁温圆,on the fly 模式


jacoco 支持字節(jié)碼插樁與 javaagent

這兩種插樁方式挨摸。也就是就算沒有源代碼也可以統(tǒng)計(jì)到覆蓋率數(shù)據(jù),但是最后分析的時(shí)候岁歉,還是要結(jié)合源代碼才能獲得更多的覆蓋率細(xì)節(jié)數(shù)據(jù)得运。畢竟覆蓋率的統(tǒng)計(jì),并不是只是簡單的覆蓋率數(shù)據(jù)本身的指標(biāo)高低锅移。



jacoco的工作方式??




###??






jacoco 支持四種工作模式


? * file:進(jìn)程結(jié)束的時(shí)候在本地生成文件


? * tcpserver:開啟端口等待客戶端獲取覆蓋率


? * tcpclient:主動(dòng)把覆蓋率數(shù)據(jù)發(fā)送出去


? * none:不生成覆蓋率


很多人都會(huì)使用 file 模式熔掺,但是 tcp server

模式才是最易用的。因?yàn)椴恍枰暾?qǐng)服務(wù)器的文件訪問權(quán)限就可控制覆蓋率數(shù)據(jù)非剃。你可以根據(jù)自己公司的部署情況選擇合適的工作模式置逻。




on the fly 插樁模式??






on the fly 插樁模式是使用最多的。首先需要在你的被測(cè) java 程序啟動(dòng)的時(shí)候备绽,加入 jvm 的一些 javaagent 參數(shù)券坞。




? *? ?*? ?*? ?*? ?*?




? ? -javaagent:[yourpath/]jacocoagent.jar=[option1]=[value1],[option2]=[value2]destfileoutput:file、tcpserver肺素、tcpclient恨锚、noneaddressport






你可以自己設(shè)置適合的工作模式。


離線插樁模式倍靡,適合 android 的覆蓋率統(tǒng)計(jì)猴伶,需要借助于 maven、gradle 等構(gòu)建工具的 instrument 指令。



on the fly 插樁模式??






jacoco-cli 是 jacoco 的一個(gè)組件他挎,可以在不依賴 maven筝尾、gradle 構(gòu)建工具的情況下完成對(duì)代碼的分析。主要用于 tcpserver

工作模式下雇盖。


用法如下




? *? ?*?




? ? java -jar jacococli.jar dump [--address <address>] --destfile <path> [--help] \[--port <port>] [--quiet] [--reset] [--retry <count>]




項(xiàng)目演練??






這是學(xué)院里的一個(gè)動(dòng)手演練的小場(chǎng)景忿等,統(tǒng)計(jì) jmeter 工具的啟動(dòng)覆蓋率




? *? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*?




? ? project_root=/Users/seveniruby/temp/java_2/jacoco/apache-jmeter-5.2.1jacoco_cli_jar=org.jacoco.cli-0.8.6-20200329.124045-45-nodeps.jar??

? ? java -javaagent:org.jacoco.agent-0.8.6-20200329.124039-45-runtime.jar \? -jar $project_root/bin/ApacheJMeter.jar??

? ? #退出jmeter??

? ? #生成覆蓋率報(bào)告java -jar $jacoco_cli_jar report jacoco.exec \--classfiles "$project_root/bin/ApacheJMeter.jar" \--classfiles $project_root/lib/ext/ApacheJMeter_http.jar \--html jmeter_coverage/??

? ? #生成帶有源代碼的覆蓋率報(bào)告 java -jar $jacoco_cli_jar report? jacoco.exec? \ --classfiles "$project_root/bin/ApacheJMeter.jar" \ --classfiles $project_root/lib/ext/ApacheJMeter_http.jar \ --html jmeter_coverage/ --sourcefiles ~/projects/jmeter/src/??

? ? #生成xml報(bào)告java -jar $jacoco_cli_jar report jacoco_tcpserver2.exec? \--classfiles "$project_root/bin/ApacheJMeter.jar" \--classfiles $project_root/lib/ext/ApacheJMeter_http.jar \--xml? jmeter_coverage_tcpserver2/jacoco.xml




完整代碼請(qǐng)參考學(xué)員論壇中的課程帖中的源代碼。??

導(dǎo)入覆蓋率??






sonarqube 可以分析 jacoco 的 exec 文件與 xml 文件崔挖,并自動(dòng)導(dǎo)入覆蓋率贸街。exec 文件的分析后續(xù)會(huì)放棄支持,主支持 xml

文件的分析狸相。




? *? ?*? ?*? ?*? ?*? ?*? ?*? ?*?




? ? ?sonar-scanner? ?\? -Dsonar.host.url=http://sonarqube.testing-studio.com:9000? ?\? -Dsonar.login=$SONARQUBE_TOKEN? ?\? -Dsonar.projectKey=jmeter? ?\? -Dsonar.projectVersion=1.0? \? -Dsonar.coverage.jacoco.xmlReportPaths=$PWD/jmeter_coverage_tcpserver2/jacoco.xml \? -Dsonar.projectBaseDir=/Users/seveniruby/projects/jmeter/ \? -Dsonar.java.binaries=/Users/seveniruby/projects/jmeter/




導(dǎo)入覆蓋率??









可以通過如下參數(shù)限定要分析代碼的范圍薛匪,通常是指明要覆蓋的 package 范圍


? * sonar.sources


? * sonar.inclusions




導(dǎo)入覆蓋率??








sonarqube 可以智能分析新老版本之間的新增代碼的覆蓋率,這點(diǎn)非常不錯(cuò)脓鹃,以前一些分析代碼 diff

的工作就節(jié)省了逸尖。他的代碼分析也比較智能,簡單的換行并不會(huì)干擾代碼 diff 的分析范圍瘸右。??




通過覆蓋率數(shù)據(jù)??








sonarqube 支持兩種通用的測(cè)試數(shù)據(jù)導(dǎo)入


? * 通用覆蓋率數(shù)據(jù):sonar.coverageReportPaths


? * 通用測(cè)試執(zhí)行數(shù)據(jù):sonar.testExecutionReportPaths


這樣方便與各種框架進(jìn)行集成娇跟,也方便測(cè)試工程師二次定制。


通用測(cè)試數(shù)據(jù)模板太颤。






通用覆蓋率數(shù)據(jù)模板






在 sonarqube 的 scanner 分析中苞俘,加入對(duì)應(yīng)的配置參數(shù)即可導(dǎo)入通用測(cè)試數(shù)據(jù)。


通用測(cè)試數(shù)據(jù)導(dǎo)入的常見用途


? * 將各種測(cè)試工具的測(cè)試報(bào)告轉(zhuǎn)換為 sonarqube 支持的格式從而導(dǎo)入平臺(tái)


? * 將各種覆蓋率工具的覆蓋率報(bào)告轉(zhuǎn)換為標(biāo)準(zhǔn)格式導(dǎo)入平臺(tái)


? * 根據(jù)需求對(duì)差異 diff 覆蓋率進(jìn)行定制龄章,比如除了對(duì)新增代碼做覆蓋吃谣,還要對(duì)使用了新增代碼的依賴代碼也做分析




代碼diff方法??





代碼的 diff 分析是一個(gè)比較大的話題,diff

只是對(duì)代碼的最簡單的一個(gè)分析策略做裙,要想深入的理解代碼岗憋,我們還需要更進(jìn)一步的分析代碼的調(diào)用鏈。我們先看最簡單的代碼 diff 分析工具锚贱。


代碼 diff 分析工具


? * JGit:git 分析工具


? * JavaParser:語法分析


? * ASM:讀取字節(jié)碼


? * javap:jdk 自帶字節(jié)碼分析工具





?** _?

來霍格沃茲測(cè)試開發(fā)學(xué)社仔戈,學(xué)習(xí)更多軟件測(cè)試與測(cè)試開發(fā)的進(jìn)階技術(shù),知識(shí)點(diǎn)涵蓋web自動(dòng)化測(cè)試 app自動(dòng)化測(cè)試拧廊、接口自動(dòng)化測(cè)試杂穷、測(cè)試框架、性能測(cè)試卦绣、安全測(cè)試耐量、持續(xù)集成/持續(xù)交付/DevOps,測(cè)試左移滤港、測(cè)試右移廊蜒、精準(zhǔn)測(cè)試趴拧、測(cè)試平臺(tái)開發(fā)、測(cè)試管理等內(nèi)容山叮,課程技術(shù)涵蓋bash著榴、pytest、junit屁倔、selenium脑又、appium、postman锐借、requests问麸、httprunner、jmeter钞翔、jenkins严卖、docker、k8s布轿、elk哮笆、sonarqube、jacoco汰扭、jvm-sandbox等相關(guān)技術(shù)稠肘,全面提升測(cè)試開發(fā)工程師的技術(shù)實(shí)力

QQ交流群:484590337

公眾號(hào) TestingStudio

視頻資料領(lǐng)取:https://qrcode.testing-studio.com/f?from=jianshu&url=https://ceshiren.com/t/topic/15844

點(diǎn)擊查看更多信息

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末萝毛,一起剝皮案震驚了整個(gè)濱河市项阴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌珊泳,老刑警劉巖鲁冯,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拷沸,死亡現(xiàn)場(chǎng)離奇詭異色查,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)撞芍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門秧了,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人序无,你說我怎么就攤上這事验毡。” “怎么了帝嗡?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵晶通,是天一觀的道長。 經(jīng)常有香客問我哟玷,道長狮辽,這世上最難降的妖魔是什么一也? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮喉脖,結(jié)果婚禮上椰苟,老公的妹妹穿的比我還像新娘。我一直安慰自己树叽,他們只是感情好舆蝴,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著题诵,像睡著了一般洁仗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仇轻,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天京痢,我揣著相機(jī)與錄音,去河邊找鬼篷店。 笑死祭椰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的疲陕。 我是一名探鬼主播方淤,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蹄殃!你這毒婦竟也來了携茂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后卓起,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熄捍,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年饵溅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡咐扭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出滑废,到底是詐尸還是另有隱情蝗肪,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布蠕趁,位于F島的核電站薛闪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏俺陋。R本人自食惡果不足惜豁延,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一怀各、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧术浪,春花似錦瓢对、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至硕并,卻和暖如春法焰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背倔毙。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來泰國打工埃仪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人陕赃。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓卵蛉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親么库。 傳聞我的和親對(duì)象是個(gè)殘疾皇子傻丝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容