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回実行して、
処理にかかった時間の平均標準偏差(ばらつき)を測定することができます。

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

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

テストしてみる

テスト対象のメソッド

今回はMVCモデルのうちModelに当たる部分のみテストします。

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

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として作成します。

以下のように作成されます。

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となります。

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

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の基本的なところについて書きました。