LoginSignup
73
77

More than 5 years have passed since last update.

XCTest入門Part1 (Swift)

Last updated at Posted at 2016-07-31

はじめに

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

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

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

パフォーマンステストについて

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

スクリーンショット 2016-08-01 2.47.20.png

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

スクリーンショット 2016-08-01 1.05.53.png

スクリーンショット 2016-08-01 1.06.14.png

以下のように作成されます。
スクリーンショット 2016-08-01 1.07.17.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となります。

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

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

73
77
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
73
77