37

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

ABCDataModelTests.{h,m}

- (void)testAlwaysPassing { ... }

ABCDataModelListColorsTests.m 继承自 ABCDataModelTests。

- (void)testNumberOfListColorsGreaterThan7 { ... }

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

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

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

在此处输入图像描述

4

5 回答 5

32

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

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

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

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

于 2013-11-07T23:56:36.500 回答
11

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

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

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

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

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

于 2013-11-15T09:02:22.107 回答
1

删除派生数据并没有帮助我摆脱运行这些测试。所以我创建了一个小类别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
于 2016-08-10T12:04:33.463 回答
1

我同意@everyday_productive 所说的

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

$ cd ~/Library/Developer/Xcode/

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

于 2016-05-23T04:27:36.617 回答
0

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

于 2021-01-30T04:59:45.630 回答