14

Xcode 5 と iOS7 でコード カバレッジを生成するにはどうすればよいですか?

アップグレードする前は、コード カバレッジを問題なく取得していました。*.gcda ファイルが生成されていません。

私が使用しているコマンドラインは次のとおりです。

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

AppCode で動作

  • AppCode 経由でテストを実行すると、~/Library/Caches/appCode20/DerivedData に *.gcda ファイルが作成されていることがわかります。. . 継続的インテグレーション ビルドで機能するには、これが必要です。

Xcode IDE から動作

  • Xcode IDE からも動作します。. . カバレッジを生成するコマンドラインはありますか、それとも Xcode のバグですか?
4

6 に答える 6

15

以下は修正ですSenTestKit- このクラスを Tests ターゲットに追加するだけです。同様のことができるはずです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()、アプリ内で呼び出されるようにトリガーします。

于 2013-09-24T09:17:38.253 に答える
2

(これは答えではありませんが回避策です...私はまだより良い解決策に非常に興味があります)

iOS 6.1 シミュレーターを使用する

デプロイ ターゲットとして iOS 6.1 以前をターゲットにしている場合は、6.1 シミュレーターを使用できます。

  • 設定/ダウンロードから iOS6.1 シミュレーターをインストールします
  • 次のコマンドラインを使用します。

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

于 2013-08-23T05:57:55.607 に答える
1

ここからの情報を使用して、私が考えることができる最も侵襲性の低いこのバージョンを作成することができました. 単体テストに追加して、通常どおりテストを実行するだけです。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

編集、または Jasper による別のアプローチ:

VATestObserver を他の回答から削除して、次のようにしました。

@interface VATestObserver : SenTestLog
@end

@implementation VATestObserver

extern void __gcov_flush(void);

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

@end
于 2013-12-18T11:21:55.163 に答える
1

gcda ファイルをシステムからフラッシュするには、少しコードを追加する必要があることがわかりました。

コードの追加とは、ファイルの先頭に追加 し、テスト スイート全体が終了する直前にextern void __gcov_flush();呼び出すことです。__gcov_flush();

完全な説明はこちら: http://www.bubblefoundry.com/blog/2013/09/generating-ios-code-coverage-reports/

于 2013-10-10T15:33:06.350 に答える
0

ここにいくつかのドキュメントがあります:

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

および使用するソースコード:

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

XCTest または SenTest を使用しているかどうかに応じて、GTMCodeCoverageApp.h/.m および GTMCodeCoverageTestsXC.h/.m または GTMCodeCoverageTestsST.h/.m が必要です。

于 2013-12-18T05:03:32.230 に答える
0

更新:新しく受け入れられた回答

場合によっては、カバレッジのフラッシュをアプリ自体から実行する必要があります。この質問のソリューションの概要は、詳細を提供します。

于 2014-01-11T06:19:54.327 に答える