#はじめに
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つのサンプルメソッドをテストしてみたいと思います。
/// 税込価格を返す
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
// 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の基本的なところについて書きました。