代碼覆蓋率測試
以前雖然寫過單元測試,但很少監(jiān)測測試的完整程度,測試用例也經(jīng)常存在重復(fù)的情況。這次在測試的要求下開始接入代碼覆蓋率測試。什么是代碼覆蓋率?就是測試用例對代碼的測試覆蓋程度(見代碼覆蓋率淺談)。
這里面會涉及到兩種文件,分別是編譯時產(chǎn)生的代碼結(jié)構(gòu)文件(gcno文件)和運(yùn)行時產(chǎn)生的代碼執(zhí)行的覆蓋率文件(gcda文件)**,下面看看怎么產(chǎn)生gcno文件和gcda文件。
產(chǎn)生gcno文件和gcda文件
-
1、打開Scheme設(shè)置頁面,添加TestCoverage的Build選項(xiàng);
-
2、打開Xcode的Build Setting,在Generate Test Coverage Files中把TestCoverage設(shè)置為Yes;
-
3、打開Xcode的Build Setting,在Instrument Program Flow 中把TestCoverage設(shè)置為Yes;
4、代碼接入
首先是添加初始化代碼,可以選擇在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法中調(diào)用以下方法(也可以在main.m文件中調(diào)用)
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);
}
然后在需要產(chǎn)生代碼覆蓋率的地方調(diào)用__gcov_flush()
方法產(chǎn)生覆蓋率文件,需要注意,必須先添加聲明extern void __gcov_flush(void);
- 5、查看生成的gcno和gcda文件
gcno是編譯時產(chǎn)生,可以點(diǎn)擊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是運(yùn)行時產(chǎn)生,通過Xcode下載程序運(yùn)行的沙盒,在Document的Coverage文件夾下可以看到。
其他問題
1、gcno和gcda的文件找不到
檢查Xcode的工程設(shè)置是否正確(步驟1、2、3設(shè)置的屬性)
檢查步驟4的代碼是否被調(diào)用;
建議先檢查gcno是否生成,在查看gcda是否生成;
2、編譯的時候鏈接失敗
鏈接時出現(xiàn)以下錯誤
Undefined symbols for architecture armv7: "___gcov_flush", referenced from:
檢查步驟2、3設(shè)置的屬性是否在當(dāng)前環(huán)境下打開;
3、調(diào)用___gcov_flush卡死
___gcov_flush是同步方法,并且耗時較長,如果在主線程調(diào)用會造成卡死。
總結(jié)
在Xcode中進(jìn)行覆蓋率測試可以看這篇,更加智能化的Xcode代碼覆蓋率測試工具。
深入了解GCC Coverage,點(diǎn)擊這里。
.gcno文件和.gcda文件可以使用lcov
進(jìn)行解析,實(shí)際測試過程中為了方便統(tǒng)一處理,.gcno用腳本zip -j result/gcno_arm64.zip dir/arm64/*.gcno
(dir替換為特定地址)進(jìn)行打包,代碼中用MiniZipArchive
打包上傳,更方便進(jìn)行統(tǒng)一的測試。
謹(jǐn)以此篇記錄代碼覆蓋率測試的了解和接入。
附錄——測試相關(guān)
一個好的測試方案能用較短的時間和較少的資源完成測試任務(wù),測試內(nèi)容包括功能需求測試、代碼覆蓋測試,最后給出測試的總結(jié)和評價。
自動化測試與手動測試區(qū)別:自動化測試用來測試功能的完備性,手動測試用來測試產(chǎn)品的易用性。
灰度測試:平滑過渡的一種發(fā)布方式。iOS最常見的灰度測試就是用越獄平臺的用戶進(jìn)行灰度測試?;叶葴y試可以保證整體系統(tǒng)的穩(wěn)定,也能測試到在實(shí)際運(yùn)行中的問題。
附錄——Xcode11
1、創(chuàng)建TestCoverage的Configuration,可以從debug復(fù)制;
2、修改Xcode的Build Settings配置;
3、啟動測試,下面的10是秒數(shù),10秒后或者進(jìn)程被結(jié)束,測試完成;
4、運(yùn)行完成后,可以看到對應(yīng)的執(zhí)行情況;
這種是RD自測使用,QA使用的可以用上面的方式,生成日志再進(jìn)行看覆蓋率情況。