基於測試驅動的iOS開發

         測試按照階段劃分爲:單元測試、集成測試、系統測試和迴歸測試。單元測試是對軟件組成單元進行測試,其目的是檢驗軟件基本組成單位的正確性,其測試對象是軟件設計的最小單位——模塊。單元測試是一種白盒測試。白盒測試是一種細粒度的測試,具體到方法、函數和異常測試,所以是由可以看懂編程語言、瞭解程序結構的程序員發起的。爲了驗證程序的正確性,程序員須要編寫測試程序,按照測試用例測試程序是否可以有預期的結果。git

1. 測試驅動的軟件開發概述程序員

1.1 測試驅動的軟件開發流程github

     傳統的開發流程如圖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,這是咱們須要注意的。若要運行測試程序,能夠選擇Product→Test菜單,或者點擊工具欄中的Test按鈕(下拉Run按鈕選擇),或使用快捷鍵command+u等幾種方式。若是打開Frameworks組,會發現其中添加了SenTestingKit.framework,這就是OCUnit框架。

 

2. 在現有工程中添加Target實現

選擇File→New→Target…菜單項, 從中選擇iOS→Other中的Cocoa Touch Unit Testing Bundle模板.

 

 

在.m文件中,須要從新調用setUp和tearDown方法。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.5和iOS 3.0以上版本。它也是其餘一

些框架的基礎框架,好比OCUnit和GTM(Google Toolkit Mac)。通常用於邏輯測試,不用於應用測試。它可以在設備和模擬器上測試,還支持異步測試。使用GHUnit測試框架後,輸出的日誌信息更加詳細。 GHUnit是第三方框架,須要從https://github.com/gabriel/gh-unit/downloads上下載

相關文章
相關標籤/搜索