精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Xcode7中用Swift做單元測試

移動開發 iOS
無論你是編程新手,還是開發過很多 app 的老司機,例行的寫寫單元測試會讓你的代碼更可靠,更安全,更容易 debug!

每個 iOS 程序員都要時不時的為他們的 app 做 debug。除非你是那種超級大牛,否則你肯定體驗過查了無數個小時的 bug ***才發現那僅僅是個簡單的語法錯誤時那種油然而生的絕望感。或者更糟:你根本就沒發現那些 bug。無論你是編程新手,還是開發過很多 app 的老司機,例行的寫寫單元測試會讓你的代碼更可靠,更安全,更容易 debug!

你很走運,Xcode 7 和 Swift 支持單元測試。盡管單元測試不保證(有了它你就會寫出)絕對沒有 bug 的 app,它還是一種能讓你驗證每段代碼是否如期工作,并讓 debug 過程更加便利。

正如其名,在單元測試中你要為某段代碼單元創建一些小規模的、針對其某個特性的測試,然后確保每個代碼單元都能通過這些測試。如果通過的話,它的旁邊會出現一個綠色小標志,而如果因故測試不通過, Xcode 會把該測試標記為 “failed”。這就提示你去查看代碼,找出失敗原因。
演示項目概覽

首先下載這個我為你準備的 starting project。一個短小精悍的 app:它會對一個給定的數字和百分比做一個乘法計算。(比如80的10%是8。)

這個 PercentageCalculator 項目非常簡單。你唯一需要關注的就是 ViewController.swift 這個文件。里面的代碼都標記了注釋,很容易理解。

有 5 個 IBOutlets:每一個都對應了屏幕上一個 UIElement,除 title(標題)之外,還有 2 個 slider 對應 2 個 IBActions。每個 IBAction 的方法名都精確描述了其用途及將要執行的操作。當一個 slider 值改變時,其對應著的百分比或數字的值也會隨之改變。

還有兩個簡單的函數 “updateLabels()” 和 “percentage()” 做了符合期待的事情:當一個 slider 改變時***個函數更新 label,第二個函數獲取兩個浮點數并返回百分比的計算結果。

在模擬器中運行 app。剛開始一切看起來都很正常。但當你開始改變數字時就會發現計算結果有問題。為找到 bug,我們將代碼分割成不同的單元,然后分別做測試,看看每個是否都如期運行。這不會解決 bug,但能縮小你的查找范圍。

我創建項目的時候,默認情況下會勾選創建一個 test 文件的選項(如果你想要手動加一個的話,在 iOS Source 下面選擇 select File > New > File > Unit Test Case Class)。我們的例子中 test 文件已經被 Xcode 自動創建出來,可以在項目導航欄中 “PercentageCalculatorTests” 文件夾中找到它。

在 PercentageCalculatorTests.swift 文件中,PercentageCalculatorTests 類里面已經為我們創建好了 4 個方法。其中 2 個是測試方法(test methods)的例子,你可以刪掉它們(它倆都以 test 關鍵字開頭,并且它們左邊的豎條中都有個方塊形圖標,名字也都以 “…Example” 結尾,所以你可以通過這些辨識出來它們是測試方法)。另外兩個方法,setUp() 和 tearDown() 是特殊的樣板方法(boilerplate methods),它們分別在每個測試方法被執行之前,和每個測試方法被執行之后被執行。
開始寫單元測試吧

現在是時候寫你的***個單元測試函數了!本教程我們只測試 ViewController 類,需要在 PercentageCalculatorTests 中添加一個它的實例。

  1. class PercentageCalculatorTests: XCTestCase {  
  2.     var vc: ViewController!  
  3.       
  4.     override func setUp() {  
  5.         super.setUp()  
  6.         // 這里寫setup的代碼。本class里每個測試函數被調用之前該方法都會被先調用。  
  7.     }  
  8.       
  9.     override func tearDown() {  
  10.         // 這里寫teardown的代碼。本class里每個測試函數被調用之后該方法都會被調用。  
  11.         super.tearDown()  
  12.     }  
  13.       

 

PercentageCalculatorTests 是一個 XCTestCase 的子類,后者被打包在 XCTest 框架中。每一個 XCTestCase 子類的實例都負責對你項目的某個特定部分做測試,比如對一個特性做測試。

在 setup 方法中實例化一個 vc。這樣對每一個測試方法你都會得到一個“全新的” ViewController 實例,因為在每個測試方法執行前 setUp() 都會被調用一次。把 setUp() 方法修改如下:

  1. override func setUp() {  
  2.     super.setUp()  
  3.    
  4.     let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())  
  5.     vc = storyboard.instantiateInitialViewController() as! ViewController  

現在你應該記得所有的測試方法的名字都要以 test 關鍵字開頭,否則 Xcode 不會識別。添加一個新的 testPercentageCalculator() 測試方法,來驗證一下 ViewController 中的 percentage() 工作是否正常。

  1. func testPercentageCalculator() {  

單元測試中你要去檢查某段代碼是否如你所愿的那樣工作。待測試的代碼段一般都只有幾行,典型情況是你只需要測試一個方法或者一個函數。單元測試是這樣去做的:你給某個代碼單元一個輸入值,讓這個值過一遍這段代碼,然后檢查一下輸出的值是否和預期的一樣。

與“我們期望的那個值”做比較的這部分由 XCTAssert 函數來處理。最簡單的 XCTAssert 函數是XCTAssert(expression: BooleanType)。這個函數要求一個布爾表達式(類似于 5>3,8.90 == 8.90或者 true 這種),隨后如果表達式為真則讓測試通過,否則認為測試失敗。

嘗試一下!首先給 testPercentageCalculator() 方法加添加下面一行。然后把光標移到方法名左邊側欄的那個方塊圖標上,停下光標之后方塊圖標變成了一個執行光標,點擊一下就開始了測試。

  1. func testPercentageCalculator() {  
  2.         XCTAssert(true)  

如果一切順利,則測試通過,方法左邊會出現一個綠色檢測標。

驗證百分比計算

現在來真的:測試 percentage() 方法!用 ViewController 的一個實例 - vc 屬性來調用這個方法。給這個方法兩個浮點數,比如 50 和 50,然后把結果存儲到常量 p 中。這個例子中 p 應該是 25(50 的 50% 是 25)。然后用 XCTAssert(p == 25) 檢測一下是不是這樣,執行測試方法。把 testPercentageCalculator() 改成這樣:

  1. func testPercentageCalculator() {  
  2.         // 應該是25  
  3.         let p = vc.percentage(5050)  
  4.         XCTAssert(p == 25)  

測試成功了,這意味著 ViewController 的 percentage() 函數工作正常,我們應該在其他的地方繼續尋找 bug。也許 bug 在 updateLabels() 里面?
驗證Labels

現在添加一個新的測試方法 testLabelValuesShowedProperly() 來驗證一下 label 能不能正確的顯示 text。和之前一樣,調用 ViewController 的一個方法 - 這回是 updateLabels() - 然后看看每個標簽的 text 屬性和我們期望的那個 text 是否相同。

注意到你要給 XCTAssert 函數傳一個新的參數:一個 string 類型的消息。這對我們這次要對多個值做檢查(調用三次 XCTAssert )來完成測試而言就會很方便。如果測試失敗,這條消息就會指名我們具體是哪里錯了。

  1. func testLabelValuesShowedProperly() {  
  2.         vc.updateLabels(Float(80.0), Float(50.0), Float(40.0))  
  3.           
  4.         // labels應該顯示80, 50 and 40  
  5.         XCTAssert(vc.numberLabel.text == "80.0""numberLabel doesn't show the right text")  
  6.         XCTAssert(vc.percentageLabel.text == "50.0%""percentageLabel doesn't show the right text")  
  7.         XCTAssert(vc.resultLabel.text == "40.0""resultLabel doesn't show the right text")  

你嘗試執行這個測試方法時,會收到編譯器的錯誤提示:numberLabel,percentageLabel 和 resultsLabel 是 nil。怎么回事呢?

我是在 storyboard 文件中創建了這些 labels 的,因此只有當 view 被加載之后(loaded)它們才會被初始化,然而由于對單元測試來說 loadView() 方法不會被觸發,所以這些 labels 沒有被創建,只能是 nil。一種可能的方法是通過調用 vc.loadView() 來解決,但是 Apple 在它的文檔中并不推薦你這么做,因為當已經被加載的對象又被加載一次的話可能會引起內存泄露。

正確的方法是你應該先訪問一下 vc 的 view 這個屬性,這會讓 vc 反過來觸發所有相應的方法,不僅僅包括 loadView()。把 testLabelValuesShowedProperly() 改成這樣:

  1. func testLabelValuesShowedProperly() {  
  2.         let _ = vc.view  
  3.         vc.updateLabels(Float(80.0), Float(50.0), Float(40.0))  
  4.           
  5.         // labels應該顯示80, 50 and 40  
  6.         XCTAssert(vc.numberLabel.text == "80.0""numberLabel doesn't show the right text")  
  7.         XCTAssert(vc.percentageLabel.text == "50.0%""percentageLabel doesn't show the right text")  
  8.         XCTAssert(vc.resultLabel.text == "40.0""resultLabel doesn't show the right text")  

注意到下劃線(_)忽略了常量的名字。因為我們實際上并不需要用到這個 view。加下劃線就是告訴編譯器“你假裝訪問一下這個 view,把相應的方法觸發就行。”

執行測試。(如果想一并執行我們test類的所有測試,你還可以點擊 “class PercentageCalculatorTests” 旁邊的那個方塊)。

我們來修Bug

如你所見,測試失敗了!我們給 XCTAssert 方法傳入的錯誤細節消息幫助我們快速識別出引起 bug 的可能原因。這次測試告訴我們 resultsLabel 沒有顯示出正確的文本,所以我們進到 ViewController 里看看對這些 label 的 text 值是在那里被設置的。仔細看了 ViewController.swift 的 updateLabels() 代碼之后,我們發現了 bug 的原因:

  1. self.resultLabel.text = "\(rV + 10)" 

應該是:

  1. self.resultLabel.text = "\(rV)" 

更新代碼之后再運行一次測試,一切都應該正常了!
結論

本篇教程中你學到了 Xcode 中的單元測試的相關內容,以及它怎樣能夠幫你找到代碼中的 bug。除了預防 bug 之外,單元測試還可以用來做性能測試和異步測試。還可能讓你感興趣的是UI測試,你可以錄制下你在 app 上做出的動作來測試你的 app 在實際使用情景下是如何表現的。如果聽起來覺得感興趣,那一定要看看這個講 UI 測試的 WWDC視頻。

項目的最終版本可以在 Github上下載。

如果你有關于 UI 測試的任何問題,或者學習本教程中遇到了困難,請在評論中點我!

作者介紹:Maxime Defauw 是一個有經驗的程序員,在 App Store 和 Google Play store 上發布過多個 app。他今年 16 歲,居住在比利時。最近他在 San Francisco 舉行的 WWDC15 上獲得了 Apple 的獎學金。Max 熟練掌握 Objective-C,C,C#,現在是 Swift。不碼代碼的時候他一般在曲棍球場或者高爾夫球場上。在 Twitter 上 @MaximeDefauw 粉他。

責任編輯:陳琳 來源: SwiftGG
相關推薦

2012-05-21 09:41:54

XcodeiOS單元測試

2021-09-03 08:57:59

Swift強制解析

2012-05-17 09:09:05

Titanium單元測試

2017-01-14 23:42:49

單元測試框架軟件測試

2019-12-18 10:25:12

機器學習單元測試神經網絡

2021-09-18 15:40:03

Vue單元測試命令

2023-04-14 09:04:07

測試TDBF單元測試

2017-01-16 12:12:29

單元測試JUnit

2017-01-14 23:26:17

單元測試JUnit測試

2022-12-08 08:01:02

Python測試單元

2020-08-18 08:10:02

單元測試Java

2022-05-09 08:55:52

ORMMockGo

2017-03-23 16:02:10

Mock技術單元測試

2021-05-05 11:38:40

TestNGPowerMock單元測試

2011-07-27 17:02:12

Xcode iPhone 單元測試

2020-05-07 17:30:49

開發iOS技術

2011-07-04 18:16:42

單元測試

2023-07-26 08:58:45

Golang單元測試

2015-10-21 11:09:08

Xcode7調試神技

2011-05-16 16:52:09

單元測試徹底測試
點贊
收藏

51CTO技術棧公眾號

中文字幕一区二区人妻视频| 国产精品91av| 天堂а√在线资源在线| 免费观看在线综合| 九九热最新视频//这里只有精品| 亚洲高清在线不卡| 大桥未久在线视频| 99国产欧美久久久精品| 国产精品久久在线观看| 久久久久久久久久网站| 国产伦精品一区二区三区免费优势| 欧美日韩在线第一页| 亚洲成人第一| 99久久精品国产色欲| av不卡在线| 色偷偷偷综合中文字幕;dd| 黑人巨大猛交丰满少妇| 日本不卡一二三| 亚洲免费观看高清完整版在线| 久久国产精品一区二区三区四区 | 亚洲第一激情av| 欧美视频小说| 国精品人妻无码一区二区三区喝尿| 久久男女视频| 久久久亚洲精选| 顶级黑人搡bbw搡bbbb搡| 欧美18xxxx| 欧美一区二区三区四区五区| 熟女人妇 成熟妇女系列视频| av在线播放观看| 国产欧美日本一区二区三区| 国产精品青青草| 91福利免费视频| 国产毛片久久| 性欧美激情精品| 欧美精品一区二区成人| 欧美午夜精彩| 精品一区二区三区电影| 国产精九九网站漫画| 成人精品国产亚洲| 在线视频一区二区免费| 给我免费播放片在线观看| 国产精品实拍| 中文字幕日韩一区| 欧美一区1区三区3区公司 | 欧美系列精品| 色吊一区二区三区| 欧美成人免费在线观看视频| 18+视频在线观看| ...xxx性欧美| 自拍亚洲欧美老师丝袜| 成人影院免费观看| 国产欧美综合在线| 日韩免费三级| 国产高清视频免费最新在线| 久久日韩粉嫩一区二区三区| 久久精品二区| 青青视频在线观| 久久在线观看免费| 欧美成人一区二区在线| 日韩精品一二| 国产成人av免费| 久久看人人摘| 色妞在线综合亚洲欧美| jizz中文字幕| 精品久久久久久久久久久下田 | 韩国三级丰满少妇高潮| 亚洲一区二区av| 555夜色666亚洲国产免| 久久久久久综合网| 欧美国产亚洲精品| 欧美成人激情免费网| 亚洲午夜精品在线观看| 伊人久久亚洲| 亚洲精品国产免费| 久久成人激情视频| 色综合久久一区二区三区| 色先锋资源久久综合5566| 欧美色视频一区二区三区在线观看| 四虎8848精品成人免费网站| 日韩三级成人av网| 久久精品视频日本| 蜜桃视频一区| 国产视频福利一区| www.亚洲天堂.com| 91亚洲精品一区二区乱码| 蜜桃久久影院| 日本中文在线| 亚洲成人免费视频| 黄色片久久久久| 黄色成人在线观看网站| 欧美日韩福利| 欧美午夜女人视频在线| 在线视频日韩一区| 国产美女视频一区二区| 精品国产91亚洲一区二区三区婷婷 | 娇妻被老王脔到高潮失禁视频| 日韩片欧美片| 欧美激情视频免费观看| 男人天堂av在线播放| 免费看欧美女人艹b| eeuss一区二区三区| 青青草免费观看免费视频在线| 中文字幕高清一区| 国产传媒久久久| 婷婷六月国产精品久久不卡| 4438x成人网最大色成网站| 欧美xxxxx精品| 色综合狠狠操| 庆余年2免费日韩剧观看大牛| 91精品人妻一区二区三区果冻| 丁香激情综合国产| 无码免费一区二区三区免费播放| 在线中文免费视频| 色婷婷久久久久swag精品| 中文字幕55页| 精品国产中文字幕第一页| 欧美日韩电影在线观看| 日本视频www色| 成人动漫av在线| 亚洲资源在线网| 最新中文字幕在线播放| 日韩一区二区三区观看| 免费看91的网站| 99精品国产一区二区青青牛奶| 成人网在线观看| 黄色在线视频观看网站| 亚洲综合久久av| 日本精品一区在线| 成人免费在线观看av| av高清不卡在线| 97久久国产精品| 国产亲伦免费视频播放| 久久久不卡影院| 激情五月宗合网| youjizzjizz亚洲| 欧美成aaa人片在线观看蜜臀| 亚洲国产精品无码久久久| 波多野结衣精品在线| 91免费视频黄| www.久久爱.com| 最近2019免费中文字幕视频三| 免费污污视频在线观看| 不卡的av电影在线观看| 日本免费a视频| 免费一区二区三区在线视频| 日韩中文字幕在线观看| 一二三区免费视频| www成人在线观看| www.com毛片| 加勒比色综合久久久久久久久| 欧美精品一二区| 国产视频手机在线| 一区二区三区四区不卡视频 | 国产精品66部| 肉大捧一出免费观看网站在线播放| 国产精品无码久久久久| 一本一本久久a久久精品牛牛影视| 欧美啪啪小视频| 97久久人人超碰| 欧美成人xxxxx| 妖精视频一区二区三区免费观看| 日本国产欧美一区二区三区| 日本精品专区| 色综合久久久久| 真实乱视频国产免费观看 | 五月天激情播播| 偷偷www综合久久久久久久| 91天堂在线观看| 日本天码aⅴ片在线电影网站| 日韩欧美美女一区二区三区| 久久久国产精华液| 不卡av电影在线播放| 国产一区二区三区精彩视频| 神马影视一区二区| 国产女精品视频网站免费| 黄网站在线免费看| 日韩精品一区国产麻豆| 久久夜靖品2区| 国产视频一区二区在线观看| 午夜两性免费视频| 欧美日韩久久| 久久久久久久久四区三区| 全球最大av网站久久| 久久精品免费电影| 后进极品白嫩翘臀在线视频| 欧美性生交xxxxxdddd| 一级黄色录像毛片| 国产成人综合精品三级| 99精品在线免费视频| av一区二区高清| 不卡视频一区二区三区| 都市激情综合| 美女福利视频一区| 欧美美乳在线| 在线综合视频播放| 可以在线观看av的网站| 国产精品视频观看| 稀缺呦国内精品呦| 蜜臀久久久久久久| cao在线观看| 色综合久久一区二区三区| 国产精品我不卡| 97精品国产99久久久久久免费| 欧美黑人一级爽快片淫片高清| 免费国产在线视频| 日韩欧美一二三| 在线观看免费中文字幕| 香蕉加勒比综合久久| 美国黑人一级大黄| aaa亚洲精品| 欧美视频亚洲图片| 久久精品人人做人人爽电影蜜月| 欧美一级黄色录像片| 女人丝袜激情亚洲| 国产日韩三区| av在线成人| 国产精品扒开腿做爽爽爽男男| 久久久久黄久久免费漫画| 中文字幕欧美精品在线| 亚洲人视频在线观看| 日韩一级大片在线观看| 依依成人在线视频| 一本一道久久a久久精品| 久久久久性色av无码一区二区| 中文字幕乱码一区二区免费| 三级电影在线看| 成人小视频免费在线观看| 国产三级生活片| 日韩精品欧美成人高清一区二区| 亚洲国产精品无码观看久久| 911精品美国片911久久久| 色噜噜色狠狠狠狠狠综合色一| 激情av综合| 999在线观看免费大全电视剧| 日韩免费大片| 国产精品一区二区久久久久| 欧美性xxx| 日本欧美黄网站| 亚洲啊v在线| 777777777亚洲妇女| av影院在线| 久久久久久香蕉网| 欧美videos另类精品| 美日韩精品免费观看视频| 二区三区在线观看| 免费成人高清视频| av免费在线免费观看| 久久好看免费视频| 欧美三级理伦电影| 中文字幕欧美日韩va免费视频| 国产人成在线视频| 国产亚洲精品日韩| a√资源在线| zzjj国产精品一区二区| 日本中文字幕在线观看| 久久久国产精品视频| 好操啊在线观看免费视频| 久久成人免费视频| 精品无码久久久久久久| 精品91久久| 88xx成人精品| 国偷自产一区二区免费视频| 欧美在线视频免费观看| 性欧美1819sex性高清| 国产成人精品视频在线| 国产精品久久亚洲不卡| 国产日韩欧美一二三区| 久久三级中文| 国产精品视频免费一区| 欧美在线关看| 日韩av图片| 国产精品毛片久久| 大荫蒂性生交片| 中文亚洲欧美| 九九热在线免费| 久久99国产精品尤物| 人妻精品久久久久中文字幕69| 丁香激情综合五月| 中文字字幕码一二三区| 中文在线免费一区三区高中清不卡| 国产又粗又硬又长又爽| 一区二区三区四区在线免费观看| 免费观看一区二区三区毛片| 在线日韩av片| a毛片在线免费观看| 亚洲国产成人精品久久| 高清在线观看av| 九九热这里只有精品6| 中文字幕影音在线| 国产一区二区香蕉| 久久99国产精品久久99大师| 日本一区免费观看| 中文字幕一区二区精品区| 久色视频在线播放| 免费xxxx性欧美18vr| 日韩成人av影院| 亚洲国产电影在线观看| 男女羞羞免费视频| 色婷婷国产精品综合在线观看| 国产精品国产精品国产专区| 精品久久国产字幕高潮| 黄色片在线免费看| 欧美国产中文字幕| 天然素人一区二区视频| 成人9ⅰ免费影视网站| jvid福利在线一区二区| 超碰成人免费在线| 美女诱惑一区二区| 国产精品无码毛片| 伊人婷婷欧美激情| 国产又粗又猛又爽又| 精品卡一卡二卡三卡四在线| 成人精品福利| 97视频在线免费观看| 白嫩亚洲一区二区三区| 欧美18视频| 亚洲毛片播放| 麻豆精品国产传媒| 国产精品色噜噜| 影音先锋在线国产| 欧美精品一区二区三区蜜臀| 色大18成网站www在线观看| 欧亚精品在线观看| 成人午夜大片| 国产成人一二三区| 久草中文综合在线| 亚洲综合欧美综合| 欧美性xxxx极品hd满灌| 亚洲第一天堂在线观看| 日韩中文理论片| av在线不卡精品| 欧美一区二区影视| 亚洲一区区二区| 国产高清成人久久| 亚洲中国最大av网站| 国产精品爽爽久久| 日韩亚洲欧美中文高清在线| 欧美momandson| 麻豆成人av| 午夜亚洲激情| 日韩网站在线播放| 欧美日韩国产一区二区三区| 蜜桃久久一区二区三区| 欧美激情视频免费观看| 亚洲福利合集| 国产在线xxxx| 成人av网站在线观看| 免费中文字幕在线观看| 日韩欧美二区三区| 手机av免费在线| 99在线视频首页| 国内精品久久久久久久97牛牛| 午夜诱惑痒痒网| 悠悠色在线精品| 午夜精品小视频| 欧美极品少妇xxxxx| 99这里只有精品视频| 国产一区二区三区小说| 成人国产电影网| 成人免费区一区二区三区| 亚洲黄色免费三级| 无遮挡在线观看| 久久亚洲一区二区| 日韩极品在线观看| 18啪啪污污免费网站| 欧美猛男男办公室激情| 91国内在线| 国产私拍一区| 噜噜噜在线观看免费视频日韩| 国产美女免费无遮挡| 欧美午夜精品一区二区三区| 91.xxx.高清在线| 99re在线| 国产日韩欧美三区| 久久成人激情视频| 在线播放国产精品二区一二区四区| 午夜小视频福利在线观看| 国产精品theporn88| 国产精品久久久久久模特| 日本性高潮视频| 91精品国产免费| 热色播在线视频| 亚洲欧美国产不卡| 成人a区在线观看| 波多野结衣视频免费观看| 操日韩av在线电影| 偷拍自拍亚洲色图| 国产乱叫456| 欧美日韩国产精品| 免费的黄网站在线观看| 韩国成人av| 激情综合亚洲精品| 丰满少妇乱子伦精品看片| 日韩一区二区福利| 欧美日韩另类图片| www.久久com| 在线一区二区三区四区五区 | 97公开免费视频| 一区二区三区**美女毛片|