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

Покрытие кода Xcode5 (из cmd-строки для сборки CI)

Как я могу создать покрытие кода с помощью Xcode 5 и iOS7?

До обновления я получал код очень хорошо. Теперь я не вижу никаких файлов *.gcda.

Используемая мной cmd-строка:

xcodebuild -workspace ${module.name}.xcworkspace test -scheme ${module.name} -destination OS=${module.sdk.version},name=iPad -configuration Debug

Работает с AppCode

  • Когда я запускаю тесты через AppCode, я могу видеть файлы *.gcda, которые производятся в ~/Library/Caches/appCode20/DerivedData., Мне нужно, чтобы это работало для моей сборки Continuous Integration.

Работает из Xcode IDE

  • Также работает с Xcode IDE., есть ли cmd-строка, которая будет создавать покрытие, или это ошибка Xcode?
4b9b3361

Ответ 1

Обновление: новый принятый ответ

В некоторых случаях очистка покрытия должна выполняться из самого приложения. В обзоре решения в этом вопросе приводятся подробности.

Ответ 2

Ниже приведено исправление для SenTestKit - просто добавьте этот класс в целевую аудиторию. Что-то подобное должно быть возможно с XCTest

@interface VATestObserver : SenTestLog

@end

static id mainSuite = nil;

@implementation VATestObserver

+ (void)initialize {
    [[NSUserDefaults standardUserDefaults] setValue:@"VATestObserver" forKey:SenTestObserverClassKey];

    [super initialize];
}

+ (void)testSuiteDidStart:(NSNotification*)notification {
    [super testSuiteDidStart:notification];

    SenTestSuiteRun* suite = notification.object;

    if (mainSuite == nil) {
        mainSuite = suite;
    }
}

+ (void)testSuiteDidStop:(NSNotification*)notification {
    [super testSuiteDidStop:notification];

    SenTestSuiteRun* suite = notification.object;

    if (mainSuite == suite) {
        UIApplication* application = [UIApplication sharedApplication];
        [application.delegate applicationWillTerminate:application];
    }
}

и добавьте

extern void __gcov_flush(void);

- (void)applicationWillTerminate:(UIApplication*)application {
    __gcov_flush();
}

Почему это работает?

Тесты и тестируемое приложение скомпилируются отдельно. Тесты фактически вводятся в запущенное приложение, поэтому __gcov_flush() необходимо вызвать внутри приложения, не входящего в тесты.

Маленькая магия с наблюдателем позволяет нам проверять, когда тесты закончатся, и мы вызываем __gcov_flush() для вызова внутри приложения.

Ответ 3

(Это не ответ, но обход... Я все еще очень заинтересован в лучшем решении)

Использовать iOS 6.1 Simulator

Если вы ориентируетесь на iOS 6.1 или ранее в качестве цели развертывания, вы можете использовать симулятор 6.1.

  • Установите iOS6.1 Simulator через настройки/загрузки
  • Используйте следующую строку cmd:

    xcodebuild -workspace ${module.name}.xcworkspace test -scheme ${module.name} -destination OS = 6.1, name = iPad -configuration Debug

Ответ 4

Мы обнаружили, что нам пришлось добавить немного кода, чтобы файлы gcda могли скрыться от системы.

Добавление кода - это добавить extern void __gcov_flush(); в начало вашего файла, а затем вызовите __gcov_flush(); непосредственно перед тем, как завершится весь тестовый пакет.

Полное объяснение здесь: http://www.bubblefoundry.com/blog/2013/09/generating-ios-code-coverage-reports/

Ответ 5

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

Мне нужно было убедиться, что я добавил флаги компилятора GCC_GENERATE_TEST_COVERAGE_FILES и GCC_GENERATE_TEST_COVERAGE_FILES в мою целевую аудиторию, чтобы получить покрытие.

//
//  Created by Michael May
//

#import <SenTestingKit/SenTestingKit.h>

@interface ZZZCodeCoverageFixForUnitTests : SenTestCase

@end

@implementation ZZZCodeCoverageFixForUnitTests

// This must run last

extern void __gcov_flush();

-(void)testThatIsntReallyATest
{
    NSLog(@"FLUSHING GCOV FILES");

    __gcov_flush();
}


@end

Изменить или другой подход Джаспера:

Я отключил VATestObserver от другого ответа до этого:

@interface VATestObserver : SenTestLog
@end

@implementation VATestObserver

extern void __gcov_flush(void);

- (void)applicationWillTerminate:(UIApplication*)application
{
   __gcov_flush();
  [super applicationWillTerminate:application];
}

@end

Ответ 6

Ниже приведена дополнительная документация:

https://code.google.com/p/coverstory/wiki/UsingCoverstory

и некоторый исходный код для использования:

https://code.google.com/p/google-toolbox-for-mac/source/browse/#svn%2Ftrunk%2FUnitTesting

Вам нужны GTMCodeCoverageApp.h/.m и GTMCodeCoverageTestsXC.h/.m или GTMCodeCoverageTestsST.h/.m в зависимости от того, используете ли вы XCTest или SenTest.