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_XCODEBUILDSwiftの場合は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.
                }
            }
        }
    }
}参考文献
この記事のコードは以下で確認することができます.
                記事が気に入ったらチップを送ることができます!
                You can give me a cup of coffee :)
                
                Kyash ID: soranoba
                Amazon: Wish List
                GitHub Sponsor: github.com/sponsors/soranoba
                PayPal.Me: paypal.me/soranoba
              
(Updated: )
