こんにちは!エンジニアの鞠谷です。
iOSアプリにテストコードを導入する場合に、多くの方が選択するのがXCTestだと思います
XCTestにはユニットテストを行う『iOS Unit Testing Bundle』とUIテストを行う『iOS UI Testing Bundle』が存在します。
今回はXCTestを用いてユニットテストを書く方法を説明していきます
それでは、さっそくやっていきましょう!
目次
テストターゲットの追加
XCTestは以下の2つの方法で追加することができます。
- プロジェクト作成時に指定する
- 後から追加する
それぞれの方法について説明します。
プロジェクト作成時に指定する
新規でプロジェクトを作成する際に、テストターゲットも一緒に作成する場合は、Include Tests
にチェックを入れてプロジェクトを作成します。
後から追加する
既存のプロジェクトにテストターゲットを追加する際は、File > New > Target
から Unit Testing Bundle
を選択して追加します。
これでテストターゲットが追加されました。
ユニットテストを追加する
テストターゲットを追加したら、次にユニットテストでテストしたい関数を作成します。
関数の作成
今回は以下の関数を考えてみましょう。
引数は2つ。引数の型は2つともにInt型。
戻り値は引数の2つの2乗を足し合わせたもの。戻り値の型もInt型。
中身の実装はまだしません。
まずは、引数と戻り値の型だけが正しい以下の関数を考えます。
import Foundation
class Calculation {
func getSumOfSquare(a: Int, b: Int) -> Int {
return 1
}
}
これのユニットテストを作成します。
ユニットテストの作成
File > New > File
から UI Test Case Class
を選択してユニットテストを追加します。
そして、 testSumOfSquare()
を書きます。
import XCTest
@testable import <プロジェクト名>
class calculationTests: XCTestCase {
override func setUpWithError() throws {
}
override func tearDownWithError() throws {
}
func testSumOfSquare() throws {
let calculation = Calculation()
XCTAssertEqual(calculation.getSumOfSquare(a: 3, b: 4), 25)
}
}
ここで、主要な関数について解説します。
setUpWithError
override func setUpWithError() throws {
}
各テストメソッドを実行する前に呼び出されるメソッドです。
テストメソッド毎にセットアップしておきたい処理を記述します。
tearDownWithError
override func tearDownWithError() throws {
}
各テストメソッドが実行された後に呼び出されるメソッドです。
テストメソッド毎にリセットしたい処理を記述します。
test<テスト名>
func testSumOfSquare() throws {
let calculation = Calculation()
XCTAssertEqual(calculation.getSumOfSquare(a: 3, b: 4), 25)
}
今回のテストメソッドです。
頭にtest
とついているとテストメソッドと認識されます。
テストメソッド内でXCTAssertEqual
メソッドを実行して、左の値と右の値が同じであるかを判定します。
ユニットテストを失敗してみる
テストメソッドが書けたら、テストを実行してみます。
Product > Test
を実行するとテストが開始されます。
(command + U
でも実行可能です。)
そうすると、まだ実装していないので以下のようにテストが失敗します。
ちゃんと失敗していることが確認できたら、関数の実装をしていきましょう!
関数の実装
関数を以下のように実装します。
import Foundation
class Calculation {
func getSumOfSquare(a: Int, b: Int) -> Int {
return a * a + b * b
}
}
ユニットテストを実行する
関数の実装が終わったら、テストを実行します。
次はちゃんと成功していますね!
おわりに
いかがでしたでしょうか?
実際には、『もっと難しい実装についてテストしたい!』方がほとんどだと思いますが、
テストコードのユニットテストのエッセンスとしてはこんな感じです。
『そこまで難しくないな、導入してみようかな。』という一助になれば幸いです。
またお会いしましょう。