代碼測試覆蓋率
最近在負責相關插件的集成,今天第一次接觸到“代碼覆蓋率”這個概念,那么,就做些簡單的筆記吧。
好文
- 如何提高一個研發團隊的“代碼速度”?
- 代碼覆蓋率-wiki
- 如何測試代碼覆蓋率:coverage.py簡介
- 淺談代碼覆蓋率
- 代碼覆蓋率淺談
- 實際軟件工程中是否真的需要100%代碼覆蓋率(code coverage)?
- 用 Python 編寫干凈、可測試、高質量的代碼
- 代碼覆蓋率工具 Istanbul 入門教程
nosetests
nosetests --with-coverage --cover-html --cover-erase --with-xunit --exe project_name\test\
代碼質量好文
代碼質量控制,常規三板斧:
- 靜態檢查
- 代碼review
- 單元測試
靜態檢查工具
sonarqube
- Jenkins+SonarQube 代碼質量檢查自動化
- SonarQube 的安裝、配置及 Maven 項目的使用
- [Jenkins + Maven + SonarQube 構建代碼質量檢測平台](Jenkins + Maven + SonarQube 構建代碼質量檢測平台)
代碼質量平台
- 代碼質量檢測平台架構設計
- COMPREHENSIVE GUIDE TO CODE QUALITY: BEST PRACTICES AND TOOLS
- PMD、FindBug、checkstyle、sonar這些代碼檢查工具的區別?各自的側重點是什么?
- codacy-平台官網
Python代碼質量
pylint
coverage
python檢查好文
Java代碼質量
- Checkstyle
- FindBugs
- PMD
- Jtest
Java靜態分析工具 | 分析對象 | 應用技術 |
---|---|---|
Checkstyle | Java 源文件 | 缺陷模式匹配 |
FindBugs | 字節碼 | 缺陷模式匹配;數據流分析 |
PMD | Java 源代碼 | 缺陷模式匹配 |
Jtest | Java 源代碼 | 缺陷模式匹配;數據流分析 |
內置編程規范
Checkstyle:
- Javadoc 注釋:檢查類及方法的 Javadoc 注釋
- 命名約定:檢查命名是否符合命名規范
- 標題:檢查文件是否以某些行開頭
- Import 語句:檢查 Import 語句是否符合定義規范
- 代碼塊大小,即檢查類、方法等代碼塊的行數
- 空白:檢查空白符,如 tab,回車符等
- 修飾符:修飾符號的檢查,如修飾符的定義順序
- 塊:檢查是否有空塊或無效塊
- 代碼問題:檢查重復代碼,條件判斷,魔數等問題
- 類設計:檢查類的定義是否符合規范,如構造函數的定義等問題
FindBugs
- Bad practice 壞的實踐:常見代碼錯誤,用於靜態代碼檢查時進行缺陷模式匹配
- Correctness 可能導致錯誤的代碼,如空指針引用等
- 國際化相關問題:如錯誤的字符串轉換
- 可能受到的惡意攻擊,如訪問權限修飾符的定義等
- 多線程的正確性:如多線程編程時常見的同步,線程調度問題。
- 運行時性能問題:如由變量定義,方法調用導致的代碼低效問題。
PMD:
- 可能的 Bugs:檢查潛在代碼錯誤,如空 try/catch/finally/switch 語句
- 未使用代碼(Dead code):檢查未使用的變量,參數,方法
- 復雜的表達式:檢查不必要的 if 語句,可被 while 替代的 for 循環
- 重復的代碼:檢查重復的代碼
- 循環體創建新對象:檢查在循環體內實例化新對象
- 資源關閉:檢查 Connect,Result,Statement 等資源使用之后是否被關閉掉
Jtest
- 可能的錯誤:如內存破壞、內存泄露、指針錯誤、庫錯誤、邏輯錯誤和算法錯誤等
- 未使用代碼:檢查未使用的變量,參數,方法
- 初始化錯誤:內存分配錯誤、變量初始化錯誤、變量定義沖突
- 命名約定:檢查命名是否符合命名規范
- Javadoc 注釋:檢查類及方法的 Javadoc 注釋
- 線程和同步:檢驗多線程編程時常見的同步,線程調度問題
- 國際化問題:
- 垃圾回收:檢查變量及 JDBC 資源是否存在內存泄露隱患
Java靜態檢查參考
Python代碼圈復雜度檢查
基礎知識
radon
radon cc --total-average -s -o SCORE -j all\ > r.json
-s 顯示復雜度
-a 顯示平均值,受-n -m影響
-j 結果轉換為json
-o --order
- SCORE: order by cyclomatic complexity (descending):
- LINES: order by line numbers;
-i 指定忽略文件夾
json2html
from json2html import *
import json
with open('r.json','r') as f:
array = json.load(f)
print(array)
randon_html=json2html.convert(array)
with open("index.html","wr") as f:
f.write(randon_html)
業界 CI
工具鏈
工具鏈好文
- 懶羊羊大哥-常用工具集 懶羊羊大哥