1
0

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 3 years have passed since last update.

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

Last updated at Posted at 2021-04-05

担当しているプロジェクトの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の処理が効いているように見えません。。

なぜ...?

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

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

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

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

Spec1.swift

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())
                }
            }
        }
    }
   
}
Spec2.swift
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 内に書くことで対処しました。

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?