Подтвердить что ты не робот

XCode 5 Символ тестирования "rT" означает что?

У меня есть 2 тестовых класса в проекте XCode 5:

ABCDataModelTests. {Ч, м}

- (void)testAlwaysPassing { ... }

ABCDataModelListColorsTests.m, который наследуется от ABCDataModelTests.

- (void)testNumberOfListColorsGreaterThan7 { ... }

Когда я запустил тест, я заметил, что под тестами подкласса есть символ "rT", как показано на рисунке.

Что означает "rT"? Обратите внимание, что подкласс наследует метод тестирования "testAlwaysPassing".

Я не могу найти что-либо в документации Apple для "Новые функции в XCode 5/5.0.1". Есть ли какая-либо документация для обозначения всех символов?

enter image description here

4b9b3361

Ответ 1

Я нашел эту информацию на некоторых форумах:

Стандартный способ делать вещи в SenTestingKit/OCUnit/XCTest - объявлять ваши тесты в коде. Если вы это сделаете, Xcode обнаружит их статически (т.е. Не во время выполнения) с использованием индекса. После того, как Xcode обнаружит эти тесты, они отображаются в тестовом навигаторе с иконкой "t". Пока все хорошо.

Теперь рамки SenTestingKit/OCUnit/XCTest также позволяют создавать тесты "на лету" во время выполнения. Некоторые из наших пользователей делают творческий пользователь этой возможности, возможно, для обертывания внешней системы тестирования или для создания тестов для представления динамического набора данных. Xcode не может обнаружить эти тесты статически и только узнать об их существовании, когда они возвращают resutls во время тестового прогона. Когда они обнаружатся, они появятся в тестовом навигаторе с иконкой "rT" . "rT" является коротким для "проверенных временем тестов".

Наконец-то. Если в вашем проекте что-то не так/необычно, что предотвращает завершение индексирования или правильное разбор ваших тестовых классов, ваши тесты не будут обнаружены статически. Вы все еще можете успешно их создавать и запускать, и в этом случае Xcode будет обрабатывать их как обнаруженные тесты времени выполнения и дать им значок "rT" .

Ответ 2

Интересно. Меня очень раздражает та же проблема с тестовым классом, который я создал, дублируя другой файл в среде IDE. Я до сих пор дублировал другие тестовые файлы, чтобы, похоже, не проблема.

У тестового класса есть только один тест внутри него, а другой побочный эффект фиолетового значка и его классификация в качестве теста времени выполнения - это то, что вы не можете запускать тест с помощью значка маленького треугольника, предлагаемого в тестовом бегуне для другие тесты или тестовые классы.

Контекстное меню в тестовом проводнике предлагает тест "testBlah", который, как представляется, выполняет тест.

Выход из XCode, удаление папки xcuserdata​​strong > и перестройка заставили тест распознать снова как обычный тест.

Я получаю напоминания о старых версиях Visual Studio, которые раньше имели проблемы с кешированием, и требовали регулярного удаления данных локального контекста!

Ответ 3

Я согласен с тем, что @everyday_productive сказал

"rT" обычно означает что-то неправильное с индексированием, чтобы исправить это, перейдите на терминал и введите следующее:

$ cd ~/Library/Developer/Xcode/

Убедитесь, что ваш Xcode завершен, а затем удалите папку "Производные данные".

Ответ 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