XCTest入門Part1 (Swift)

#はじめに
XCTestでテストコードを書いてみます。
Part1では、ユニットテストとパフォーマンステストの基礎について記載します。

Part2も書きました。
XCTest入門Part2 (Swift) ~非同期編~
http://qiita.com/okuderap/items/e02b73880b8bc499debe

XCTestでカバレッジを確認する方法についてはこちら。
http://qiita.com/okuderap/items/de574685592fe0bee8ea

#パフォーマンステストについて
XCTestではパフォーマンスを測定することができます。
self.measureBlock{ }内のコードを10回実行して、
処理にかかった時間の**平均**と**標準偏差(ばらつき)**を測定することができます。

<img width="245" alt="スクリーンショット 2016-08-01 2.47.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/bcbaa0c2-4e20-f824-c10a-f9f4ab21c7ed.png">


Baseline
→基準値を設定します。これより時間がかかると失敗となります。
Max STDDEV
→標準偏差の最大値を設定します。これを上回る(ばらつきが大き過ぎる)と失敗となります。

データをダウンロードする処理や、エンコード・デコード処理など時間のかかる処理のパフォーマンスを測定する際に有用だと思います。

#テストしてみる
##テスト対象のメソッド
今回はMVCモデルのうちModelに当たる部分のみテストします。

以下の2つのサンプルメソッドをテストしてみたいと思います。

```swift:Model.swift
    /// 税込価格を返す
    func taxIncludedPrice(taxExcludedPrice: UInt) -> UInt {
        return taxExcludedPrice * 108 / 100
    }
    
    /// 文字列の末尾がpでなければpをつける
    func addSuffixP(inout name: String) -> Bool {
        if name.hasSuffix("p") {
            return false
        }
        name = name + "p"
        return true
    }
```

##テストコードについて
テストケースクラスを作成します。
名前は、<テスト対象のクラス名 + Tests>としています。
本サンプルはModel.swiftのテストをするので、ModelTests.swiftとして作成します。

<img width="705" alt="スクリーンショット 2016-08-01 1.05.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/f2cd2b5b-41b0-1c4b-0799-c6a3e7a4c17f.png">

<img width="718" alt="スクリーンショット 2016-08-01 1.06.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/e5fc152b-4a67-2fee-ef3f-97d187e359e3.png">

以下のように作成されます。
<img width="729" alt="スクリーンショット 2016-08-01 1.07.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/630f7da9-f326-370e-ba58-88af38e4a9c3.png">

setup( )
→各テストを実行する前に毎回呼ばれます。
tearDown( )
→各テスト実行後に毎回呼ばれます。
testExample( )
→テストコードのサンプルです。\<test + テスト対象のメソッド名>
testPerformanceExample( )
→パフォーマンステストのサンプルです。\<testPerformance + テスト対象のメソッド名>

テストを実行すると、
setup( )→testExample( )→tearDown( )
→setup( )→testAaa( )→tearDown( )
→setup( )→testBbb( )→tearDown( )
という流れで各テストを実行していきます。

##テストコードを書いてみる
`@testable import ${PROJECT_NAME}`と記述することで、
public, internalシンボルのテストが可能になります。
プロジェクト名がSwiftXCTestSampleであれば、
`@testable import SwiftXCTestSample`となります。

本サンプルのテスト対象のメソッドは単純な処理ですが、
パフォーマンステストのコードも併せて書いてみます。

```swift:ModelTests.swift
//
//  ModelTests.swift
//  SwiftXCTestSample
//

import XCTest
@testable import SwiftXCTestSample

class ModelTests: XCTestCase {
    
    let model = Model()

    override func setUp() {
        super.setUp()
    }
    
    override func tearDown() {
        super.tearDown()
    }

    func testTaxIncludedPrice() {
        
        var testPrice: UInt = 0
        XCTAssertEqual(model.taxIncludedPrice(testPrice), 0)
        
        testPrice = 100
        XCTAssertEqual(model.taxIncludedPrice(testPrice), 108)
    }

    func testPerformanceTaxIncludedPrice() {
        
        self.measureBlock {
            let testPrice: UInt = 100
            XCTAssertEqual(self.model.taxIncludedPrice(testPrice), 108)
        }
    }
    
    func testAddSuffixP() {
        var name = "okudera"
        XCTAssertTrue(model.addSuffixP(&name))
        
        name = "cap"
        XCTAssertFalse(model.addSuffixP(&name))
    }
    
    func testPerformanceAddSuffixP() {
        
        self.measureBlock {
            var name = "okudera"
            XCTAssertTrue(self.model.addSuffixP(&name))
        }
    }
}

```

本サンプルで使用したAssert
XCTAssertEqual
→2値が等しいことをテスト
XCTAssertTrue
→trueであることをテスト
XCTAssertFalse
→falseであることをテスト

このほかにも
XCTAssertNotEqual
→2値が等しく無いことをテスト
XCTAssertNil
→nilであることをテスト
XCTAssertNotNil
→nilで無いことをテスト
などのAssertがあります。

#さいごに
今回はXCTestの基本的なところについて書きました。