• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • iOS開發——單元測試

    發表于:2016-06-07來源:cocoa China作者:Sindri的小巢點擊數: 標簽:單元測試
    維基百科對單元測試的定義如下: 在計算機編程中,單元測試(英語:Unit Testing)又稱為模塊測試, 是針對程序模塊(軟件設計的最小單位)來進行正確性檢驗的測試工作。程序單元是

      前言

      維基百科對單元測試的定義如下:

      在計算機編程中,單元測試(英語:Unit Testing)又稱為模塊測試, 是針對程序模塊(軟件設計的最小單位)來進行正確性檢驗的測試工作。程序單元是應用的最小可測試部件。

      在過程化編程中,一個單元就是單個程序、函數、過程等;對于面向對象編程,最小單元就是方法,包括基類(超類)、抽象類、或者派生類(子類)中的方法。

      根據不同場景,單元的定義也不一樣,通常我們將C語言的單個函數或者面向對象語言的單個類視作測試的單元。在使用單元測試的過程中,我們要知道這一點:

      單元測試并不是為了證明代碼的正確性,它只是一種用來幫助我們發現錯誤的手段

      單元測試不是萬能藥,它確實能幫助我們找到大部分代碼邏輯上的bug,同時,為了提高測試覆蓋率,這能逼迫我們對代碼不斷進行重構,提高代碼質量等。

      內置單元測試框架

      在Xcode4.x中集成了測試框架OCUnit,根據測試的目的大致可以將單元測試分為這三類:

      性能測試:測試代碼執行花費的時間

      邏輯測試:測試代碼執行結果是否符合預期

      異步測試:測試多線程操作代碼

      在我們新建項目的時候,已經默認選擇創建單元測試的框架,除了Unit Tests之外還有一個UI Tests是iOS9推出的新特性,針對UI界面的單元測試框架。在創建項目之后,會自動生成一個appName+Tests的文件夾目錄,下面存放著單元測試的文件

      一個標準的測試類文件代碼如下。其中setUp會在每一個測試用例開始前調用,用來初始化相關數據;tearDown在測試用例完成后調用,可以用來釋放變量等結尾操作;testPerformanceExample中的會將方法中的block代碼耗費時長打印出來;最后的testExample 用來執行我們需要的測試操作,正常情況下,我們不使用這個方法,而是創建名為test+測試目的的方法來完成我們需要的操作:

      測試用例

      在每個測試用例方法的左側有個菱形的標記,點擊這個標記可以單獨的運行這個測試方法。如果測試通過沒有發生任何斷言錯誤,那么這個菱形就會變成綠色勾選狀態。使用快捷鍵command+U直接依次調用所有的單元測試。另外,可以在左側的文件欄中選中單元測試欄目,然后直觀的看到所有測試的結果。同樣的點擊右側菱形位置的按鈕可以運行單個測試方法或者文件:

      單元測試總覽

      另外,為了保證單元測試的正確性,我們應當保證測試用例中只存在一個類或者只發生一個類變量的屬性修改。下面是我們測試中常用的宏定義:

      XCTAssertNotNil(a1, format…) 當a1不為nil時成立

      XCTAssert(expression, format...) 當expression結果為YES成立

      XCTAssertTrue(expression, format...) 當expression結果為YES成立;

      XCTAssertEqualObjects(a1, a2, format...) 判斷相等,當[a1 isEqualTo: a2]返回YES的時候成立

      XCTAssertEqual(a1, a2, format...) 當a1==a2返回YES時成立

      XCTAssertNotEqual(a1, a2, format...) 當a1!=a2返回YES時成立

      邏輯測試

      筆者新建了一個用以測試的model類,該類提供了三個接口。需要注意的是,在邏輯測試的某個操作步驟前后,應該有對應的數據發生了改變,這樣才能夠方便我們進行測試:

      @interface LXDTestsModel : NSObject

      @property (nonatomic, readonly, copy) NSString * name;

      @property (nonatomic, readonly, strong) NSNumber * age;

      @property (nonatomic, readonly, assign) NSUInteger flags;

      + (instancetype)modelWithName: (NSString *)name age: (NSNumber *)age flags: (NSUInteger)flags;

      - (instancetype)initWithDictionary: (NSDictionary *)dict;

      - (NSDictionary *)modelToDictionary;

      @end

      在測試用例中,我定義了一個testModelConvert方法用來測試模型跟json之間的轉換是否正確:

      - (void)testModelConvert

      {

      NSString * json = @"{\"name\":\"SindriLin\",\"age\":22,\"flags\":987654321}";

    原文轉自: http://www.cocoachina.com/ios/20160607/16612.html

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>