branch10480’s blog

Topics that I've learned.

複数のQuickSpecのbeforeSuiteとitの実行順序

担当しているプロジェクトのUIテストコードに Quick/Nimble(テスト用フレームワーク) を導入しようとして若干ハマったのでメモします。

何に詰まったのか

最初、Spec1とSpec2のように複数のQuickSpecを用意して、それぞれ初期化処理をしてから実際のテストを走らせようとしていました。

  • Spec1
    • beforeSuite1 - (A)
    • it1 - (B)
  • Spec2
    • beforeSuite2 - (C)
    • it2 - (D)

構造としては上記にようにして、私は以下の実行順序を期待します。

  1. Spec1について、beforeSuite -> it
  2. Spec2について、beforeSuite -> it

しかし実際にテストを実行してみると、Spec2のbeforeSuiteの処理が効いているように見えません。。

なぜ...?

簡単なプロジェクトを作ってチェック

そこで、簡単なサンプルプロジェクトを作ってログを仕込み、実行順序を見てみることにしました。

私が用意したプロジェクトはこちらです。

https://github.com/branch10480/QuickSample

こんな感じに Spec1 と Spec2 を用意して実行します。

class Spec1: QuickSpec{
    
    override func spec() {
        beforeSuite {
            print("===============================")
            print("> This is a beforeSuite on Spec1.")
            print("===============================")
            
            let app = XCUIApplication()
            app.launch()
            
        }
        describe("description") {
            context("context") {
                it("it1") {
                    print("-------------------------------")
                    print("> This is a testing on Spec1.")
                    print("-------------------------------")
                    sleep(5)
                    expect(true).to(beTrue())
                }
            }
        }
    }
   
}
class Spec2: QuickSpec{
    
    override func spec() {
        beforeSuite {
            print("===============================")
            print("> This is a beforeSuite on Spec2.")
            print("===============================")
            
            let app = XCUIApplication()
            app.launch()
            
        }
        describe("description") {
            context("context") {
                it("it2") {
                    print("-------------------------------")
                    print("> This is a testing on Spec2.")
                    print("-------------------------------")
                    sleep(5)
                    expect(true).to(beTrue())
                }
            }
        }
    }
    
}

実行してみた結果、このようにログ出力されました。 (間に入ったログは省略)

===============================
> This is a beforeSuite on Spec1.
===============================
...
===============================
> This is a beforeSuite on Spec2.
===============================
...
-------------------------------
> This is a testing on Spec1.
-------------------------------
...
-------------------------------
> This is a testing on Spec2.
-------------------------------

結論

  • Spec1
    • beforeSuite1 - (A)
    • it1 - (B)
  • Spec2
    • beforeSuite2 - (C)
    • it2 - (D)

上記の場合、実行順序はこのようになるということでした。

(A) -> (C) -> (B) -> (D)

UIテストで beforeSuite 上にアプリの起動処理を書いて初期化しようとしていましたが、起動を2回してからテストを実行していたということですね。

結局、UIテストでは beforeSuite に起動処理を書かずに it1, it2 内に書くことで対処しました。