Xcode
XCTest
Swift
Quick
Xcode9

XCTContext.runActivity(named:)を使ってユニットテストを構造化する

XCTContext.runActivity(named:) について

これを使うとテストが構造化できるようになります🙆

XCTestの弱点

XCTestはテストの構造化に弱かったため、1つのテストメソッドにいろんなテストを詰め込んでしまい、
「これは何をしているテストなんだ?」と頭を抱える羽目になったり、
頑張ってテストメソッドの命名ルールを作ったりしてテストパターンを切り分ける工夫をしていました。

それを嫌って、Spec記法が使える Quick を導入しているプロダクトも多いのではないかと思います

しかし、Xcode9から追加された XCTContext.runActivity(named:)  を使うことでXCTest単体でもテストの構造化ができるようになりました

書き方

class VersionTests: XCTestCase {

    override func setUp() {
        super.setUp()
        print("setUp")
    }

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

    func testCompareVersion() {
        XCTContext.runActivity(named: "バージョン比較") { _ in
            XCTContext.runActivity(named: " < ") { _ in
                var resultFalse = Version(rawString: "1.2.0") < Version(rawString: "1.1.0")
                XCTAssertFalse(resultFalse)
                resultFalse = Version(rawString: "1.2.10") < Version(rawString: "1.2.9")
                XCTAssertFalse(resultFalse)
                resultFalse = Version(rawString: "2.0.0") < Version(rawString: "1.9.99")
                XCTAssertFalse(resultFalse)
                resultFalse = Version(rawString: "2.0.1") < Version(rawString: "2.0.1")
                XCTAssertFalse(resultFalse)
            }

            XCTContext.runActivity(named: " > ") { _ in
                var resultTrue = Version(rawString: "2.1.0") > Version(rawString: "2.0.0")
                XCTAssertTrue(resultTrue)
                resultTrue = Version(rawString: "3.0.0") > Version(rawString: "2.0.0")
                XCTAssertTrue(resultTrue)
                resultTrue = Version(rawString: "3.0.1") > Version(rawString: "3.0.0")
                XCTAssertTrue(resultTrue)
            }
        }
    }
}

テストを実行しテスト結果を見てみると…
image.png

このように、テスト結果も構造化された状態で見ることができます

setUp() や tearDown() については今までどおり、各テストメソッドの開始前後に呼び出されます

ブロック単位で前後に処理をはさみたい場合は自力で実装するしかないようです。。もしくは他に手段があったら教えてください:bow:

お手軽に使えるので、QuickなどOSSを導入することに躊躇しているならば、こちらを使ってみると良さそうです。
  
  
  
※テスト対象の Version は以下の記事を参考に作らせていただいてます。
SwiftではバージョンはStructにして演算子オーバーロードで比較したらどうでしょう - Qiita
https://qiita.com/yimajo/items/ed496545962c83e3f9bf