web-dev-qa-db-ja.com

コードカバレッジの結果は、Xcode7の実際のカバレッジに対して正確ではありません

コードカバレッジデータXcode7 Beta 2が有効になっているアプリケーションでテストケースを実行していますが、すべてのテストケースが正常に実行されている間、取得できるファイルカバレッジデータはごくわずかです。

一部のファイルは、単体テストケースごとにすべてのコードをカバーしていますが、それでも3%のコードカバレッジを示しています。

例えば:

enter image description here これはコードカバレッジの結果です。右側に表示されているように、テスト中にこれらのコード行が何回呼び出されたかについての情報があります。この場合-0。

だが...

enter image description here これは、この関数が実際に呼び出されたことを確認できるテストの場所です。何回?ああ...少なくとも一度は。この番号は、右側の情報によって提供されます。

したがって、上記のコードは呼び出されたものとしてマークする必要があり、グレー表示しないでください:-)

誰かがこれを説明できますか?なぜこれが起こるのですか?

20
Sudhir Kumar

XCTestカバレッジが何をしていないかを知ったと思いますが、それは理にかなっています。

私のセットアップ:

class1をtarget1にコンパイル

class2はtarget1とtarget2にコンパイルされます

テスト設定:

import XCTest
@testable import target1

class MyTests: XCTestCase {
    func testSomething() {
        someMethodFromClass1()
        someMethodFromClass2()
    }
}

私が見つけたのは、class1(target1にコンパイルされた)はテストカバレッジを示し、class2(target1とtarget2にコンパイルされた)はテストカバレッジを示さないということです。

したがって、このメソッドがテストされていないターゲットが少なくとも1つ存在する場合、テストされたメソッドは0のカバレッジを示しているように見えます。

そして、これは非常に理にかなっています。なぜなら、ターゲットでメソッドをテストしても、別のターゲットでのメソッドの動作については何も言えないからです。

Appleは、すべてのターゲットをテストすることを望んでいます。

更新この理論を裏付けるもう1つのヒント:

レポートナビゲーターに移動します

report navigator

カバレッジをクリックします。

複数のターゲットがある場合は、ファイルがターゲットごとにグループ化されているのがわかります。

また、2つのターゲットに1つのファイルがある場合、ファイルは2回表示されます。

両方のターゲットに1つのファイルがある場合、この1つのファイルのコードカバレッジが両方のターゲットに表示されます。そして(少なくとも私のプロジェクトでは)1つのファイルのターゲットごとに異なる青い線があります。

ターゲット1のカバレッジ:

target 1

ターゲット2で実行された同じテストの同じプロジェクトの同じファイルのカバレッジ。

target 2

ソースエディタでテストカバレッジを見ると、Appleは、表示するカバレッジを決定する必要があります。カバレッジが最も低いターゲットを表示するのが最適だと思いますAppleはソースエディタで実行できます。

特別な場合の簡単な修正:

2番目のターゲットがテストターゲットのみの場合:テストターゲットにコンパイルせず、@testable importを使用します。

他のすべての場合は、各ターゲットをテストする必要があります。

4
Gerd Castan

私はApple開発者フォーラムでこのテーマをチェックし、さまざまな投稿を読んだ後、解決策に出くわしたと思います。

物事が機能するためには、次のことが必要です。

  1. テストターゲットからすべてのアプリケーションソースファイルを削除します
  2. ユニットテストのソースに@testable import <NameOfYourModule>
  3. テストを再構築して再実行する

私はこれを現在のプロジェクトでテストしましたが、結果ははるかに優れています。

元のソリューションレシピは次の場所にあります: http://natashatherobot.com/Swift-2-xcode-7-unit-testing-access/

また、機能は少し生っぽいので、バグが発生する可能性があります。Appleは、期待どおりに機能しない場合にバグレポートを送信することをお勧めします。

いくつかの非常に大規模なプロジェクトのコードカバレッジの結果を個人的に見てきました。現在、サポートはアプリケーションとフレームワークに最適です。それがあなたがテストしているものであるならば、あなたがあなたの特定の状況を調査することができるように https://bugreport.Apple.com でバグレポートを提出することができればそれは最善でしょう。さらに言えば、プロジェクトの種類に関係なく、バグレポートは良いことです。可能であれば、実際にレポートを使用してプロジェクトに参加することをお勧めします。それができない場合は、その設定をできるだけ詳しく説明してください。写真は良いです。

元のスレッド: https://forums.developer.Apple.com/message/9733#97

2
Anton Bronnikov

これは、プロジェクトの.Swiftファイルがデフォルトで両方のターゲットに選択されているために発生します。

ファイルのテストターゲットを手動で選択して削除すると、うまくいきます。

0
Rakesh Yembaram

コードをテストでカバーする方法は複数あることに注意してください。すべての関数をテストすることも、関数内のすべての命令をカバーすることもできますが、可能なすべての実行パスをカバーすることはできません。

または、Xcodeのカバレッジが壊れている可能性がありますが、チェックする予定のカバレッジの種類の詳細を提供しないとわかりません。

0
Dietr1ch