
2015-08-08 |★£× 發布者∑"$:梁國(guó)芳 | &nbs××p; 查看(kàn):3320次
IT新聞Code coverage是(shì)一(yī)個(gè)計(jì)算" (suàn)你(nǐ)的(de)單元測試覆蓋率的(de)工(gōng£α)具。高(gāo)水(shuǐ)平的(de)覆蓋給你(nǐ)的(de)&© φ單元測試帶來(lái)信心,也(yě)表明↑♠∑(míng)你(nǐ)的(de)應用(yòng♥λ&)被徹底的(de)測試過了(le)。你(nǐ)可(kě)能(nβ✘ ↓éng)寫了(le)幾千個(gè)單元測試,但εσ←(dàn)如(rú)果覆蓋率不(bù)高(gāo),那(nà)麽你(n♠γǐ)寫的(de)這(zhè)套測試可(kě)能(néng)價值也(yě)不(b₩ ù)大(dà)。
這(zhè)裡(lǐ)并沒有(yǒu)一(yī)個₩Ω×(gè)确切的(de)百分(fēn)比,要(yào)求你(nǐ)必須到(dà™¶o)達這(zhè)個(gè)覆蓋率。這(zhè)很(hλěn)大(dà)程度上(shàng)取決♥≥÷于你(nǐ)的(de)項目(的(de)具體(tǐ)情況)。≥₽譬如(rú)說(shuō),如(rú)果你(nǐ)的 £(de)項目中有(yǒu)很(hěn)多(duō)不(bù)能(n∑♣éng)寫單元測試的(de)視(shì)覺組件(jiàn),那(nà)麽覆蓋率Ωε"€就(jiù)會(huì)比單純處理(lǐ)數(shù)據的(de)框架要(→>yào)低(dī)的(de)多(duō)。
在過去(qù),如(rú)果你(nǐ)想要(yào)制(z≈§εhì)作(zuò)一(yī)個(gè)測試的(de)代碼覆★©₩φ蓋報(bào)告出來(lái),需要(yào)→¶∞¥設置很(hěn)多(duō)[選項]。非常複雜(zá),還(hái)有(y∏↓ǒu)許多(duō)需要(yào)手動設置。在iOS 9中,蘋果提 ≈供了(le)智能(néng)的(de)代碼覆蓋工(gōng♠★₽ε)具,它是(shì)和(hé)LLVM一(yī)±®•體(tǐ)的(de),每次運行(xíng)×☆✔€測試都(dōu)會(huì)被調用(yòng)和γ(hé)計(jì)算(suàn)。
現(xiàn)在我們用(yòng)一(yī)個(gè)例子(zǐ)來(láiπ©)展示,如(rú)何使用(yòng)新的(de)code coverage™εδα工(gōng)具和(hé)怎樣提升現(xiàn)在的(de)測試Ω © 用(yòng)例。完成後的(de)代碼放(fàng)在♣≈了(le)Github上(shàng),你(nǐ)可(kě)以跟著(zhe♣¥)做(zuò)。
第一(yī)件(jiàn)事(shì)是(shì)創β× 建一(yī)個(gè)新項目,并确認你(nǐ)選上(s♦εhàng)了(le)Unit tests選項。這(zhè)會(h¥↔$¥uì)按要(yào)求創建一(yī)個(gè)默認項目,'∞'現(xiàn)我們需要(yào)測試點什(shén)麽。這(zh<★è)個(gè)測試可(kě)能(néng)是(shì)你→₹(nǐ)的(de)任意需求,這(zhè)裡(lǐ)我添加一(yī)≠™≤&個(gè)空(kōng)的(de)swift文(wén)件(jiàn),< 裡(lǐ)面寫好(hǎo)了(le)一(yī)個(gèα€)全局的(de)方法。這(zhè)個(gè)方法檢測兩個(gè)字母串是(shì)否是(shì)僅排序不(bù)同的(d•™φe)相(xiàng)同字母組成的(de)詞。寫成全局的(de)方法,可(kě)能(néng©')不(bù)是(shì)好(hǎo)的(de)設計(jì>♠εδ),但(dàn)這(zhè)裡(lǐ)我們僅演示一§∞σ↔(yī)下(xià)。
這(zhè)是(shì)一(yī)個(g™β<è)相(xiàng)對(duì)簡單的(de)方法,所★±•以我們可(kě)能(néng)會(huì)得(de)到(± dào)一(yī)個(gè)沒有(yǒu)任何問(wèn)題的(de),1 β★00%覆蓋的(de)測試覆蓋率。
一(yī)旦你(nǐ)寫好(hǎo)了(le)算(suàn)•™法,就(jiù)該寫個(gè)測試了(le)。打開(kāi)項✔♦目創建時(shí)已經創建好(hǎo)了(l©Ω♦♥e)的(de)默認的(de)XCTestCase,添加一(•☆yī)個(gè)下(xià)面的(de)簡單的(d€<δe)測試方法。他(tā)看(kàn)起來(lái)是(shì")這(zhè)樣子(zǐ)的(de)。
在運行(xíng)測試之前,我們必須先确認code covera§ge是(shì)否被打開(kāi)了(le),寫代碼時(♠β×shí),默認是(shì)關閉的(de)。所以你(nǐ≥ §♠)需要(yào)編輯一(yī)下(xià)你(nǐ)的(α₹de)測試scheme,把它打開(kāi)。

确保"Gather coverage data"€★&€;是(shì)被選中的(de),然後點擊關閉按鈕,運行(xíng)測試的(de★β) target. 我們希望剛剛創建的(de)測試用(yòng¥©♦)例能(néng)夠順利通(tōng)過。
一(yī)旦這(zhè)個(gè)測試通(tōng)過了(le),你(nǐα¥≥£)就(jiù)能(néng)知(zhī)道(d→ ¥αào)checkWord這(zhè)個(gè)方法±,至少(shǎo)有(yǒu)一(yī)≠♠ ±條路(lù)徑是(shì)對(duì)的(↔∞↑ de)。但(dàn)你(nǐ)不(bù)知(zhī)道(dào)的(de)是(>♠<σshì),還(hái)多(duō)多(duō)少(shǎo)沒有(yǒu∞ ™)被測試到(dào)。這(zhè)就(jiù)是(shì ₩)code coverage這(zhè)個(¥↑≤gè)工(gōng)具的(de)好(hǎo)€£處。當你(nǐ)打開(kāi)code coverage t≠±↓ab後,你(nǐ)可(kě)以清楚的(de)看(kàn)到(dào)♥β♥β測試的(de)覆蓋情況。他(tā)們按找target、file、fun₽↔ction進行(xíng)了(le)自(zì)動分(fēεαεn)組。
打開(kāi)Xcode左邊窗(chuān&>♠$g)口的(de)Report Navigator面闆™>↔≤,選中你(nǐ)剛運行(xíng)的(de)測試。然後在tab中選∑€₽中Coverage。

這(zhè)會(huì)展示一(yī)個(gè)你(nǐ)的(de)類、¶↔¶方法的(de)列表,并标示出每個(gè)的(de)測試覆蓋♥ ↕率。如(rú)果你(nǐ)将鼠标懸停在check₹←Word這(zhè)個(gè)方法上(shàng),你(nǐ)±↔÷₩可(kě)以看(kàn)到(dào)測試的(de)覆蓋率是(shì)£"←28%。不(bù)能(néng)接受啊!我們需要(yào)找到(dào),那÷(nà)些(xiē)代碼分(fēn)支是(shì)能(néng)夠被測試執行(®♠xíng),那(nà)些(xiē)是(shì)不(bù)能(néng) ×₽→的(de),進而改善他(tā)們。雙擊方法的(de)名字,X♥'↑code會(huì)打開(kāi)類的(de)代碼,并且看(kàn)↔'♣☆到(dào)code coverage的(de)情況。

白(bái)色的(de)區(qū)域表示這(zhè)些(xiē)代碼時(s<₹ hí)測試覆蓋過的(de)。灰色區(qū) ×域時(shí)測試無法覆蓋的(de),我們需要(yà ∑©o)添加更多(duō)的(de)測試用(yòngα¥$)例來(lái)覆蓋灰色部分(fēn)的♠♣(de)代碼。在右手邊的(de)數(shù)字,表明(míng)這(β¥↑zhè)些(xiē)代碼塊,在這(zhè)次測試中$∞♦ 被執行(xíng)的(de)次數(shù)。
很(hěn)顯然,28%的(de)覆蓋率不(bù)是(sh♦¥€ì)我們的(de)目标。這(zhè)裡(lǐ)沒有(y©≠ǒu)UI,看(kàn)起來(lái)是(shì)個(gè)完美(měi→γ)的(de)編寫測試用(yòng)例的(d←←♥e)候選function。所以,我們添加一(yī)個(gè)測試用(yò"≥>≠ng)例。理(lǐ)想情況下(xià),我們希望每個(gè)分(fē♣≠<n)支都(dōu)能(néng)被測試到(dào)。這(zhè)樣就(jiù€Ω)能(néng)達到(dào)完整的(de)覆蓋。添 £加下(xià)面的(de)測試用(yòng)例到(dào)你(nǐ)的(de)↔✔✔測試類中。
這(zhè)些(xiē)測試用(yòng)例應該能(néng)夠完全覆蓋π₽我們的(de)代碼了(le)。運行(xíng)一(yī)下(x> →ià)單元,然後打開(kāi)最後一(yī)∑≈<©個(gè)測試報(bào)告。

我們成功了(le),100%的(de)覆蓋率。你≤(nǐ)可(kě)以看(kàn)到(dào)δ≤¥整個(gè)代碼都(dōu)變成了(le)白(♠Ωbái)色,右面的(de)數(shù)字也(yě)展示了(le)每個(g♦®è)代碼段至少(shǎo)被執行(xíng)了(l ₽©e)一(yī)次。
使用(yòng)code coverage是(s$♣hì)一(yī)個(gè)非常棒的(de)方式,幫你(nǐ)建立真正有÷♦(yǒu)價值的(de)測試組合。遠(yuǎn)好(h∏¥γǎo)于你(nǐ)寫了(le)很(hěn)多(duō)測試用×±(yòng)例,但(dàn)沒有(yǒu) ®£真正測試到(dào)代碼。Xcode 7 讓這(zhè)種方式變的(deγ×)非常簡單,我推薦你(nǐ)在項目中開(kāi)★↔§啓 Code Coverage。即使你(nǐ)已經寫好(hǎo)了(le)測試♣σ,也(yě)可(kě)以幫你(nǐ)知(zhī)道(d ✘ ☆ào)到(dào)底測試寫的(de)怎麽樣。
更多(duō)關于Xcode 7中Code Coverage ∑✘¶工(gōng)具的(de)內(nèi)容,我推薦你(nǐ)觀看(kàn>♥)WWDC 2015 的(de)session 410Continuous Integration a§λ∏&nd Code Coverage in Xcode。最後,别忘了(le)如(rú)果你(nǐ)想要(yào)試試我們上(shàn★§₹±g)面的(de)例子(zǐ),可(kě)以在Github中找到(dào)它。
