基於測試驅動的iOS開發

         測試按照階段劃分爲:單元測試、集成測試、系統測試和迴歸測試。單元測試是對軟件組成單元進行測試,其目的是檢驗軟件基本組成單位的正確性,其測試對象是軟件設計的最小單位——模塊。單元測試是一種白盒測試。白盒測試是一種細粒度的測試,具體到方法、函數和異常測試,因此是由能夠看懂編程語言、瞭解程序結構的程序員發起的。爲了驗證程序的正確性,程序員需要編寫測試程序,按照測試用例測試程序是否能夠有預期的結果。
1. 測試驅動的軟件開發概述
1.1 測試驅動的軟件開發流程
     傳統的開發流程如圖16-1所示,先是程序編碼,然後設計單元測試用例,編寫單元測試程序,進行單元測試,最後出具單元測試報告。如果測試沒有通過,要根據測試修改程序代碼,然後再重新走單元測試流程。
     而極限編程的測試驅動的軟件開發流程如圖16-2所示,先是設計單元測試用例程序,編寫單元測試程序,然後編寫程序代碼和進行單元測試,最後出具單元測試報告。如果測試沒有通過,根據測試修改程序代碼,然後重新走單元測試流程。如果通過測試,再設計其他的單元測試用例。
     在測試驅動開發流程中,各個階段都是一個可逆的反覆迭代過程。用例的設計可以先是功能說明書中的一個功能,然後針對該功能進行測試驅動的開發流程,再編寫其他的功能。

比較這兩種方式,我們可以發現測試驅動開發的優勢很明顯,它能夠及時地發現程序中的問題,從而少犯錯誤,減少資源浪費。


1.2 測試驅動的軟件開發案例



  2.編寫單元測試程序

iOS單元測試框架有以下幾種:
OCUnit。它是開源測試框架,與Xcode工具集成在一起使用非常方便。測試報告以文本形式輸出到輸出窗口中。
GHUnit。它是開源測試框架,可以將測試報告以應用的形式可視化輸出到設備或模擬器上,也可以以文本的形式輸出到輸出窗口中。使用GHUnit,可以測試用OCUnit編寫的測試用例。
OCMock。它是開源測試框架,主要爲測試提供mock對象(僞對象)。在接下來的內容中,我們會展開介紹這3個框架。

2.1  使用OCUnit 測試框架
 2.1.1  添加OCUnit到工程中
添加OCUnit到工程中,有兩種方法:一種是在創建工程時添加,選中Include Unit Tests複選框;另一種是在現有工程中添加Cocoa Touch Unit Testing Bundle Target來實現。下面我們詳細介紹這兩種添加過程。
1.創建工程時添加


但是打開Scheme列表時,還是隻有一個PITax,這是我們需要注意的。若要運行測試程序,可以選擇ProductTest菜單,或者點擊工具欄中的Test按鈕(下拉Run按鈕選擇),或使用快捷鍵command+u等幾種方式。如果打開Frameworks組,會發現其中添加了SenTestingKit.framework,這就是OCUnit框架。

2.在現有工程中添加Target實現
選擇FileNewTarget…菜單項,從中選擇iOSOther中的Cocoa Touch Unit Testing Bundle模板.




.m文件中,需要重新調用setUptearDown方法。setUp方法是初始化方法,tearDown方法是釋放資源的方法,它們在每次調用測試方法之前和之後調用。因此,在測試類運行的生命週期中,這兩個方法可能多次運行,它們的時序圖



2.1.2 編寫XCTest測試方法
XCTest的前身是OCUnit,它是一個集成在Xcode中的測試框架。它的使用比較簡單,現在Xcode6默認建立的工程就帶有XCTest。當然如果是舊的工程沒有這個測試,或者不小心刪了也沒有關係,可以重新添加以下。
每一個單元測試用例對應於測試類中的一個方法,因此測試類分爲邏輯測試類和應用測試類。在設計測試用
例時,邏輯測試和應用測試也是不同的。編寫XCTest測試方法時,也分邏輯測試和應用測試。
1.邏輯測試用例



2.應用測試用例
應用測試主要用於測試應用程序的一些功能,這些功能具體到點擊一個按鈕觸發一個事件,因此,它主要測
試表示層。


2.1.3  分析測試報告




綠色部分表示測試通過,紅色部分標示測試未通過。點擊小黑三角可以重新測試。command+U測試快捷鍵/
Product->Test
測試用例代碼:

#import <XCTest/XCTest.h>

#import "ViewController0.h"

#import "AppDelegate.h"


@interface PITaxTests : XCTestCase

@property (nonatomic,strong) ViewController0 *vc;

@end


@implementation PITaxTests


/*

 XCTAssertEqualObjects 當兩個對象不相等或者是其中一個對象爲nil時,斷言失敗

 XCTAssertEqual 當參數1不等於參數2時斷言失敗,用於C中的基本數據測試

 XCTAssertNil 當參數不是nil時,斷言失敗

 XCTAssertNotNil 當參數是nil時,斷言失敗

 XCTAssertTrue 當表達式爲false時,斷言失敗

 XCTAssertFalse 當表達式爲true時,斷言失敗

 XCTAssertThrows 如果表達式沒有拋出異常,則斷言失敗

 XCTAssertNoThrow 如果表達式拋出異常,則斷言失敗

 */

- (void)setUp {

    [supersetUp];

    // Put setup code here. This method is called before the invocation of each test method in the class.

    self.vc = [[ViewController0alloc] init];

}


- (void)tearDown {

    // Put teardown code here. This method is called after the invocation of each test method in the class.

    

    self.vc =nil;

    [supertearDown];

}


- (void)testExample {

    // This is an example of a functional test case.

    // Use XCTAssert and related functions to verify your tests produce the correct results.

}


- (void)testPerformanceExample {

    // This is an example of a performance test case.

    [selfmeasureBlock:^{

        // Put the code you want to measure the time of here.

    }];

}

// 測試不輸入直接點擊計算按鈕的情況

- (void)testButtonClickInputBlank

{

    // 設定輸入值

    self.vc.textField.text = @"";

    // 調用ButtonClick

    [self.vcbuttonClick:nil];

    // 取得輸出結果

    XCTAssertEqual(self.vc.myTax,0.00,@"期望值是:0.00實際值是:%f",self.vc.myTax);

}

// 測試整數

- (void)testButtonClickInputIntegerNumber

{

    XCTAssertNotNil(self.vc,@"ViewController沒有賦值");

    // 設定輸入值

    self.vc.textField.text = @"8000";

    // 調用ButtonClick

    [self.vcbuttonClick:nil];

    // 取得輸出結果

    XCTAssertEqual(self.vc.myTax,345.00,@"期望值是:345.00實際值是:%f",self.vc.myTax);

}

// 測試小數

- (void)testButtonClickInputOneDot

{

    XCTAssertNotNil(self.vc,@"ViewController沒有賦值");

    // 設定輸入值

    self.vc.textField.text = @"8000.59";

    // 調用ButtonClick

    [self.vcbuttonClick:nil];

    // 取得輸出結果

    XCTAssertEqual(self.vc.myTax,345.12,@"期望值是:345.12實際值是:%f",self.vc.myTax);

}

// 測試輸入兩個小數點的情況

- (void)testButtonClickInputTwoDot

{

    XCTAssertNotNil(self.vc,@"ViewController沒有賦值");

    // 設定輸入值

    self.vc.textField.text = @"40000.50.56";

    // 調用ButtonClick

    [self.vcbuttonClick:nil];

    // 取得輸出結果

    XCTAssertEqual(self.vc.myTax,8195.15,@"期望值是:8195.15實際值是:%f",self.vc.myTax);

}

// 測試有前導0的數據

- (void)testButtonClickInputfixZero

{

    XCTAssertNotNil(self.vc,@"ViewController沒有賦值");

    // 設定輸入值

    self.vc.textField.text = @"08000.59";

    // 調用ButtonClick

    [self.vcbuttonClick:nil];

    // 取得輸出結果

    XCTAssertEqual(self.vc.myTax,345.12,@"期望值是:345.12實際值是:%f",self.vc.myTax);

}

// 測試連在一起的兩個小數點的情況

- (void)testButtonClickInputLinkDot

{

    XCTAssertNotNil(self.vc,@"ViewController沒有賦值");

    // 設定輸入值

    self.vc.textField.text = @"40000.50..56";

    // 調用ButtonClick

    [self.vcbuttonClick:nil];

    // 取得輸出結果

    XCTAssertEqual(self.vc.myTax,8195.15,@"期望值是:8195.15實際值是:%f",self.vc.myTax);

}

@end



2.2  使用GHUnit 測試框架

GHUnit測試框架是一個基於Objective-C的測試框架,支持Mac OS X 10.5iOS 3.0以上版本。它也是其他一
些框架的基礎框架,比如OCUnitGTMGoogle Toolkit Mac)。一般用於邏輯測試,不用於應用測試。它能夠在設備和模擬器上測試,還支持異步測試。使用GHUnit測試框架後,輸出的日誌信息更加詳細。GHUnit是第三方框架,需要從https://github.com/gabriel/gh-unit/downloads上下載
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章