7

特定のシナリオ用に単体テストをセットアップするのに問題がある。これが私が試していることです:

  • Xcode 4.5 で、シンプルな OSX "Command Line Tool"アプリケーション プロジェクト (Foundation) を作成しました。
    Xcodeには、ユニット テストを「コマンド ライン ツール」プロジェクトに自動的に追加するオプションが用意されていないことに注意してください。そこにはありません:-/

  • 私のプロジェクトでは、テストしたい簡単なサンプル クラスを作成しました。例えば「形」。

  • Apple のXcode Unit Testing Guide for Setup Unit-Testing in a Projectの指示に従いました。

    • プロジェクトに単体テスト ターゲットを追加しました。

    • 「テスト」スキームを編集して、新しいターゲットでテストを実行しました。

  • テスト プロジェクトの実装 (.m) ファイルShape.hで、メソッドにインポートとコードを追加しsetUp()て、形状をインスタンス化し、それをインスタンス変数に割り当てました。

その時点で、物事がビルドされるかどうか、およびデフォルトのテストが引き続き実行されるかどうかを確認することにしました。しかし、メニューからProduct...Testを選択すると、次のエラーでビルドが失敗しました。

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_Shape", referenced from:
      objc-class-ref in ExampleTests.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

このエラーの解釈は問題ではありません。単体テストのターゲットが、Shape の実装を含むバイナリにリンクされていないことがわかりました。ただし、私は (まだ) Xcode 単体テストとターゲット構成を理解していません。そう:

コマンド ライン ツールの結果の出力にリンクするテスト ターゲットを取得するには、何をする必要がありますか? 単体テスト ターゲットからコマンドライン実行可能ファイルにリンクできますか? Apple のドキュメントは、通常の OSX アプリケーション ( *.app) と iOS アプリケーションに固有のように見えますが、これはどちらでもありません。

コマンド ライン ツール設定で (最初に) 開発したいビジネス ロジック クラスがあるので、「コマンド ライン ツール」で単体テスト ターゲットを実行するために必要なことを理解したい「プロジェクトの種類。 ありがとうございました!

(psコマンドラインから単体テストを実行することに興味がないことに注意してください–スタックオーバーフローは、その方法について「同様の」質問をすでに提案しています–むしろ、「コマンドラインツール」タイプのプロジェクトで単体テスト実行し、それでもXcode 内から。)

4

3 に答える 3

13

追加のターゲット以外に重大な欠点がないように思われる適切な回避策を決定しました。

一言で言えば、解決策には、静的ライブラリ ターゲットを追加して、Xcode の機能を利用して、そのようなターゲットの周りで単体テスト コードを作成および実行することが含まれます。次に、コマンド ライン ツール ターゲットは静的ライブラリに委譲します。ここで、代替のmain()ような関数が定義され、実際のmain()エントリ ポイントによって呼び出されます。コマンド ライン ツールには重要なコードが含まれていないため、単体テストのターゲットはテストに値するすべてのものにアクセスできます。

手順は次のとおりです。

  • 空の Xcode から、メニューからFile...New Projectを選択します。

  • 表示されるダイアログで、OS X...Application...Command Line Toolを選択します。この例では、名前がSampleCmdであると仮定します。

基本的なコマンド ライン ツール プロジェクトが作成されたら、次のようにします。

  • メニューからFile...New...Targetを選択します。

  • 表示されるダイアログで、OS X...Framework & Library...Cocoa Libraryを選択します。この例では、名前がSampleCmdLogicであると仮定します。

  • タイプStaticを選択すると、コマンド ライン ツールはスタンドアロンの実行可能ファイルのままになります。

  • [単体テストを含める]ボックスがオンになっていることを確認します。

スタティック ライブラリ プロジェクトが作成されたら、次のようにします。

  • main()関数を からmain.mにコピーしSampleCmdLogic.mて、ブロックを置き換え@implementationます。(このファイルはメイン エントリ ポイントのみを保持します。Objective-C クラスなどのために他のファイルを追加できます。)  関数の名前を に変更libMain()します。

  • SampleCmdLogic.h、 new の宣言を追加して、ブロックlibMain()を置き換えます。@interface
    int libMain(int argc, const char * argv[]);

  • コマンド ライン ツールのmain.mで、先頭に を追加し#import "SampleCmdLogic.h"ます。

  • コマンド ライン ツールので、実際の関数main.mの内容全体を次のように変更します。main()
    return libMain(argc, argv);

コードの準備ができましたが、必要なリンク手順があります。

  • のプロジェクト設定で、 Build PhasesSampleCmdの下にあるTarget Dependenciesを展開し、(+) SampleCmdLogic を依存関係として追加します。

  • のプロジェクト設定のSampleCmdBuild Phasesで、 Link Binary With Librariesを展開し、(+) を追加します。libSampleCmdLogic.a

すべての準備が整いました。SampleCmd ターゲットに変更し、メニューからProduct..Runを選択すると、ビルドが成功し、期待どおりに出力が生成されます。SampleCmdLogic ターゲットに変更し、メニューからProduct...Testを選択すると、ビルドが成功し、単体テストが実行されます。報告された 1 つの問題は、Xcode によって挿入された最初のデフォルトの失敗した単体テスト アサーションですSampleCmdLogicTests.m。これは予期されることです。

この時点から、すべてのロジックと対応するテストを SampleCmdLogic ターゲットに追加します。SampleCmd ターゲットは単純なままであり、コマンド ライン ツールのエントリ ポイントのみを提供します。

于 2012-11-12T15:36:02.673 に答える
3

通常、アプリ プロジェクトにテスト ターゲットを追加するには、いくつかの追加手順があります。特に、https://stackoverflow.com/a/12624873/246895で説明したように、バンドル ローダーとテスト ホストの設定です。

しかし、コマンド ライン ツールを使用してそれらを実行し、テストを実行しようとすると、ツールが実行されるだけでした。アプリの場合、アプリを起動し、実行中のアプリにテスト バンドルを挿入して、テストを実行するフェーズを通過します。ただし、これらのフェーズはコマンド ライン ツールには適用されません。

したがって、注入されたテスト バンドルの代わりに、テストを実行する 2 つ目のコマンド ライン ツールが必要になります。次に、実際のツールだけでなく、テスト ツールも対象とするようにクラスを設定します。gh-unitgoogle-toolbox-for-macはどちらもこのモデルに従っているので、試してみます。

于 2012-11-02T17:23:01.283 に答える
1

最も差し迫った問題は、単純にそれShapeが新しいテスト ターゲットに含まれていないように思われます。Shape.mtest ターゲットに追加してみてください:

  1. Project Navigator で Shape.m をクリックします。
  2. [ユーティリティ] ビューを開きます ([表示] -> [ユーティリティ] -> [ユーティリティを表示])。
  3. [ユーティリティ] ビューの [ターゲット メンバーシップ] セクションで、アプリテスト ターゲットの両方がオンになっていることを確認します。

これでセットアップに関する問題が解決したかどうかはわかりませんが、最も差し迫った問題の可能性が高いようです。

于 2012-11-12T07:14:25.567 に答える