99热99这里只有精品6国产,亚洲中文字幕在线天天更新,在线观看亚洲精品国产福利片 ,久久久久综合网

歡迎加入QQ討論群258996829
麥子學院 頭像
蘋果6袋
6
麥子學院

單元測試基礎教程

發(fā)布時間:2016-07-07 14:02  回復:0  查看:2754   最后回復:2016-07-07 14:02  
這篇文章從單元測試基礎講起,幫助大家理清單元測試的概念。

什么是單元測試

單元測試,就是測試代碼"單元"的功能,以確保在任何可能的條件下達到預期目的的一種測試方法.單元(Unit)是代碼中一個可測試的邏輯部分. 單元測試可以幫助開發(fā)者找到錯誤和崩潰原因,這也是蘋果拒絕上架的首要原因(crash了還上個毛架..)!

測試方法應該要能夠響應所有類型的輸入,包括有效輸入和無效輸入的情況,以確保單元能夠正常運行,可以這么理解,在正常操作下要能獲得我想要的結果,在異常情況(空值,缺少參數..)等一些條件下不反回對象,甚至能夠對錯誤進行處理和回應.無論開發(fā)者對單元進行了什么更改,現有的測試方法都應該能夠成功運行,而新加的測試也應該要成功運行.所以測試方法很關鍵!

But.很多開發(fā)者對單元測試不太感興趣,雖然它十分整潔,可以驗證許許多多的問題,但是創(chuàng)建,維護卻需要花時間.如果要覆蓋所有的功能和使用場景的話.意味著投入精力會更多一點.
小結: 測試可以增加項目的穩(wěn)定性,減少錯誤的發(fā)生.一個良好的測試可以極高地提升用戶的滿意度.


測試基礎概念
Xcode使用XCTest作為單元測試框架,在Xcode5之前,使用的是一個名為OCUnit的開源測試框架. XCTest就是對OCUnit的替代品,能夠更好地與XCode協(xié)作.
單元測試的概念中有四個層級:


測試套件(Test suite): 測試套件是項目中所有測試的集合,在Xcode中,測試套件作為一個獨立的對象存在.


測試用類例(Test case classes): 測試功能是存放在類當中的,每個測試的例類通常是對應一個單獨類來進行測試.比如: 對Login類的測試 ,應該由LoginTests類來完成,所有的單元測試類都必須要繼承XCTestCase類. 


測試用例方法(): 測試用例類包含多個方法,用來測試類的各種功能.


斷言(Assertions): 斷言用于檢查結果是否符合預期,如果不符合,斷言則會失敗,并拋出失敗的原因.(調試神器)
單元測試基礎教程 
E58E1817-B9CF-473E-9F3C-F43D83A1BE51.png
創(chuàng)建項目的時候勾選 Include Unit Tests
成功創(chuàng)建之后,打開項目結構.系統(tǒng)幫我們生成了一個 "項目名+Tests"的文件夾.已經囊括了單元測試的 .m文件. 
單元測試基礎教程 
2EAA4ED8-4E0E-40A9-A6D8-968766AF7339.png
分析下 .m的結構

    #import <XCTest/XCTest.h>
    #import "Person.h"

    @interface UnitTestTests : XCTestCase

    @end

    @implementation UnitTestTests

    - (void)setUp {
      [super setUp];
     // Put setup code here. This method is called before the invocation of each test method in the class.
    }

    - (void)tearDown {
      [super tearDown];

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

    - (void)testExample {

     }

    - (void)testPerformanceExample {

       [self measureBlock:^{

       }];
    }
說說這里面的幾個方法.
測試用例類 包含了 setUp 和 tearDown 方法, 這兩個方法不屬于測試用例方法,他們是測試用例類的初始化和析構方法.setUp里面存放的是所有對象的設置代碼,而tearDown里面存放的是諸如關閉文件,取消網絡請求等清理活動的代碼.Xcode會依次調用 setUp,某個測試用例方法和tearDown方法.如果有多個測試方法的話,那么setUp和tearDown會在每調用一次測試方法的過程中調用一次!
testExample是示例測試方法
testPerformanceExample是性能測試的示例方法.
對于Xcode來說,測試分兩種: 
a. 功能測試 :功能不符合預期會報錯.
b. 性能測試 :性能測試需要設置基準線,一旦發(fā)現測試結果低于基準線,或者超出最大標準差(STDDEV)限制,就會報告一個錯誤.
PS:這里就不對性能測試做其他說明了,有興趣可以自行搜集資料.
注意: 自定義的測試方法必須以 test開始,這樣Xcode才能找到. (左邊有圖標則表明方法有效)
單元測試基礎教程 
運行測試
當指向測試類和測試方法的時候,會出現一個按鈕,我們可以運行所有的測試,也可以運行某一個獨立的測試方法.測試結束后,Xcode將會返回成功或者是失敗結果
單元測試基礎教程 
當然,我們也可以選中我們想要運行的測試類,然后選擇菜單欄的 product->performAction -> Run Test Methods來運行選中的測試類.如果你只選擇了一個測試類的話,那么相應的選項會變成 Run "測試方法名".
單元測試基礎教程 
Xcode將自動編譯并運行應用程序,然后執(zhí)行測試操作,測試操作完畢后,Xcode會退出應用,短暫的顯示測試結果,同時測試結果會以相應的圖標表示測試是否成功!
在修改好我們發(fā)現的問題之后,單擊失敗測試上的運行按鈕,或者 選擇product->performAction -> TestAgian
回到我們的例子. 
單元測試基礎教程 
這是.m的實現文件
單元測試基礎教程 
Paste_Image.png
簡單的給person賦值了一個name,age.
目前沒有對age做任何的判斷.意味著不論是給age 賦值任何 int類型的 值 都能夠成功!這當然不符合我們的預期.
我們在測試類里面可以開始動我們的方法了.
    //  UnitTestTests.m
    //  UnitTestTests
    //
    //  Created by uncle-R on 16/7/5.
    //  Copyright © 2016年 uncle-R. All rights reserved.
    //

    #import <XCTest/XCTest.h>
    #import "Person.h"

    @interface UnitTestTests : XCTestCase

    @property (nonatomic, strong) Person *p1;
    @end

    @implementation UnitTestTests

    - (void)setUp {
        [super setUp];
      //給p1.賦值一個 -1的age;
        self.p1 = [[Person alloc]initWithName:@"小明" andAge:-1];
        // Put setup code here. This method is called before the invocation of each test method in the class.
    }

    - (void)tearDown {
        // Put teardown code here. This method is called after the invocation of each test method in the class.
        [super tearDown];
    }

    - (void)testAge{
        //我們想要的結果是年齡不管怎樣都必須大于0.
        XCTAssert(self.p1.age > 0 ,@"年齡必須大于0");

    }

    - (void)testExample {
        // This is an example of a functional test case.
        // Use XCTAssert and related functions to verify your tests produce the correct results.
        //[self ageTest];
    }

    - (void)testPerformanceExample {
        // This is an example of a performance test case.
        [self measureBlock:^{
            // Put the code you want to measure the time of here.
        }];
    }

結果如下
單元測試基礎教程 
可見測試結果失敗.我們必須在person類的修改.
   #import "Person.h"

    @implementation Person

    -(instancetype)initWithName:(NSString*)name andAge:(int)age{

        if (self = [super init]) {
            //對小于0的年齡做處理
            if(age <= 0) age = 1;
            self.age = age;

            self.name = name;
        }
        return self;
    }

    @end
在運行一次測試.
單元測試基礎教程 
我們成功的通過了測試.



原文來自:簡書/uncleRX
您還未登錄,請先登錄

熱門帖子

最新帖子

?