soranoba
soranoba Author of soranoba.net
programming

QuickでCIの時だけ特定のテストをスキップする

CI実行時のみなど, コマンドラインからの実行時のみ特定のテストを実行したい・実行したくない場合に使える方法を紹介します.

Defineの動的設定

コマンドラインからのテスト実行時, 以下のようなコマンドを実行することで, 環境変数を渡すことができます.
これを使用し, 環境変数が定義されているかそうでないかを判定に用います.

xcodebuild -workspace ${WORKSPACE} -scheme ${SCHEME} -disable-concurrent-destination-testing \
		-destination-timeout 300 \
		-destination 'platform=iOS Simulator,name=iPhone 11,OS=14.4' \
		clean test
		clean test \
		FROM_XCODEBUILD=FROM_XCODEBUILD

Swiftの場合はOTHER_SWIFT_FLAGSで以下のように設定することで, 異なる値をDefineすることができます.

  • 環境変数未定義時: __X___
  • 環境変数設定時: __X_FROM_XCODEBUILD__
OTHER_SWIFT_FLAGS = "$(inherited) -D __X_$(FROM_XCODEBUILD)__";

Objective-Cの場合は, GCC_PREPROCESSOR_DEFINITIONSに以下のような設定をすることで, 異なる値をDefineすることができます.

GCC_PREPROCESSOR_DEFINITIONS = (
    "__X_$(FROM_XCODEBUILD)__=$(FROM_XCODEBUILD)",
    "$(inherited)",
);

Quickで特定のテストをスキップする

上記の方法で判定ができるようになるので, Quickを使用する場合は以下のようにflagsを設定することで, FROM_XCODEBUILD=FROM_XCODEBUILDの場合のみテストが実行されるようになります.

class SampleTestSpec: QuickSpec {
    override func spec() {
        #if __X_FROM_XCODE_BUILD__
            let isFromXcodeBuild = true
        #else
            let isFromXcodeBuild = false
        #endif

        describe("", flags: [Filter.pending: isFromXcodeBuild]) {
            it("") {
                // do something.
            }
        }
    }
}

2022.04.25 追記
Quick v5.0.0でflagsが使用できなくなった為, if文なりでラップする必用があります.

class SampleTestSpec: QuickSpec {
    override func spec() {
        #if __X_FROM_XCODE_BUILD__
            let isFromXcodeBuild = true
        #else
            let isFromXcodeBuild = false
        #endif

        if !isFromXcodeBuild {
            describe("") {
                it("") {
                    // do something.
                }
            }
        }
    }
}

参考文献


この記事のコードは以下で確認することができます.

(Updated: )

comments powered by Disqus