iOS アプリケーションの開発中に Test ターゲットと通常の Run ターゲットでコードを実行しているかどうかをプログラムで判断する方法はありますか?
この変数が nil であるかどうかをチェックするハックがありますが、これはテスト ターゲットにのみあるためですが、これはかなりハックのようです。
[[[NSProcessInfo processInfo] environment] objectForKey:@"XCInjectBundle"]
これらの答えはどれも本当に役に立ちませんでした。テスト ターゲットでのログ記録を制限するという唯一の目的で、テストを実行していることをアプリに知らせたかったのです。たくさんのものをログに記録していないときは、テストがより速く実行されます。そのため、スキームのテスト部分にカスタム引数を追加することでそれを行いました。
アプリケーション コードで、テストを行っているかどうかを確認できるようになりました。
- (void)logError:(NSError*)error{
if([[[NSProcessInfo processInfo] arguments] containsObject:@"-FNTesting"])
return;
NSLog(@"LOG THE ERROR");
}
カスタム引数の使用方法を実際に見つけることができる唯一の場所の1つである@cameronspickertに感謝します
http://cameronspickert.com/2014/02/18/custom-launch-arguments-and-environment-variables.html
ターゲット設定の「プリプロセッサ マクロ」に適切な値を定義する必要があります。
実行時にifdef
文で確認できます。
これで、「 UITesting 」の 1 行のコードで簡単に確認できます。
[[[NSProcessInfo processInfo] arguments] containsObject:@"-ui_testing"]
-ui_testingは、アプリのテスト時にのみ表示されます。
Xcode 7.3 でテスト済み
でカテゴリを作成しますNSProcessInfo
。
@implementation NSProcessInfo (RunningTests)
- (BOOL)ag_isRunningTests {
return ([self.environment objectForKey:@"XCTestConfigurationFilePath"] != nil);
}
@end
Xcode 6XPC_SERVICE_NAME
では、環境変数の値をチェックして、シミュレーターがテストを実行しているか、アプリを直接実行しているかを確認できます。
直接実行すると、変数は次のようになりますUIKitApplication:com.twitter.FabricSampleApp[0xb9f8]
単体テストを実行すると、次のようになります。com.apple.xpc.launchd.oneshot.0x10000008.xctest
+ (BOOL)isRunningUnitTests {
NSString *XPCServiceName = [NSProcessInfo processInfo].environment[@"XPC_SERVICE_NAME"];
BOOL isTesting = ([XPCServiceName rangeOfString:@"xctest"].location != NSNotFound);
return isTesting;
}
プロジェクト設定の[情報]タブで、(デフォルトの[デバッグ]と[リリース]に加えて)新しい構成を作成します。次に、構成ごとに、ターゲット設定([ビルド設定]タブ)でさまざまなプリプロセッサマクロを定義できます。XCodeはすでにそれを使用して、デバッグ構成に「DEBUG = 1」を追加します。これにより、コードで「#ifdefDEBUG」を使用できるようになります。「TESTING=1」など、この方法で好きな他のマクロを追加できます。