74
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

Organization

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

スクリーンショット 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の基本的なところについて書きました。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
74
Help us understand the problem. What are the problem?