Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

peka2
Webエンジニア iOSアプリエンジニア DQ10プレイヤー
gamewith
GameWithは、ゲームをプレイされる皆様がより深くゲームを楽しんで頂ける環境を提供するべく設立されました。あなたがゲームをする時のお供になる。これが私達の目標です。
https://gamewith.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away