在单元测试中使用NSLog,输出太慢,只有几次快

时间:2012-08-08 10:21:51

标签: ios objective-c multithreading unit-testing grand-central-dispatch

我在iOS的单元测试中使用NSLog时遇到了一个奇怪的问题。

守则

这是我在单元测试中使用的测试代码。

- (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
  4. 我试过的模式

    1. 更改2个不同网址的顺序,例如,先让www.google.com运行,或先让www.apple.com运行。
    2. dispatch_semaphore_xxx的使用更改为sleep()
    3. NSLog()更改为printf()
    4. 将此代码作为Cocoa控制台应用程序运行。
    5. 删除第二个网址请求的测试。
    6. 结果

      1. 运行时间0.4s~30s
      2. 运行时间0.4s~30s
      3. 运行时间0.4s~30s
      4. 运行时间~0.4s
      5. 运行时间~0.4s
      6. 问题

        1. 当我尝试前3种模式时会发生什么?
        2. 你有类似的问题吗?
        3. 这些是否有解决方案?
        4. 谢谢你们!

1 个答案:

答案 0 :(得分:0)

这是SenTest和NSLog的问题。基本上,日志通过管道传送到测试运行器,测试运行器将数据发送回XCode中的控制台窗口。

NSLog写入stderr,因此如果将其重定向到文件,则可以获取日志数据。

不幸的是,当一切都完成后,将它全部写回来还需要一段时间。

如果我需要在测试期间记录一堆数据,我会将stderr重定向到一个文件,然后在测试运行时“tail -f”它,如果我想看它滚动。当它结束时,我可以在mvim或XCode中查看文件。