代碼覆蓋率測試
以前雖然寫過單元測試,但很少監測測試的完整程度,測試用例也經常存在重復的情況。這次在測試的要求下開始接入代碼覆蓋率測試。什么是代碼覆蓋率?就是測試用例對代碼的測試覆蓋程度(見代碼覆蓋率淺談)。
這里面會涉及到兩種文件,分別是編譯時產生的代碼結構文件(gcno文件)和運行時產生的代碼執行的覆蓋率文件(gcda文件)**,下面看看怎么產生gcno文件和gcda文件。
產生gcno文件和gcda文件
-
1、打開Scheme設置頁面,添加TestCoverage的Build選項;
-
2、打開Xcode的Build Setting,在Generate Test Coverage Files中把TestCoverage設置為Yes;
-
3、打開Xcode的Build Setting,在Instrument Program Flow 中把TestCoverage設置為Yes;
4、代碼接入
首先是添加初始化代碼,可以選擇在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法中調用以下方法(也可以在main.m文件中調用)
void initTestCoverage(void)
{
const char* prefix = "GCOV_PREFIX";
const char* prefixValue = [[QMFileHelper getSubPathAtDocuments:@"Coverage"] cStringUsingEncoding:NSASCIIStringEncoding];
const char* prefixStrip = "GCOV_PREFIX_STRIP";
const char* prefixStripValue = "14";
setenv(prefix, prefixValue, 1);
setenv(prefixStrip, prefixStripValue, 1);
}
然后在需要產生代碼覆蓋率的地方調用__gcov_flush()
方法產生覆蓋率文件,需要注意,必須先添加聲明extern void __gcov_flush(void);
- 5、查看生成的gcno和gcda文件
gcno是編譯時產生,可以點擊Xcode的product文件下的.app文件,右鍵選擇“show in finder”,然后在上級目錄的Intermediates文件夾中查找,我的是在
/Users/loyinglin/Library/Developer/Xcode/DerivedData/Live-abcabcababcabac/Build/Intermediates/Live.build/Debug-iphoneos/Live.build/Objects-normal
gcda是運行時產生,通過Xcode下載程序運行的沙盒,在Document的Coverage文件夾下可以看到。
其他問題
1、gcno和gcda的文件找不到
檢查Xcode的工程設置是否正確(步驟1、2、3設置的屬性)
檢查步驟4的代碼是否被調用;
建議先檢查gcno是否生成,在查看gcda是否生成;
2、編譯的時候鏈接失敗
鏈接時出現以下錯誤
Undefined symbols for architecture armv7: "___gcov_flush", referenced from:
檢查步驟2、3設置的屬性是否在當前環境下打開;
3、調用___gcov_flush卡死
___gcov_flush是同步方法,并且耗時較長,如果在主線程調用會造成卡死。
總結
在Xcode中進行覆蓋率測試可以看這篇,更加智能化的Xcode代碼覆蓋率測試工具。
深入了解GCC Coverage,點擊這里。
.gcno文件和.gcda文件可以使用lcov
進行解析,實際測試過程中為了方便統一處理,.gcno用腳本zip -j result/gcno_arm64.zip dir/arm64/*.gcno
(dir替換為特定地址)進行打包,代碼中用MiniZipArchive
打包上傳,更方便進行統一的測試。
謹以此篇記錄代碼覆蓋率測試的了解和接入。
附錄——測試相關
一個好的測試方案能用較短的時間和較少的資源完成測試任務,測試內容包括功能需求測試、代碼覆蓋測試,最后給出測試的總結和評價。
自動化測試與手動測試區別:自動化測試用來測試功能的完備性,手動測試用來測試產品的易用性。
灰度測試:平滑過渡的一種發布方式。iOS最常見的灰度測試就是用越獄平臺的用戶進行灰度測試。灰度測試可以保證整體系統的穩定,也能測試到在實際運行中的問題。
附錄——Xcode11
1、創建TestCoverage的Configuration,可以從debug復制;
2、修改Xcode的Build Settings配置;
3、啟動測試,下面的10是秒數,10秒后或者進程被結束,測試完成;
4、運行完成后,可以看到對應的執行情況;
這種是RD自測使用,QA使用的可以用上面的方式,生成日志再進行看覆蓋率情況。