Sentestingkit / OcunitからXCTESTに移行する方法
質問
プロジェクトを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への参照に入っていました。フレームワーク。
とにかく、以下のようなものは、ウィザードが私のためにそれらを作ることに失敗したために手動で作るべき変更のリストです。ウィザードがあなたのためにうまく機能するならば、あなたはこれらのことすべてをする必要はないかもしれません。
- 単体テスト対象の「実行スクリプト」ビルドフェーズを削除
-
SenTestCase
からXCTestCase
にあるすべてのテストケースクラスの基本クラスを変更します。
-
<SenTestingKit/SenTestingKit.h>
から<XCTest/XCTest.h>
に変更します。
- テストターゲットのビルド設定で、
octest
からxctest
へのラッパー拡張子を変更します。 -
ST*
からXCT*
(E.STAssertTrue
になる) になるようになる - すべてのアサートマクロの名前を変更する
- 上記の例外:
XCTAssertTrue
は、STAssertEquals
に名前を変更する必要があります(最後に欠けている "Sがありません)。このコンパイラの警告を取得した場合は、これについて忘れたことがわかります.XCTAssertEqual
- 新しいXCTESTアサートマクロは、障害記述として
warning: implicit declaration of function 'XCTAssertEquals' is invalid in C99
を渡すことを許可しません。たとえば、nil
は不可能で、XCTAssertNotNil(anObject, nil)
に変更する必要があります。このコンパイラエラーを取得したときにこの問題があることがわかります.XCTAssertNotNil(anObject)
。 - do の場合、障害記述を渡す必要がある場合、
error: called object type 'NSString *' is not a function or function pointer
クラスメソッドNSString
が実行するのと同じように、新しいXCTESTアサートマクロはフォーマット指定子の定数式を必要とします。このコンパイラエラーが発生したときにこの問題があることがわかります.stringWithFormat:
。いくつかの例:
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に統合する方法を説明します。
。したがって、2番目のステップは、メインターゲットのXcodeスキームを変更して、「テスト」アクションを実行すると、代わりに単体テストターゲットのテストが実行されるようにします。最終的な解決策は、メインターゲットの「実行」または「ビルド」アクションを実行するたびに、ユニットテストが自動的に実行されたXcode 4.xと同じくらい良くありません。残念ながら、それは私が得ることができないようです
他のヒント
編集 - >リファクタ - > XCTEST
に変換OCUnitテストはまだ機能しますが、移動する可能性があります。変更はかなり最小限になるようになります。