乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      測(cè)試人員代碼分析5步法

       小胖魚與小松鼠 2016-09-23

      前言

      理論篇

      實(shí)際工作中,我們經(jīng)常面臨版本迭代節(jié)奏快、需求多、測(cè)試時(shí)間短、代碼量大等現(xiàn)象,當(dāng)我們決定深入理解代碼實(shí)現(xiàn)的時(shí)候,經(jīng)常會(huì)遇到以下兩個(gè)問題:如何進(jìn)行代碼分析?優(yōu)先分析哪些代碼?

      代碼分析的關(guān)鍵詞:5步法+風(fēng)險(xiǎn)控制+類關(guān)系

      5步法操作如下:

      1、選取分析對(duì)象

      2、明確模塊名

      3、理清模塊間的關(guān)系

      4、確定模塊間的接口

      5、從接口著手去梳理代碼結(jié)構(gòu)關(guān)系

      第一步 選取分析對(duì)象

      測(cè)試周期短、代碼量大,從哪里著手開始分析、或者優(yōu)先分析哪些呢?

      代碼分析順序的關(guān)鍵詞:風(fēng)險(xiǎn)控制。所謂風(fēng)險(xiǎn)控制,從問題嚴(yán)重度和模塊特點(diǎn)兩個(gè)方面來說:

      1、問題嚴(yán)重度:模塊出現(xiàn)問題后,被用戶感知的嚴(yán)重程度。按照問題嚴(yán)重度順序做代碼分析。比如,驅(qū)動(dòng)層代碼出問題會(huì)“藍(lán)屏”,應(yīng)用層出問題會(huì)“crash”、'無反應(yīng)',腳本出問題,腳本掛掉,用戶側(cè)基本無感知。即藍(lán)屏>crash>無反應(yīng)>無感知,所以最優(yōu)先分析的是驅(qū)動(dòng)層代碼,其次是應(yīng)用層代碼,最后才是腳本;

      2、模塊特點(diǎn):?jiǎn)栴}嚴(yán)重度在同一層級(jí),代碼的分析順序。首先,同一層級(jí)的代碼,應(yīng)該優(yōu)先分析重要的模塊,重要模塊是核心功能處理、調(diào)用頻繁度高的模塊;其次,出現(xiàn)問題的模塊會(huì)隱藏更多的問題,分析那些已經(jīng)發(fā)現(xiàn)過問題的模塊,可能會(huì)發(fā)現(xiàn)更多的問題。

      第二步 明確模塊名

      通過查看工程文件或工程屬性,明確源代碼將會(huì)被編譯成xxx名稱的.xxx擴(kuò)展名的文件。代碼最終都會(huì)被編成.xxx后綴的目標(biāo)文件,在開始梳理具體實(shí)現(xiàn)前,要明確目標(biāo)文件的名稱和運(yùn)行方式。

      第三步 理清模塊間的關(guān)系

      確定了模塊名后,緊接著要確定多個(gè)相互作用的模塊的調(diào)用關(guān)系。從當(dāng)前代碼所在的模塊出發(fā)梳理調(diào)用關(guān)系,首先需要明確調(diào)用關(guān)系是兩個(gè)以上模塊之間的關(guān)系,也就是在調(diào)用過程中,存在調(diào)用方和被調(diào)用方;其次,當(dāng)前代碼所在模塊在實(shí)際調(diào)用中,可能會(huì)調(diào)用其它模塊,也可能被其它模塊調(diào)用。

      1、哪些模塊調(diào)用了當(dāng)前模塊:在整個(gè)業(yè)務(wù)代碼范圍內(nèi)搜索當(dāng)前模塊的模塊全名,包含.xxx后綴,就能找出該模塊被哪些模塊調(diào)用。

      2、當(dāng)前模塊調(diào)用了哪些模塊:在該模塊的工程文件中,搜索和分析會(huì)和其他模塊發(fā)生調(diào)用關(guān)系的關(guān)鍵詞,這里的關(guān)鍵詞一般是加載函數(shù)的名字、文件后綴名等,即可找到該模塊調(diào)用了哪些模塊。

      第四步 確定模塊間的接口

      在當(dāng)前模塊被調(diào)用和調(diào)用其他模塊的語句處,即步驟三中發(fā)生調(diào)用關(guān)系的語句處,找到模塊間起連接作用的接口。具體接口的形式、分類和使用方法依賴于平臺(tái)和代碼開發(fā)語言,確定接口的準(zhǔn)則會(huì)有所不同,這里不贅述,大家可根據(jù)自己實(shí)際分析的代碼確定接口。

      第五步 從接口著手去梳理代碼結(jié)構(gòu)關(guān)系

      從接口入手梳理代碼結(jié)構(gòu)關(guān)系首先要做兩件事:

      ①查看該接口類的定義和各個(gè)方法名稱,明確該接口具備什么方法。接口類一般都是抽象類,抽象類里的方法一般沒有具體實(shí)現(xiàn);

      ②找接口類的實(shí)現(xiàn)類,即搜索public 接口類名,找到該接口的實(shí)現(xiàn)類,從實(shí)現(xiàn)類的各個(gè)方法定義中開始分析各個(gè)方法的具體實(shí)現(xiàn)邏輯,這些實(shí)現(xiàn)過程可能包含對(duì)其他模塊的調(diào)用、對(duì)其他接口/類的調(diào)用、對(duì)本接口其他方法的調(diào)用。

      從接口入手開始分析代碼的依據(jù)是類關(guān)系的強(qiáng)弱性,先簡(jiǎn)單說明UML給出的六種類關(guān)系的強(qiáng)弱順序:泛化=實(shí)現(xiàn)>組合>聚合>關(guān)聯(lián)>依賴。泛化和實(shí)現(xiàn)關(guān)系像是代碼結(jié)構(gòu)的縱向關(guān)系,我們理清實(shí)現(xiàn)和泛化關(guān)系,就等同于找到房子的承重墻;組合、聚合和關(guān)聯(lián)更能代表代碼結(jié)構(gòu)的橫向關(guān)系,是具體實(shí)現(xiàn)過程;依賴關(guān)系也是一種代碼結(jié)構(gòu)的橫向關(guān)系,但是這種關(guān)系比較弱,即對(duì)代碼的整個(gè)框架影響較小,所以分析時(shí)不建議花費(fèi)太多時(shí)間。

      在逐步分析確定具體實(shí)現(xiàn)邏輯的過程中,有以下幾個(gè)關(guān)注點(diǎn):

      ①從需求的功能出發(fā),確定功能是否如期實(shí)現(xiàn)、代碼中是否有分支遺漏、各種異常處理是否完備;

      ②從CodeReview角度出發(fā),查找代碼中的基本缺陷,如變量沒有初始化、資源使用完后未釋放、函數(shù)返回值出錯(cuò)等;

      ③從代碼實(shí)現(xiàn)結(jié)構(gòu)出發(fā),確定設(shè)計(jì)的接口是否合理、多線程流程是否恰當(dāng)、架構(gòu)是否清晰等。


      實(shí)戰(zhàn)篇

      以下將按照上文闡述的”五步法“,以Windows系統(tǒng)Visual Studio下C++代碼為例,進(jìn)行實(shí)戰(zhàn)演練。

      第一步 選擇分析對(duì)象

      例如分析的項(xiàng)目包含C++代碼和Lua代碼,從風(fēng)險(xiǎn)控制的角度出發(fā),優(yōu)先選擇C++代碼進(jìn)行分析。

      這時(shí)將會(huì)遇到另一個(gè)問題:模塊關(guān)系是怎么樣的?具體實(shí)現(xiàn)邏輯是怎么樣的?

      第二步 明確模塊名

      打開.vcproj工程文件,查看ConfigurationType值(2是dll文件,1是exe文件),或者VS里面查看工程屬性Properties-ConfigurationType就可以看出該文件的生成文件名(xxx.xxx),dllTest.vcproj最后編譯出來的二進(jìn)制文件是dllTest.dll。



      第三步 理清模塊間的關(guān)系

      1、哪些模塊調(diào)用了當(dāng)前模塊:在整個(gè)解決方案文件(.sln)中搜索模塊名,可看出哪些模塊調(diào)用了該模塊,dllCall\dllCall.cpp所在模塊dllCall.exe(步驟二的方法獲取模塊名)會(huì)調(diào)用dllTest.dll。 

      2、當(dāng)前模塊調(diào)用了哪些模塊:在.vcproj工程文件中搜.lib、LoadLibrary、CoCreateInstance,可以看出dllCall.exe包含shell32.lib等靜態(tài)庫。


      dllCall.exe會(huì)通過LoadLibrary調(diào)用dllTest.dll這個(gè)動(dòng)態(tài)庫。 


      dllCall.exe會(huì)通過CoCreateInstance調(diào)用dllCom.dll等動(dòng)態(tài)庫。 


      除了通過搜索關(guān)鍵字的方式獲取模塊關(guān)系之外,還可以通過調(diào)試和depends.exe等工具來理清楚模塊間的依賴關(guān)系。

      第四步 確定模塊間的接口

      C++接口一般分為COM接口和LoadLibrary導(dǎo)出接口兩類,其中LoadLibrary導(dǎo)出接口的使用方法又細(xì)分為兩種:

      ①COM接口,CoCreateInstance的第四個(gè)參數(shù)就是接口的IID,IID_后直接跟的就是接口類的名稱;

      ②LoadLibrary導(dǎo)出接口,GetProcAddress的第二個(gè)參數(shù)就是接口函數(shù):a.該接口函數(shù)直接被使用;查找該接口函數(shù)的定義,如下add是接口函數(shù)。


      b.通過該接口函數(shù)找到接口類,需要具體分析代碼和接口函數(shù),如ICacheClient是通過接口函數(shù)GetModuleName找到的實(shí)際調(diào)用的接口類ICacheClient。 


      第五步 從接口著手去梳理代碼結(jié)構(gòu)關(guān)系

      上例接口ICacheClient的實(shí)現(xiàn)類是CCacheClient。 

      CCacheClient的方法和屬性如下:

       
      CCacheClient的SendGetDigFtr方法的實(shí)現(xiàn)分析如下:

       

      工具篇

      組合、聚合和關(guān)聯(lián)關(guān)系的代碼在整個(gè)工程中占比非常大,是代碼分析比較耗時(shí)的過程,我們可以借助工具輔助分析,推薦代碼閱讀分析工具Understand。

      UnderStand集成了代碼編輯器、代碼跟蹤器和代碼分析器,支持C/C++/C#, Ada, Java, FORTRAN, Delphi和Jovial等語言,并且具有強(qiáng)大的界面,能將分析結(jié)果以圖表、圖形等形式呈現(xiàn)給大家,如下實(shí)例圖依次為Understand生成的類關(guān)系圖、函數(shù)調(diào)用關(guān)系圖和數(shù)據(jù)流圖。 



      最后,那么對(duì)于我們來說,要在有限時(shí)間內(nèi)完成高質(zhì)量的代碼分析,才能更好的適應(yīng)“迭代節(jié)奏快、需求多、測(cè)試時(shí)間短、代碼量大”等現(xiàn)狀、更好的打擊和消滅bug。希望以上代碼分析的方法能為大家提供一些思路,能幫助大家提升一些代碼分析效率。

      讀者互動(dòng)環(huán)節(jié)

      大家日常工作中是如何做代碼分析的?上述5步法,在你的項(xiàng)目中是否也有用武之地?

      精彩的回答除了可以移入精選留言,還有機(jī)會(huì)獲取TMQ提供的精美禮品一份~  期待您的回答哦


      尋人啟示 獲獎(jiǎng)名單

      獲獎(jiǎng)?wù)呶⑿臝D:Friday


        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多