質問

プロジェクトをXcode 4.6.3からXcode 5.0.2に移行するプロセスにあります。プロジェクトの単体テストはSentestingKit / Ocunitで開発されました。 Xcode 5でテストを実行しているときに、RunUnitTestsスクリプトから

を伝えるエラーが発生します。

RunnitTestsは時代遅れです。

このノートは、Xcode 5リリースノートでこのノートです:

SentestingKitとOcunitは推奨されません。移行者を使用してXCTESTに移動します。

残念ながら、私はこの不思議な「移住者」についてもっと知ることができませんでした。おそらく私のGoogle-FUはもう一度欠けているので、私の主な質問は次のとおりです。

二次質問は、移行が複雑な事業である場合:Xcode 5を依然としてSentestingKit / Ocunitに基づいている単体テストを実行することが可能ですか?結局これらは単なる推奨されているので、それらはまだ周りで機能的になるべきです。

役に立ちましたか?

解決

Shaggy Frogの答えのおかげで、Xcodeリリースノートに記載されている不思議な「移行者」は、「編集>リファクタ>からXCTESTへの変換」を選択して発売されたウィザードです。私はこのウィザードを2つの部分に私の経験について書くつもりです。最初の部分は主な質問に対する不完全な答えです、2番目の部分は二次質問に答えます。


パート1:OCUnitからXCTEST 実現する必要がある最初のものは、働くための作業のためのものであり、あなたは単位テストターゲットを選択する必要があるということです。メインターゲットが選択されている場合、ウィザードは単に変換するターゲットを一覧表示しません。

これについて見つけたら、私は魔法使いを踏み出すことができましたが、私の場合では最終結果はまだ壮観な失敗でした!ウィザードは、ソースの変更が必要ではなく、XCTESTへの移行に更新されるのに必要な設定のみを構築する必要があると主張しました。最後に、ウィザードが正しく実行することさえ管理されていませんでした。 did SentestingKitフレームワークへの参照を削除しましたが、 not がXCTESTへの参照に入っていました。フレームワーク。

とにかく、以下のようなものは、ウィザードが私のためにそれらを作ることに失敗したために手動で作るべき変更のリストです。ウィザードがあなたのためにうまく機能するならば、あなたはこれらのことすべてをする必要はないかもしれません。

  1. 単体テスト対象の「実行スクリプト」ビルドフェーズを削除
  2. SenTestCaseからXCTestCase
  3. にあるすべてのテストケースクラスの基本クラスを変更します。
  4. <SenTestingKit/SenTestingKit.h>から<XCTest/XCTest.h>
  5. に変更します。
  6. テストターゲットのビルド設定で、octestからxctestへのラッパー拡張子を変更します。
  7. ST*からXCT*(E.STAssertTrueになる)
  8. になるようになる
  9. すべてのアサートマクロの名前を変更する
  10. 上記の例外:XCTAssertTrueは、STAssertEqualsに名前を変更する必要があります(最後に欠けている "Sがありません)。このコンパイラの警告を取得した場合は、これについて忘れたことがわかります.XCTAssertEqual
  11. 新しいXCTESTアサートマクロは、障害記述としてwarning: implicit declaration of function 'XCTAssertEquals' is invalid in C99を渡すことを許可しません。たとえば、nilは不可能で、XCTAssertNotNil(anObject, nil)に変更する必要があります。このコンパイラエラーを取得したときにこの問題があることがわかります.XCTAssertNotNil(anObject)
  12. do の場合、障害記述を渡す必要がある場合、error: called object type 'NSString *' is not a function or function pointerクラスメソッドNSStringが実行するのと同じように、新しいXCTESTアサートマクロはフォーマット指定子の定数式を必要とします。このコンパイラエラーが発生したときにこの問題があることがわかります.stringWithFormat:。いくつかの例:
  13. NSString* formatSpecifier = @"%@";
    NSString* failureDescription = @"foo";
    // These are OK
    XCTAssertNotNil(anObject, @"foo")
    XCTAssertNotNil(anObject, @"%@", failureDescription)
    // These are not OK
    XCTAssertNotNil(anObject, failureDescription);
    XCTAssertNotNil(anObject, formatSpecifier, failureDescription);
    
    .

    最後に、すでに上昇したように、XCTESTフレームワークへの参照を単体テストターゲットに追加する必要があります。 error: expected ')'などのリンカエラーを取得する場合は、これを忘れたことがわかります。

    Xcode 6更新:XCODES 6にリンクする必要はありません。(実際、XCTESTは、もうAvailable Frameworkとしてもリストされていません)。代わりに、ビルド設定CLANG_ENABLE_MODULESをYESに設定します(UIでは、「モジュール(CとObjective-Cの有効化」)。これにより、Undefined symbols for architecture i386: "_OBJC_CLASS_$_XCTestCase", referenced from: fooステートメントが発生すると、clangがXCTESTと自動的にリンクされます。詳細は、「モジュール」のセクションで利用できます。


    パート2:Xcode 5

    でOCUnitテストを実行する方法

    この時点で、私はXCTESTに移行する私の任務が失敗したことに気付かせたリンカエラーを得ました。その理由:XCTESTはSDK 6.1の一部ではありませんが、Base SDK iOS 6.1でプロジェクトを構築しています(これは SDK 6.1をXcode 5に統合する方法を説明します。

    移行を続けることができないので、私のアプリをSentestingkit / Ocunitに基づいて私の単体テストを維持することは、私がiOS 7に私のアプリをアップグレードする時間を見つけるまで私がしなければならなかったものですユニットテストを実行するには:

    1. 単体テスト対象から「スクリプトの実行」ビルドフェーズを削除します。単位テストターゲットが選択されている間に、「テスト」アクション( + u )を介してXcodeを実行するために必要なものすべてです。 >。
    2. これは理想的ではありませんが、単体テストを実行するためだけにターゲットを切り替えたくないためです。その代わりに、メインターゲットが選択されている間は、ユニットテストを実行したいのですが。したがって、2番目のステップは、メインターゲットのXcodeスキームを変更して、「テスト」アクションを実行すると、代わりに単体テストターゲットのテストが実行されるようにします。
    3. 最終的な解決策は、メインターゲットの「実行」または「ビルド」アクションを実行するたびに、ユニットテストが自動的に実行されたXcode 4.xと同じくらい良くありません。残念ながら、それは私が得ることができないようです

これは "Run Script"ビルドフェーズなしで機能するために機能します。

他のヒント

編集 - >リファクタ - > XCTEST

に変換

OCUnitテストはまだ機能しますが、移動する可能性があります。変更はかなり最小限になるようになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top