XCTestを使ってテストを階層化する

2022-06-28

はじめに

皆さん Swift のテスト書いていますか?私は書いています(書けるところは)。時々 Ruby(Rspec)のテストコードが目に入るときがあるのですが、describeなどを使って、テストケースを階層化しているのを見かけます(たまたま目に入る機会が多いだけで階層化が Ruby のデファクトスタンダードなのかはおいといて)。

業務では、Android をメインに時々 iOS をやっているので、Swift の XCTest だけでできるのか気になりました。そこで色々調べてみました。

XCTContext.runActivity を使う

XCTContext.runActivityを使うことでテストを階層化することができます。ただしこれは Ruby(Rspec)で言うdescribeに該当するかは別ですが…

今回試したソースコードはGitHubにもアップしています。クローンして手元でswift testで動きます。

テスト対象のクラスです。

Tructuralization.swift
import Foundation

public struct Tructuralization {
    let a: Int
    let b: Int

    public init(a: Int, b: Int) {
        self.a = a
        self.b = b
    }

    public func add() -> Int {
        return a + b
    }

    public func subtract() -> Int {
        return a - b
    }
}

Tructuralization を階層化してテストを書いたテストです。

TructuralizationTests.swift
import XCTest
@testable import Tructuralization

final class TructuralizationTests: XCTestCase {
   let tructuralization1 = Tructuralization(a: 1, b: 2)
   let tructuralization2 = Tructuralization(a: 10, b: 20)

    override func setUp() {
        // Put setup code here. This method is called before the invocation of each test method in the class.
    }

    override func tearDown() {
        // Put teardown code here. This method is called after the invocation of each test method in the class.
    }

    func testPractice() {
        XCTContext.runActivity(named: "足し算のテスト") { _ in
            XCTAssertEqual(tructuralization1.add(), 3)
            XCTAssertEqual(tructuralization2.add(), 30)
        }

        XCTContext.runActivity(named: "引き算のテスト") { _ in
            XCTAssertEqual(tructuralization1.subtract(), -1)
            XCTAssertEqual(tructuralization2.subtract(), -10)
        }
    }
}

階層化するメリットはテスト対象のメソッドが nil を許容する場合に、nil を入れた場合と入れない場合を同一の階層に記述することで、見やすくなるメリットがあるのかなと思いました。

最後に

Rspec では他にもcontextなどもあるのでそれに該当するのは XCTest にあるのか少し気になりました。そういったことをしたい場合は、Quick などを使うことが多いんですかね?

今回、iOS アプリ開発自動テストの教科書を参考にさせていただいたのですが、今まで辞書的な使い方をしていたので一度、最初から最後まで読んでみようと思いました。

また時間があったら、Android(Java、Kotlin)の場合ではどうなるか調べたいなとも思いました。

参考

Tatsumi0000

Written by Tatsumi0000 モバイル開発が好きなエンジニアのブログです. GitHub

Copyright © 2023, Tatsumi0000 All Rights Reserved.