0

NSLogiOS の単体テストでの使用に関する奇妙な問題に直面しています。

コード

これが、単体テストで使用しているテストコードです。

- (void)testExample
{
  NSOperationQueue *newqueue = [[NSOperationQueue alloc] init];
  NSURLRequest *request2 = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.apple.com"]];

  dispatch_semaphore_t sema2 = dispatch_semaphore_create(0);
  [NSURLConnection sendAsynchronousRequest:request2 queue:newqueue completionHandler:^(NSURLResponse *resp, NSData *data, NSError *error) {
    //    NSLog(@"2: Data: %@", data);
    printf("2: Data: %s\n", [[data description] UTF8String]);
    dispatch_semaphore_signal(sema2);
  }];

  //  sleep(2);
  dispatch_semaphore_wait(sema2, DISPATCH_TIME_FOREVER);
  dispatch_release(sema2);

  NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.google.com"]];
  NSOperationQueue *queue = [[NSOperationQueue alloc] init];

  dispatch_semaphore_t sema = dispatch_semaphore_create(0);
  [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *resp, NSData *data, NSError *error) {
    NSLog(@"1: Data: %@", data);
    dispatch_semaphore_signal(sema);
  }];

  //  sleep(2);

  dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
  dispatch_release(sema);

  NSLog(@"Over");
}

コードを使用するには

  1. 単体テストで簡単な iOS プロジェクトを作成します。
  2. 上記のコードを xxxTest.m に貼り付けます
  3. ⌘ + u を押します

試したパターン

  1. 2 つの異なる URL の順序を変更します。たとえば、最初に実行www.google.comするか最初に実行するかを変更しwww.apple.comます。
  2. dispatch_semaphore_xxxの使用をに変更しますsleep()
  3. NSLog()に変更printf()
  4. このコードを Cocoa コンソール アプリとして実行します。
  5. 2 番目の URL 要求のテストを削除します。

結果

  1. 走行時間 0.4秒~30秒
  2. 走行時間 0.4秒~30秒
  3. 走行時間 0.4秒~30秒
  4. 実行時間 ~0.4 秒
  5. 実行時間 ~0.4 秒

質問

  1. 最初の 3 つのパターンを試すとどうなりますか?
  2. あなたと同じような問題がありますか?
  3. これらの解決策はありますか?

君たちありがとう!

4

1 に答える 1

0

これは SenTest と NSLog の問題です。基本的に、ログはテスト ランナーにパイプされ、テスト ランナーはデータを XCode のコンソール ウィンドウに送り返します。

NSLog は stderr に書き込むので、それをファイルにリダイレクトすると、ログ データを取得できます。

残念ながら、すべてが完了したときに、すべてを元に戻すにはまだしばらく時間がかかります。

テスト中に大量のデータをログに記録する必要がある場合は、stderr をファイルにリダイレクトし、スクロールを見たい場合はテストの実行中に「tail -f」します。終了したら、mvim または XCode でファイルを表示できます。

于 2012-08-08T14:40:48.393 に答える