測試覆蓋率 代碼變更覆蓋率平台-針對手工測試的代碼變更覆蓋率實現之路

Ramsey · 2019年05月09日 · 最後由 董俊宏 回複于 2019年07月26日 · 8748 次閱讀
本帖已被設為精華帖!

作為一家小公司,日常測試基本都是以手工測試為主。如何在頻繁快速的疊代過程中有效保證手工測試覆蓋的充分性,是一個不得不思考的問題。

覆蓋率是度量測試完整性的一個手段,也是測試有效性的一個依據。當一個疊代版本完成手工測試後,如果可以通過分析本次疊代變更代碼的覆蓋率來評估前期的測試用例設計是否完善,開發提交的改動QA這邊是否均了解全面,開發代碼是否存在冗餘。從而更好的進行補充測試,提升本次上線的信心。

PS:當然首先要說明的是變更代碼覆蓋率并不能絕對作為測試全面的一個保證,因為即便測試覆蓋了代碼,也可能受測試人員素質和能力的影響出現漏測。但是我們可以認為高覆蓋率的代碼不一定質量高,但是低覆蓋率的代碼質量一定不高。

第一階段:引入jacoco全量覆蓋率

通過jenkins的jacoco插件來創建代碼覆蓋率任務,這個網上流程有很多,這裡就不多做介紹了。當然自己在部署中也遇到了一些坑,下面是我之前遇到的坑的總結,https://juhua446633.cn/topics/16925

第二階段:平台化實現代碼變更覆蓋率

在實現全量代碼覆蓋率後,發現作為一個龐大且疊代頻繁的項目,全量的代碼覆蓋率意義并不大,因為我們要評估的每個疊代的測試情況,我們需要更精準的了解本次疊代的代碼覆蓋率情況,為了更好的讓每個測試人員可以方便、高效的了解對應服務的覆蓋率情況。從而開發了這個代碼變更覆蓋率平台。

變更代碼覆蓋率整體服務架構圖

設計思路


  • 基于python的git第三方庫,進行代碼比對獲取變更代碼的情況
  • 基于jacoco的覆蓋率報告,隻對變更代碼行進行顔色顯示
  • 覆蓋率通過任務的方式在平台上呈現,保證相同項目相同服務覆蓋率任務後續操作的的便捷性
  • 将改動覆蓋率報告寫入平台template中,實現平台上直接可以查看到覆蓋率文件

關鍵特征


  • 項目管理:後台對項目增删改操作,前台列表展示
  • 服務管理:後台對服務增删改操作,前台支持篩選展示對應服務的任務
  • 任務管理:支持對覆蓋率任務增删改查操作
  • 版本比對:支持通過給出版本号或者通過“HEAD~1”方式描述回退版本數來指定與當前版本比對的版本
  • 覆蓋率數據:手動觸發獲取對應服務的覆蓋率數據,統計服務下所有包及類的變更代碼覆蓋率統計數據
  • 覆蓋率詳情:查看指定類文件的覆蓋率詳情,基于jacoco的覆蓋率報告,顯示規則基本一緻,唯一區别對不屬于變更的代碼不會有底色顯示
  • 權限管理:後台對賬号控制項目權限,來控制對應人員隻能看到制定的項目情況

本地環境部署


1.安裝mysql數據庫服務端(推薦5.7+),并設置為utf-8編碼,創建相應difftest數據庫,設置好相應用戶名、密碼,啟動mysql

2.修改:DiffTestPlatform/DiffTestPlatform/setting.py裡DATABASE的配置

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1', #數據庫所在服務器的ip地址
'PORT': '3306', #監聽端口 默認3306即可
'NAME': 'difftest', #新建數據庫名
'USER': 'root', #數據庫登錄名
'PASSWORD': '123456', #數據庫登錄密碼
'OPTIONS': {
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
},
}
}

3.命令行窗口執行pip install -r requirements.txt 安裝工程所依賴的庫文件

4.命令行窗口切換到根目錄 生成數據庫遷移腳本,并生成表結構

python manage.py makemigrations CodeDiff #生成數據遷移腳本
python manage.py migrate #應用到db生成數據表

5.創建超級用戶,用戶後台管理數據庫,并按提示輸入相應用戶名,密碼,郵箱。

python manage.py createsuperuser

6.啟動服務

python manage.py runserver 0.0.0.0:8000  #本地環境啟動可以配置0.0.0.0,如果是正式環境需要配置訪問ip

具體平台說明請見github

github地址:#

共收到 29 條回複 時間 點贊

有沒有針對PHP代碼實現的例子呢?全是java的,參考不到啊

思寒_seveniruby 将本帖設為了精華貼 05月09日 15:37
張全蛋 回複

我們做了針對JAVA、PHP和C++的全量增量覆蓋率統計,php用的php-coverage來實現的

simple 回複

C也能實現手工測試覆蓋率統計嗎?我們的運行在硬件設備上,統計不起來。設備本身内存就小。

超級贊,給個好評再細看

沒試過C哦

Jenkins和服務的部署需要在同一個機器上嗎?如果不是,配置能否詳細介紹一下,謝謝

Su 回複

目前我上傳的平台代碼是隻針對在同一台機器上的。當然因為我們的測試環境也部署了多個jenkins,所以也會存在你說的服務需要去調用其他機器上的jenkins 的情況,不過這部分代碼我沒放到github上。這塊你可以考慮用把平台中獲取覆蓋率的數據和報告的代碼提取出來部署在jenkins的服務器上,然後在平台上通過python的paramiko庫去實現遠程執行linux命令去觸發覆蓋率數據的獲取和報告生成,再通過這個庫的文件下載功能把覆蓋率文件拉下來。不過這樣子執行效率會比正常的慢一點。

非常好,點個贊,點亮小星星⭐

馬克,借鑒下

11樓 已删除

這個是隻針對android端的嗎?

Su 回複

社區線下沙龍,來着58的講師分享過分布式覆蓋率統計的設計方案

Ramsey #14 · 2019年05月24日 作者
橘子 回複

不是,針對服務端的

請問下,任務名稱、發布名稱,具體怎麼配置啊 ?

Ramsey #16 · 2019年05月28日 作者
hill 回複

項目在github的readme上有說明:任務名稱為jenkins上創建的覆蓋率任務的名稱。發布名稱為jenkins上服務發布的任務名稱,比對版本為git上對應的版本的commit版本号。你新增任務的時候按照這個規範輸入就好

想請問一下這個需求可以cover不,我在版本v1發布了一個應用,然後手工測試了這個版本的應用,jacoco也有了報告r1。然後開發修改了一些bug,發布了v2的應用。經過測試後jacoco有了報告r2.請問r2可以記錄下我r1的報告做一個merge嗎?

Ramsey #18 · 2019年05月29日 作者
Red_herring 回複

首先jacoco的統計的覆蓋率情況是根據拉取exec文件來的,如果你要v2的報告也要統計v1的覆蓋率數據,你可以在jacoco的build.xml文件裡對每次拉取的exec進行merge。這樣統計出來的是曆史以來的全量的覆蓋率情況。如下:

<target name="merge_exec">
<jacoco:merge destfile="/jenkins/workspace/xxxxxx/merged.exec">
<fileset dir="/jenkins/workspace/xxxxxx" includes="*.exec" />
</jacoco:merge>
</target>

當然在你在獲取所有版本全量的覆蓋率的情況下,再針對其中某個版本到最新版本的覆蓋率,可以通過我的平台來生成。但是如果你直接要做整合多次覆蓋率報告,隻要修改build.xml就可以了。

Ramsey 回複

但是如果我在v1的時候生成的exec,測試了A文件的1-100行,如果修改bug改了這100行,接着我測試了101-200行的case,生成了v2的exec。現在v2的exec和v1的exec對于0-100行的映射就不一樣了吧。這種情況怎麼用merge最後生成一個總的覆蓋率報告呢?

Ramsey #20 · 2019年05月29日 作者
Red_herring 回複

針對這個問題我之前也查過資料,我是這麼理解的。生成jacoco報告的時候是會比對覆蓋率文件和編譯文件,假如兩者代碼不一緻就不會顯示覆蓋。這就是為什麼,明明你測試了,但是你覆蓋率代碼和編譯代碼不一緻的情況下生成的覆蓋率報告數據為空的情況了。所以即使你合并了覆蓋率文件,當發現100行在覆蓋率文件中雖然覆蓋了,但是代碼與源代碼不一緻,仍然不會顯示為覆蓋。

大神,想問下你們是怎麼跟jenkins、git關聯起來的,看你github上隻是說“任務名稱為jenkins上創建的覆蓋率任務的名稱。發布名稱為jenkins上服務發布的任務名稱,比對版本為git上對應的版本的commit版本号“ 這怎麼關聯

Ramsey #22 · 2019年05月30日 作者
阿森 回複

我們全量覆蓋率是 通過jenkins的jacoco插件來生成的,就是你需要在jenkins上面創建一個覆蓋率任務用來生成全量覆蓋率報告。而我們代碼變更覆蓋率報告就是基于這裡生成的全量覆蓋率報告而來的。
其中我們這裡配置的覆蓋率任務名稱是為了得到對應覆蓋率報告的路徑。服務發布的任務名稱也是為了在服務發布路徑目錄下獲取git信息,從而得到當前commit的版本和比對版本的代碼差異。

Ramsey 回複

嗯。有什麼辦法可以解決這種情況嗎?想最後拿一個merge完了的報告去找開發一塊讨論這塊沒有覆蓋到的代碼才有意義。不然一個一個看的話,開銷太大了

Ramsey #24 · 2019年05月30日 作者
Red_herring 回複

理論上這個merge結果不就是你想要的嗎,100行第一次覆蓋了,第二次因為代碼改動,所以統計為沒覆蓋。

感謝分享,最近也想實踐下~~

jenkins上創建的覆蓋率任務--這個怎麼弄的?

可以作為檢測開發自測的一種手段了😷

Ramsey #28 · 2019年06月18日 作者
stevenxu 回複

這個具體網上都有教程,jenkins上下載jacoco插件,然後創建一個任務,在任務中實現拉取源代碼、編譯代碼和覆蓋率文件,通過jacoco插件分析這些數據來獲取覆蓋率詳情。

Red_herring 回複

你解決這個問題了嗎

這個要支持一下,有支持c#代碼的計劃嗎?

Su 回複

利用linux 的同步功能把文件同步到一個機子上

需要 登錄 後方可回複, 如果你還沒有賬号請點擊這裡 注冊
http://m.juhua446633.cn|http://wap.juhua446633.cn|http://www.juhua446633.cn||http://juhua446633.cn