IOS рдФрд░ OS X рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХрд╡рд░реЗрдЬ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг (xCode 4.4)

рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛


рдпрд╣ рд╡рд┐рд╖рдп рдХреЛрдб рдХрд╡рд░реЗрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдЙрдкрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдИрдУрдПрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдЙрдкрдпреБрдХреНрддрддрд╛ рдкрд░ рд╕рд╡рд╛рд▓ рдирд╣реАрдВ рдЙрдард╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЕрднреА рднреА рдХрд┐рд╕реА рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ)ред

рдкреНрд░реЗрд░рдгрд╛


рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдЬрдм рдкреНрд░реЛрдлрд╛рдЗрд▓ / рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЙрдкрдХрд░рдг рдЖрдИрдбреАрдИ рдореЗрдВ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред XCode рдореЗрдВ рдХреЛрдб рдХрд╡рд░реЗрдЬ рд╡рд╛рд▓рд╛ рдЗрддрд┐рд╣рд╛рд╕ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреНрд▓рд╛рдЙрдбрд▓реЗрд╕ рдирд╣реАрдВ рд╣реИ: xCode 3.x рдФрд░ GCC рдХреЗ рджрд┐рдиреЛрдВ рдореЗрдВ рд╕рдмрдХреБрдЫ рд╕рд░рд▓ рдерд╛ рдФрд░ рдПрдХ рд╕рдордп рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд▓рд┐рдВрдХ рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдлреНрд▓реИрдЧ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред XCode 4.1 рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, LLVM-GCC рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рд░рдг рд╕рдм рдХреБрдЫ рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЧрдпрд╛, рдореБрдЭреЗ рдХреБрдЫ рддрд░рдХреАрдмреЛрдВ (рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ LLVM рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░) рдкрд░ рдЬрд╛рдирд╛ рдкрдбрд╝рд╛ред рдФрд░ 4.3 рдореЗрдВ libprofile_rt рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рджреВрд╕рд░реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛, рдЬрд┐рд╕рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реБрдИрдВред

рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рддреМрд░ рдкрд░ рдпрд╣ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдХрд┐ xCode 4.4 рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХрд╡рд░реЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХрдИ рдорд┐рдирдЯ рд▓рдЧрддреЗ рд╣реИрдВ, рдФрд░ рдЪреВрдВрдХрд┐ рдпрд╣ рд╕рд╕реНрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рди рдХрд░реЗрдВ? рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╕рд┐рджреНрдз рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд╣реИ, рд╕реАрдзреЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдФрд░ 'рдореГрдд' рдХреЛрдб рдХреА рдЦреЛрдЬ рдХрд░рдирд╛, рдЗрд╕рдХреЗ рдмрд╛рдж рдЙрд╕рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рд╕рдлрд╛рдИред

XCode 4.4 рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрдЕрдк


рдЪреЗрдХрдорд╛рд░реНрдХ рдпреВрдирд┐рдЯ рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ (iOS / OS X) рдмрдирд╛рдПрдВред рдЖрдк рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдореЗрд░реА рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдореЗрдВ рджреЛ рдЪрд░рдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
1. рд▓рдХреНрд╖реНрдп% рдкреНрд░реЛрдЬреЗрдХреНрдЯ-рдирд╛рдо% рдЦреЛрд▓реЗрдВ, рдФрд░ рдХреЛрдб рдкреАрдврд╝реА рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЭрдВрдбреЗ рд╕реЗрдЯ рдХрд░реЗрдВ:
рдЯреЗрд╕реНрдЯ рдХрд╡рд░реЗрдЬ рдлрд╝рд╛рдЗрд▓реЗрдВ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ = рд╣рд╛рдБ
рд╕рд╛рдзрди рдХрд╛рд░реНрдпрдХреНрд░рдо рдкреНрд░рд╡рд╛рд╣ = рд╣рд╛рдБ

рдЫрд╡рд┐

2. рдХреЗрд╡рд▓ iOS рдХреЗ рд▓рд┐рдПред рдпрд╣рд╛рдВ рд╡рд░реНрдгрд┐рдд рдХреНрд░реИрд╢ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЛ * .c рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:

#include <stdio.h> FILE* fopen$UNIX2003(const char* filename, const char* mode); size_t fwrite$UNIX2003(const void* ptr, size_t size, size_t nitems, FILE* stream); FILE* fopen$UNIX2003(const char* filename, const char* mode) { return fopen(filename, mode); } size_t fwrite$UNIX2003(const void* ptr, size_t size, size_t nitems, FILE* stream) { return fwrite(ptr, size, nitems, stream); } 

рд╡рд╣ рдкреВрд░рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрдЕрдк рд╣реИред рдЕрдм% рдкреНрд░реЛрдЬреЗрдХреНрдЯрдиреЗрдо% рдЯреЗрд╕реНрдЯ рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ (iOS рдХреЗ рд▓рд┐рдП) / /User/%user%/Library/Developer/Xcode/DerivedData/%project-nameBLABLABABABLA%/Build/Intermediates/%project-name%.build/name/ рдЦреЛрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред "рдбрд┐рдмрдЧ-рдЖрдИрдлрд╝реЛрдирд┐рдореБрд▓реЗрдЯрд░ /% рдкреНрд░реЛрдЬреЗрдХреНрдЯ-рдирд╛рдо% .build / рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕-рд╕рд╛рдорд╛рдиреНрдп / i386" ред рдЗрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ, рд╣рдо * .gcda рдФрд░ * .gcno рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рдХрд╡рд░реЗрдЬ рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИред рдорд╣рддреНрд╡рдкреВрд░реНрдг : рдпрджрд┐ рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдХреЗ рдХрд╡рд░реЗрдЬ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ, рддреЛ рдЖрдкрдХреЛ * .plist рдореЗрдВ UIApplicationExitsOnSuspend = YES рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ * .gcda рдлрд╛рдЗрд▓реЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ "рддреНрд░реБрдЯрд┐" рддрд░реАрдХреЗ рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИрдВред

рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рд╡рд░реНрдЧ рдФрд░ рдХрдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдХреЛрдб рджреЗрддрд╛ рд╣реВрдВ:

 #import "MyCalc.h" @implementation MyCalc - (CGFloat)performOperation:(MyMathOperation)operation withA:(CGFloat)a B:(CGFloat)b { CGFloat result = 0.f; switch (operation) { case MyMathOperationAdd: result = a + b; break; case MyMathOperationSubtract: result = a - b; break; case MyMathOperationDivide: result = a / b; break; case MyMathOperationMultiply: result = a * b; break; default: NSLog(@"Unsupported operation"); break; } return result; } - (CGFloat)negate:(CGFloat)number { //this method works incorrectly return number; } @end 


 - (void)testNegation { CGFloat input = 3; CGFloat expected = -3; CGFloat result = [self.calculator negate:input]; STAssertEquals(result, expected, @"Negation failed. Expected: %f, Actual: %f", expected, result); } - (void)testAddition { CGFloat a = 3; CGFloat b = 4; CGFloat expected = a + b; CGFloat result = [self.calculator performOperation:MyMathOperationAdd withA:a B:b]; STAssertEquals(result, expected, @"Addition failed. Expected: %f, Actual: %f", expected, result); } - (void)testMultiplication { CGFloat a = 14; CGFloat b = 3; CGFloat expected = a * b; CGFloat result = [self.calculator performOperation:MyMathOperationMultiply withA:a B:b]; STAssertEquals(result, expected, @"Addition failed. Expected: %f, Actual: %f", expected, result); } 


рдкрд░рд┐рдгрд╛рдо рд╡рд┐рд╢реНрд▓реЗрд╖рдг


рдорд╛рдирд╡-рдЕрдиреБрдХреВрд▓ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЖрдВрдХрдбрд╝реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

gcov

gcov рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣реИ рдЬреЛ * .gcda рдФрд░ * .gcno рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд╡рд░реЗрдЬ рдЖрдБрдХрдбрд╝реЗ рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИред рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рддрдХ, рдпрд╣ рдХреЗрд╡рд▓ рдЬреАрд╕реАрд╕реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рдерд╛, рдлрд┐рд▓рд╣рд╛рд▓ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрд▓рдПрд▓рд╡реАрдПрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЖрдЙрдЯрдкреБрдЯ рдПрдХ рд╕рд╛рджрд╛ рдкрд╛рда рд░рд┐рдкреЛрд░реНрдЯ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ MyCalc.gcda рдлрд╝рд╛рдЗрд▓реЛрдВ рдкрд░ рдЪрд▓рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ:



рдЖрдЙрдЯрдкреБрдЯ рдкрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд╡рд░реЗрдЬ рдХреЗ рдкреНрд░рддрд┐рд╢рдд рдкрд░ рдЖрдВрдХрдбрд╝реЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдлрд╛рдЗрд▓ MyCalc.m.gcov:

  -: 0:Source:/Users/dlebedev/src/sandbox/Coverage/iOS/iOSCoverage/../../Common/MyCalc.m -: 0:Graph:MyCalc.gcno -: 0:Data:MyCalc.gcda -: 0:Runs:0 -: 0:Programs:0 -: 1:// -: 2:// MyCalc.m -: 3:// iOSCoverage -: 4:// -: 5:// Created by Denis Lebedev on 23.08.12. -: 6:// Copyright (c) 2012 Denis Lebedev. All rights reserved. -: 7:// -: 8: -: 9:#import "MyCalc.h" -: 10: -: 11:@implementation MyCalc -: 12: 2: 13:- (CGFloat)performOperation:(MyMathOperation)operation withA:(CGFloat)a B:(CGFloat)b { 2: 14: CGFloat result = 0.f; -: 15: 2: 16: switch (operation) { -: 17: case MyMathOperationAdd: 1: 18: result = a + b; 1: 19: break; -: 20: case MyMathOperationSubtract: #####: 21: result = a - b; -: 22: #####: 23: break; -: 24: case MyMathOperationDivide: #####: 25: result = a / b; -: 26: #####: 27: break; -: 28: case MyMathOperationMultiply: 1: 29: result = a * b; 1: 30: break; -: 31: default: #####: 32: NSLog(@"Unsupported operation"); #####: 33: break; -: 34: } 2: 35: return result; -: 36:} 1: 37:- (CGFloat)negate:(CGFloat)number { -: 38: //this method works incorrectly 1: 39: return number; -: 40:} -: 41: -: 42:@end 


#####: - рд▓рд╛рдЗрди рдкреВрд░реА рдирд╣реАрдВ рд╣реБрдИред
n: - рд▓рд╛рдЗрди рдХреЛ n рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдЖрд╡рд░рдг

CoverStory gcov рдХреЗ рд▓рд┐рдП рдПрдХ GUI рдРрдб-рдСрди рд╣реИ рдЬреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ Apple рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ HTML рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред



lcov

lcov gcov рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЪрд┐рддреНрд░рдордп рдлреНрд░рдВрдЯ-рдПрдВрдб рд╣реИред рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдЬрдм рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрддреА рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ HTML рдХреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╕рдореВрд╣рд┐рдд рдХрд░рддреА рд╣реИ, рд╕рд╛рде рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрд╡рдЪрд╛рд▓рди рдХреЗ рджреМрд░рд╛рди - рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдЯрд░реНрдорд┐рдирд▓ рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред

Lcov рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:

 # sudo mkdir -p /usr/local/src; cd /usr/local/src # sudo wget http://downloads.sourceforge.net/ltp/lcov-1.6.tar.gz # sudo tar -xzvf lcov-1.6.tar.gz # cd lcov-1.6 

 # sudo vim /usr/local/src/lcov-1.6/bin/install.sh</code> 

34 рд▓рд╛рдЗрди рдкрд░ (-D $ SOURCE $ TARGET рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ), -D рдзреНрд╡рдЬ рдХреЛ рд╣рдЯрд╛ рджреЗрдВред

 # sudo make install 

рд░рд┐рдкреЛрд░реНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, .gcda-files рдХреЗ рд╕рд╛рде рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

 lcov -t 'Code coverage report' -o report.info -c -d . genhtml -o html-report report.info 

HTML- рд░рд┐рдкреЛрд░реНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо:


рд╕реНрд╡рдЪрд╛рд▓рди


рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрд▓рд╕реАрдУрд╡реА рдирд┐рд░рдВрддрд░рддрд╛ рдПрдХреАрдХрд░рдг рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдХрд╛рджрдорд┐рдХ рд╣реЛрдЧрд╛ рдФрд░ рдХрд╖реНрдЯрдкреНрд░рдж рдЦрд╛рдорд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде (рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдХреЛрдХреЛрдкреЛрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб (рдпрд╣ iOS рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рднреА рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ):
 #!/bin/sh TARGET_NAME="iOSCoverage" TEST_TARGET_NAME="iOSCoverageTests" BUILD_CONFIG="Debug" SDK_VERSION="iphonesimulator5.1" rm -rf build rm -rf html-report echo Building and running tests xcodebuild -target $TEST_TARGET_NAME OBJECT_FILE_DIR_normal=/build/ TEST_AFTER_BUILD=YES -sdk iphonesimulator5.1 -configuration $BUILD_CONFIG -xcconfig settings.xcconfig echo Copying files mkdir build/gcda cp build/$TARGET_NAME.build/$BUILD_CONFIG-iphonesimulator/$TARGET_NAME.build/Objects-normal/i386/*.gcda build/gcda/ cp build/$TARGET_NAME.build/$BUILD_CONFIG-iphonesimulator/$TARGET_NAME.build/Objects-normal/i386/*.gcno build/gcda/ echo Generating report cd build/gcda lcov -t 'Code coverage report' -o report.info -c -d . cd .. cd .. genhtml -o html-report build/gcda/report.info 

Settings.xcconfig рдХреА рд╕рд╛рдордЧреНрд░реА (рдЖрдк рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЭрдВрдбреЗ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ):
 GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES GCC_GENERATE_TEST_COVERAGE_FILES = YES 

рд╣рдордиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдЖрдЧреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ред Xcconfig рдлрд╝рд╛рдЗрд▓ рд░рдЦреА (рдкрд╣рд▓реЗ рд╣рдо рд▓рдХреНрд╖реНрдп рдФрд░ рдПрд╕рдбреАрдХреЗ рдирд╛рдо рдЪрд░ рдХреЛ рдЖрд╡рд╢реНрдпрдХ рдХреЗ рд╕рд╛рде рдмрджрд▓рддреЗ рд╣реИрдВ), рдЪрд▓рд╛рдПрдВ ... рдФрд░ рд╣рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред рдЪреВрдВрдХрд┐ рд╢реБрд░реВ рдореЗрдВ iPhone рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдХрд╖реНрдЯрдкреНрд░рдж рдЧрд▓рддрдлрд╣рдореА рдХреЛ рдХреИрд╕реЗ рдареАрдХ рдХрд░реЗрдВ, рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдпрд╣рд╛рдБ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдПрдВ рдФрд░ рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде HTML-рд░рд┐рдкреЛрд░реНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

UPD: рдЬреЗрдирдХрд┐рдВрд╕ рдХреЗ рд╕рд╛рде рдШрдирд┐рд╖реНрда рдПрдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк gcovr + Cobertura Plugin рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЯрд┐рдк рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдореЛрдмреЛрд░ ред

Source: https://habr.com/ru/post/In150438/


All Articles