42
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-03-13

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

42
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
42
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?