2012-01-10 3 views
4

Я создаю проект iPhone 5.0 в Xcode 4.2 и хотел бы найти покрытие кода при выполнении модульных тестов. Я совершенно новичок в среде Xcode, и я выполнил приведенные ниже шаги: here. Я могу правильно изменить настройки сборки для целевой цели и связать файл «libprofile_rt.dylib».Невозможно увидеть покрытие кода в Xcode 4.2

На этом этапе, когда я выполняю тесты (используя Command-U), компилируется код и проходят тесты. Я не сталкиваюсь с описанной проблемой here. Кроме того, я установил CoverStory.

Автор в первой ссылке упоминает "Just run your unit tests and view the code coverage data as usual"; однако я не могу найти .../Objects-normal/i386.

Просто, чтобы все работало, я создал новый проект со следующим классом:

#import "SomeClass.h" 

@implementation SomeClass 
@synthesize someValue; 

-(void)performWork:(BOOL)now withValue:(int)value { 
    if (now) { 
     someValue = value; 
    } 
    else { 
     someValue = value - 1; 
    } 
} 

@end 

и тест класс:

#import "CodeCoverageTests.h" 
#import "SomeClass.h" 

@implementation CodeCoverageTests 

- (void)testExample { 
    SomeClass *obj = [[SomeClass alloc] init]; 
    [obj performWork:YES withValue:3]; 
    STAssertEquals(obj.someValue, 3, @"Value was not 3"); 
} 
@end 

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

я, таким образом, имеют следующие вопросы:

  1. является проблемой корня, что нет никакой поддержки для того, что я пытаюсь сделать с новым компилятором?
  2. Является единственным решением, описанным user chown в ответ на вопрос, который я связал выше?
  3. Смогу ли я использовать CoverStory (или что-то подобное), если я последую за решением из 2)?

Update: После некоторой борьбы, я, наконец, смог найти местоположение "SomeClass.gcno" и файлы "SomeClass.gcda" (спасибо @bjhomer - см this link), и они красиво изобразили, что часть условного оператора performWork была покрыта (и else не был). Для того, чтобы убедиться, я изменил тест следующим образом:

- (void)testExample 
{ 
    SomeClass *obj = [[SomeClass alloc] init]; 
    [obj performWork:NO withValue:3]; 
    STAssertEquals(obj.someValue, 2, @"Value was not 2"); 
} 

После повторного строительства и повторного выполнения модульного тестирования, я перезарядил .gcno и .gcda файлов. CoverStory показал, что покрытие изменилось на else часть метода performWork. Был один небольшой нюанс, однако:

  1. мне нужно изменить параметры сборки на <TargetName> (а не <TargetNameTest>, как показано here) для того, чтобы «SomeClass.gcno» и файлы «SomeClass.gcda» будет создана в каталоге ...<TargetName>.build/Objects-normal/i386/.

Еще раз спасибо за вашу помощь!

ответ

1

Похоже, что ваша главная проблема заключается в том, что вы не можете найти каталог Build/Intermediates/<SchemeName>.build/<ConfigurationName>-<PlatformName>/<TargetName>.build/Objects-normal/<ArchitectureName>. Этот каталог всегда используется при построении, независимо от того, выполняете ли вы покрытие кода.Вот где хранятся все промежуточные файлы, сгенерированные компилятором, а также где окончательные файлы .gcno и .gcda должны существовать, если вы выполняете покрытие кода. Если вы не можете найти этот каталог, проблема не связана с охватом, проблема в том, что вам нужно найти этот каталог.

Чтобы ответить на ваши вопросы.

  1. Охват кода поддерживается в компиляторе LLVM, начиная с Xcode 4.2. Он не будет работать с LLVM-GCC, поэтому убедитесь, что вы не используете это.
  2. Нет, нет необходимости взломать поддержку GCC 4.2 в Xcode 4.2. Сейчас я запускаю покрытие кода с помощью Xcode 4.2, не выполнив ничего из вышеперечисленного.
  3. Вы должны быть в состоянии использовать CoverStory в любом случае; взлома в поддержку GCC 4.2 не изменилась бы там, где будут работать встроенные продукты.
+0

Спасибо, что ответили. Я смог найти _how_, чтобы найти файлы из [этого ответа] (http://stackoverflow.com/a/4282467/800788). – Meesh

Смежные вопросы