branch10480’s blog

Topics that I've learned.

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

テストを階層化する - XCTContext

テストを階層化して表現したいと思った時に使えるのが、XCTContext.runActivity

func safeDivision(_ x: Int, _ y: Int) -> Int? {
    if y == 0 {
        return nil
    } else {
        return x/y
    }
}

上に対するテストが以下。

func testSafeDivision() {
    // 通常の割り算
    XCTAssertEqual(safeDivision(6, 3), 2)
    XCTAssertEqual(safeDivision(6, 2), 3)
    
    // 0除算
    XCTAssertNil(safeDivision(6, 0))
}

これをXCTContext.runActivityを使ってグルーピングする。

func testSafeDivision() {
    XCTContext.runActivity(named: "通常の割り算") { _ in
        XCTAssertEqual(safeDivision(6, 3), 2)
        XCTAssertEqual(safeDivision(6, 2), 3)
    }
    
    XCTContext.runActivity(named: "0除算") { _ in
        XCTAssertNil(safeDivision(6, 0))
    }
}

さらにネストさせることも可能。ただし可読性については意識すること!

func testSafeDivision() {
    XCTContext.runActivity(named: "通常の割り算") { _ in
        XCTContext.runActivity(named: "6 / 3 = 2") { _ in
            XCTAssertEqual(safeDivision(6, 3), 2)
        }
        XCTContext.runActivity(named: "6 / 2 = 3") { _ in
            XCTAssertEqual(safeDivision(6, 2), 3)
        }
    }
    
    XCTContext.runActivity(named: "0除算") { _ in
        XCTAssertNil(safeDivision(6, 0))
    }
}

Quickではより複雑な構造化が可能。

> 次回に続く