Технические вопросы и ответы QA1514

Конфигурирование XCode для покрытия кода

Q: Как я могу сконфигурировать свой проект XCode работать с инструментом покрытия кода ГКОВА?

A: Покрытие кода позволяет Вам идентифицировать, какие части Вашего исходного кода выполнялись во время теста. XCode поддерживает тестирование покрытия кода с GCOV для iOS и приложений OS X. Когда приложение выходит, когда установлено для использования ГКОВА, XCode генерирует .gcno файлы при компиляции приложения и .gcda файлов данных. Следующие шаги показывают Вам, как установить Ваш проект в XCode для генерации этих файлов ГКОВА.

  1. Создайте отдельную названную конфигурацию сборки GCov_Build.

    Для разделения сборки покрытия кода от Отладки и Выпуска сделайте новую конфигурацию сборки названной GCov_Build путем дублирования Отладки. Посмотрите Добавляет Конфигурация сборки для получения дополнительной информации о дублировании конфигурации сборки.

  2. Сконфигурируйте свое рвение с GCOV на уровне проекта.

    Перейдите к области Build Settings Вашего проекта, затем обновите свои настройки для GCov_Build следующим образом:

    • Удостоверьтесь это Compiler for C/C++/Objective-C установлен в версию Apple LLVM Compiler.

    • Удостоверьтесь это Generate Debug Symbols установлен в YES.

    • Набор Generate Test Coverage Files к YES.

    • Набор Instrument Program Flow к YES.

  Настройки Build рисунка 1 требуются для покрытия кода
  1. Скомпилируйте свой проект генерировать .gcno файлы.

    Сначала установите свою схему использовать GCov_Build при создании и запуске приложения как показано на рисунке 2, затем выберите Product> Build для компиляции проекта. Компилятор создаст .gcno файлы в Вашей папке сборки. Используйте организатора Проектов в XCode для навигации к папке производных данных приложения, затем ищите в каталоге Build/Intermediates .gcno файлы.

  Набор рисунка 2 Ваша схема использовать GCov_Build
  1. Запустите свое приложение для генерации .gcda файлов.

    Выберите Product> выполненный для запуска приложения. Как Ваше выполнение приложения, XCode собирает данные о том, какие части Вашего кода используются. Важно дать вводы приложению, которое осуществит код, который Вы хотите протестировать. Когда Ваше приложение выйдет, XCode выпишет данные покрытия к .gcda файлам.

    • Разработчики OS X должны использовать пункт меню Quit своего приложения для завершенного выхода из него.

    • приложения для iOS не выходят. Поэтому разработчики iOS должны временно изменить свое приложение, чтобы вынудить данные покрытия быть выписанными к .gcda файлам. Используйте любой из следующих методов, чтобы сделать так:

      • Установите UIApplicationExitsOnSuspend ключ к YES в Вашем файле Info.plist и посылает Ваше запущенное заявление в фон путем нажатия кнопки «Домой».

      • Добавьте вызов к __ gcov_flush () в Вашем приложении, чтобы вынудить данные покрытия быть выписанными к .gcda файлам. Например, можно хотеть вставить вызов в __ gcov_flush () в applicationDidEnterBackground: как показано в Перечислении 1, чтобы выписать информации о покрытии каждый раз кнопка «Домой» нажимается.



        Перечисление 1  Используя __ gcov_flush (), чтобы вынудить данные покрытия, которые будут выписаны к .gcda файлам

        #import "AppDelegate.h"
        #include <stdio.h>
         
        extern void __gcov_flush();
        @implementation AppDelegate
         
        - (void)applicationDidEnterBackground:(UIApplication *)application
        {
          __gcov_flush();
        }
         
        …..
        @end
  1. Получите .gcda файлы.

    .gcda файлы обычно помещаются в тот же каталог сборки, содержащий Ваши .gcno файлы. Однако, если Ваше приложение поигралось в песочнице, то Вы не можете быть в состоянии записать в этот каталог сборки. Вы можете обходное решение эта проблема при помощи GCOV_PREFIX_STRIP и GCOV_PREFIX переменные окружения для изменения местоположения .gcda файлов. GCOV_PREFIX_STRIP указывает число компонентов контура, которые будут удалены из каталога сборки по умолчанию и GCOV_PREFIX указывает путь для замены в их месте.

    Например, если Ваш каталог сборки расположен в “/Users/Me/Library/Developer/Xcode/DerivedData / <приложение> / сборка”, и Вы хотите записать его в каталог Documents своего приложения, тогда первый запрос фактический путь песочницы Вашего приложения, затем присвоить этот путь к GCOV_PREFIX использование setenv () функционирует следующим образом:

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    setenv("GCOV_PREFIX", [documentsDirectory cStringUsingEncoding:NSUTF8StringEncoding], 1);

    и наконец набор GCOV_PREFIX_STRIP к 7 для разделения полного пути приложения как показано на рисунке 3.

Рисунок 3  , устанавливающий GCOV_PREFIX_STRIP в XCode

После этого .gcda файлы записаны в Вашу тестовую среду приложения, копируют их в тот же каталог, содержащий Ваши .gcno файлы. разработчики iOS должны выполнить шаги, описанные в Копировании Данных Приложения от Контейнера на устройстве на iOS для получения .gcda файлов от их устройств. Разработчики OS X должны перейти к контейнеру песочницы их приложения (~/Library/Containers/<bundle_id>) на их Mac для получения этих файлов.

Рисунок 4  , Просматривающий .gcda файлы на устройстве на iOS
  1. Используйте ГКОВА для просмотра результатов.

    Перейдите к каталогу, содержащему и Ваш .gcno и .gcda файлы в Терминальном приложении, затем выполните gcov инструмент на каждом исходном файле, для которого Вы хотите видеть данные покрытия, как замечено в Перечислении 2.



    Перечисление 2  , Работающее gcov на исходном файле

    $ cd <path/to/directory with .gcda and .gcno files>
    $ls
    AppDelegate.d				MyApplication_dependency_info.dat	main.d
    AppDelegate.dia				ViewController.d			main.dia
    AppDelegate.gcda			ViewController.dia			main.gcda
    AppDelegate.gcno			ViewController.gcda			main.gcno
    AppDelegate.o				ViewController.gcno			main.o
    MyApplication.LinkFileList		ViewController.o
     
    $ xcrun gcov </path/to>/MyApplication/MyApplication/ViewController.m
    File '</path/to>/MyApplication/MyApplication/ViewController.m'
    Lines executed:69.23% of 13
    </path/to>/MyApplication/MyApplication.m:creating 'ViewController.m.gcov'
     
    $ cat ViewController.m.gcov
            -: 0:Source:</path/to>/MyApplication/MyApplication/ViewController.m
            -: 0:Graph:ViewController.gcno
            -: 0:Data:ViewController.gcda
            -: 0:Runs:0
            -: 0:Programs:0
            -: 1:
            -: 2:#import "ViewController.h"
            -: 3:
            -: 4:@interface ViewController ()
            1: 5:@property (strong) NSMutableArray *menuArray;
            -: 6:@end
            -: 7:
        #####: 8:@implementation ViewController
            -: 9:
            -: 10:
            1: 11:- (void)viewDidLoad
            -: 12:{
            1: 13: [super viewDidLoad];
            1: 14: [self loadData];
            1: 15:}
            -: 16:
            1: 17:-(void)loadData
            -: 18:{
            1: 19: NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"Menu" ofType:@"plist"];
            1: 20: self.menuArray = [NSMutableArray arrayWithContentsOfFile:plistPath];
            -: 21:
            1: 22:}
            -: 23:
            -: 24:
        #####: 25:- (void)didReceiveMemoryWarning
            -: 26:{
        #####: 27: [super didReceiveMemoryWarning];
            -: 28: // Dispose of any resources that can be recreated.
        #####: 29:}
            -: 30:
            -: 31:@end


История версии документа


ДатаПримечания
12.03.2014

Обновленный для Xcode 5. Был ранее назван как «Используя ГКОВА от XCode».

23.02.2007

Новый документ, иллюстрирующий, как установить XCode для покрытия кода.