Edited at

XCTest入門Part1 (Swift)

More than 3 years have passed since last update.


はじめに

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