【问题标题】:XCode 5 Testing symbol "rT" means what?XCode 5 测试符号“rT”是什么意思?
【发布时间】:2013-11-11 01:23:51
【问题描述】:

我在 XCode 5 项目中有 2 个测试类:

ABCDataModelTests.{h,m}

- (void)testAlwaysPassing { ... }

ABCDataModelListColorsTests.m,继承自 ABCDataModelTests。

- (void)testNumberOfListColorsGreaterThan7 { ... }

当我运行测试时,我注意到子类的测试下面有一个符号“rT”,如图所示。

“rT”代表什么?请注意,子类继承了测试方法“testAlwaysPassing”。

我在 Apple 文档中找不到任何关于“XCode 5/5.0.1 中的新功能”的文档。是否有任何文档说明所有符号代表什么?

【问题讨论】:

  • 当我在设备上运行测试时,会出现 rT 图标。在模拟器中运行测试时它们不会出现。

标签: xcode ios7 xcode5 xcode5.0.1


【解决方案1】:

我在一些论坛上找到了这些信息:

在 SenTestingKit/OCUnit/XCTest 中执行操作的标准方法是在代码中声明您的测试。如果你这样做了,Xcode 将使用索引静态地发现它们(即不在运行时)。一旦 Xcode 发现这些测试,它们就会在测试导航器中显示一个“t”图标。到目前为止一切顺利。

现在,SenTestingKit/OCUnit/XCTest 框架还允许您在运行时动态创建测试。我们的一些用户创造性地使用了此功能,可能是为了包装外部测试系统或创建测试来表示一组动态数据。 Xcode 无法静态发现这些测试,只有在测试运行期间返回结果时才能发现它们的存在。被发现后,它们将显示在测试导航器中,并带有“rT”图标。 “rT”是“运行时发现的测试”的缩写。

最后。如果您的项目有任何错误/异常导致索引无法完成或无法正确解析您的测试类,那么您的测试将不会被静态发现。您仍然可以成功构建和运行它们,在这种情况下,Xcode 最终会将它们视为运行时发现的测试,并为它们提供“rT”图标。

【讨论】:

    【解决方案2】:

    有趣。我对通过在 IDE 中复制另一个文件创建的测试类的相同问题感到非常恼火。我之前复制了其他测试文件,所以这似乎不是问题。

    测试类内部只有一个测试,紫色图标的另一个副作用以及将其分类为运行时测试是您无法使用测试运行器中提供的小三角形图标触发测试其他测试或测试类。

    测试资源管理器中的上下文菜单提供了测试“testBlah”,它似乎在执行测试。

    退出 XCode,删除 xcuserdata 文件夹并重建,使测试再次被识别为正常测试。

    我收到提醒,旧版 Visual Studio 曾经存在缓存问题,需要定期删除其本地上下文数据!

    【讨论】:

    • 当您的所有测试开始显示“rT”图标时,通常意味着您的索引无法正常工作。不需要删除您的 xcuserdata。删除派生数据文件夹通常就足够了。要删除派生数据,请打开您的管理器,选择您的项目并单击“删除...”按钮。另请参阅answer
    • Xcode 7.3.1。我发现我必须删除 xcuserdata 文件夹,因为删除派生数据还不够。
    【解决方案3】:

    我同意@everyday_productive 所说的

    “rT”通常表示索引有问题,要解决这个问题,请转到终端并输入以下内容:

    $ cd ~/Library/Developer/Xcode/
    

    确保您的 Xcode 已终止,然后删除“Derived Data”文件夹。

    【讨论】:

      【解决方案4】:

      删除派生数据并没有帮助我摆脱运行这些测试。所以我在XCTestCase 上创建了一个小类别,并且成功了:

      #import "XCTestCase+TestCaseSwizzling.h"
      @import ObjectiveC.runtime;
      
      static NSMutableSet* alreadyRunTests = nil;
      
      @implementation XCTestCase (TestCaseSwizzling)
      
      + (void)load
      {
      static dispatch_once_t onceToken;
      dispatch_once(&onceToken, ^{
      
          alreadyRunTests = [NSMutableSet set];
      
          Class class = [self class];
      
          SEL originalSelector = @selector(invokeTest);
          SEL swizzledSelector = @selector(swizzledInvokeTest);
      
          Method originalMethod = class_getInstanceMethod(class, originalSelector);
          Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
      
          method_exchangeImplementations(originalMethod, swizzledMethod);
      });
      }
      
      - (void)swizzledInvokeTest
      {
           NSString* selectorString = NSStringFromSelector(self.invocation.selector);
      
           if (![alreadyRunTests containsObject:selectorString])
           {
               [alreadyRunTests addObject:selectorString];
               [self swizzledInvokeTest];
           }
       }
      
       @end
      

      【讨论】:

        【解决方案5】:

        从项目中删除对文件的引用,然后重新添加它们。

        【讨论】:

          猜你喜欢
          • 2011-04-07
          • 2014-05-11
          • 1970-01-01
          • 1970-01-01
          • 2022-12-22
          • 2010-09-29
          • 2011-04-18
          • 1970-01-01
          • 2020-04-02
          相关资源
          最近更新 更多