branch10480’s blog

Topics that I've learned.

iOSアプリ開発自動テストの教科書 を読んでいく 〜 9 〜

XCTest framework について学ぶ

XCTest framework は Apple 公式のテスティングフレームワーク。以下のテストについて実行可能。

  1. 単体テスト
  2. パフォーマンステスト
  3. UIテスト

XCTest は単体テストを指す場合が多い。

サードパーティのOSSフレームワークとの比較

Quick、NimbleはiOSアプリ開発で利用されることが多いOSS。ただし、これらはXCTestの上位互換ではない

以下のようなデメリットを持っている。

  1. 学習コストが高い
  2. Xcodeと統合されていない

また、こうしたサードパーティのツールは実は内部でXCTestを呼び出している場合が多い。

そういった点でXCTestについて学習しておくことは有用である。

テストコードサンプル

import XCTest
@testable import Calc   // [1] Calcモジュールをテスト用にインポート

final class CalculatorTests: XCTestCase {
    
    func testAdd() {
        let calc = Calculator()
        let result = calc.add(1, 2)
        XCTAssertEqual(result, 3)
    }
}

@testable import Calc // [1] Calcモジュールをテスト用にインポート

@testable属性を指定し、テスト対象のモジュールをインポートしている。Swiftにおいては、アクセス修飾子がpublic or openで宣言された要素にしかアクセスできない。

しかし、この特別なインポートを使うとその制限が緩和されてアクセスできるようになる。(デフォルトのinternal属性にもアクセス可能に)

final class CalculatorTests: XCTestCase {

XCTestではXCTestCaseを継承したクラスがテスト用のクラスとして認識される。

func testAdd() {

テスト用のメソッドはtestで始まる名前にする必要がある。

XCTAssertEqual(result, 3)

このような検証を実行する関数のことを一般的に アサーション という。

前処理(Setup)、後処理(TearDown)をまとめる

以下のように各テストメソッド毎に共通する SetupTearDownを共通化できる。

final class CalculatorTests: XCTestCase {

    var calc: Calculator!
    
    override func setUp() {
        super.setUp()
        self.calc = Calculator()
    }

    override func tearDown() {
        super.tearDown()
    }

    func testAdd() {
        let result = calc.add(1, 2)
        XCTAssertEqual(result, 3)
    }

    func testMultiple() {
        let result = calc.multiple(1, 2)
        XCTAssertEqual(result, 2)
    }
}

> 次回に続く