Xcode 4.5の初心者向けOCUnit

バグを修正するのにアプリケーションを開発するよりも時間がかかることに疲れたので、ソリューションを探してTDD-テスト駆動開発に来ました。



この記事では、iOS用のアプリケーションを開発するときに、単体テストを使用してXcode 4.5で最初の手順を実行する方法について説明します。



この記事は初心者を対象としており、開発バイソン向けの情報は含まれていません。





はじめに



最初から始めて、新しいプロジェクトを作成し、「Include Unit Tests」チェックボックスをオンにして、Ocuという名前を付けます。

ファイル->新規->プロジェクト->シングルビューアプリケーション

ステップ1

私はARCを使用しない方が好きです。なぜなら、新しい機能が思い浮かぶまでは横たわるというルールを固守しているからです。 はい、手動のメモリ管理はそれほど難しいことではなく、これを少し練習すれば役に立ちます。



SenTestingKitフレームワークを含むプロジェクトを作成しました。このフレームワークが役立ちます。

プロジェクトには、OcuとOcuTestsの2つのグループがあり、最初のグループにはアプリケーションのコードが含まれ、2番目のユニットテストが含まれています。

ステップ2



「OcuTests.m」ファイルを開き、「testExample」メソッドを見つけます。

OcuTests.m

#import "OcuTests.h" @implementation OcuTests - (void)setUp { [super setUp]; // Set-up code here. } - (void)tearDown { // Tear-down code here. [super tearDown]; } - (void)testExample { STFail(@"Unit tests are not implemented yet in OcuTests"); } @end
      
      





setUpは、テストの開始前に実行されるメソッドです。ここでは、テストに必要なすべてのオブジェクトを初期化できます。

tearDownは、テストの終了後に実行されるメソッドです。ここでは、使用したすべてのオブジェクトを破棄できます。

testExampleは、実行する最初のテストです。これには、エラーメッセージを表示し、まだ単一のテストユニットを作成していないことを示す単純なマクロが含まれています。



一般に、メソッド名がtestで始まり、それがvoidを返す場合、SenTestingKitはそれをテストとして自動的に認識して実行します。



テストを実行し(「cmd + U」を押すか、「実行」ボタンをクリックして保持し、ドロップダウンリストから「テスト」を選択します)、デバッガーが書き込む内容を確認します。

 Test Suite 'OcuTests' started at 2012-11-22 22:27:01 +0000. Test Case '-[OcuTests testExample]' started. /Ocu/OcuTests/OcuTests.m:29: error: -[OcuTests testExample] : Unit tests are not implemented yet in OcuTests Test Case '-[OcuTests testExample]' failed (0.000 seconds). Test Suite 'OcuTests' finished at 2012-11-22 22:27:01 +0000. Executed 1 test, with 1 failure (0 unexpected) in 0.000 (0.000) seconds
      
      





デバッガーは、1つのテストが完了し、テストが失敗したことを書き込み、マクロに記述した説明を提供しました。



これで、テストの記述場所、実行方法、実行結果の確認場所がわかりました。 最も簡単なテストの作成を始めましょう。



例1-検証を追加する



この例では、2つの変数を作成し、それらの追加の結果を確認するだけです。



追加する2つの変数と、テストが含まれるメソッドを定義します。

OcuTests.h

 #import <SenTestingKit/SenTestingKit.h> @interface OcuTests : SenTestCase { float foo; float bar; } - (void) testMathAdd; @end
      
      







setUpメソッドで変数を初期化して値を割り当て、testMathAddメソッドで加算結果を確認します。

OcuTests.m

 - (void)setUp { [super setUp]; foo = 2.0; bar = 5.0; } - (void)tearDown { // Tear-down code here. [super tearDown]; } - (void) testMathAdd { STAssertTrue (foo + bar == 6.0, @"%f + %f should be 7.0", foo, bar); }
      
      







テスト「cmd + U」を実行すると、コメント付きのエラーメッセージが表示されます。

 Test Suite 'OcuTests' started at 2012-11-23 12:26:14 +0000 Test Case '-[OcuTests testMathAdd]' started. /Ocu/OcuTests/OcuTests.m:30: error: -[OcuTests testMathAdd] : "foo + bar == 6.0" should be true. 2.000000 + 5.000000 should be 7.0 Test Case '-[OcuTests testMathAdd]' failed (0.000 seconds). Test Suite 'OcuTests' finished at 2012-11-23 12:20:42 +0000. Executed 1 test, with 1 failure (0 unexpected) in 0.000 (0.000) seconds
      
      







コメントは、追加の結果が予想されたものと異なることを示しています。エラーを修正します。

OcuTests.m

 - (void) testMathAdd { STAssertTrue (foo + bar == 7.0, @"%f + %f should be 7.0", foo, bar); }
      
      







テストを開始すると、テストに合格したというメッセージが表示されます。

 Test Suite 'OcuTests' started at 2012-11-23 12:26:14 +0000 Test Case '-[OcuTests testMathAdd]' started. Test Case '-[OcuTests testMathAdd]' passed (0.000 seconds). Test Suite 'OcuTests' finished at 2012-11-23 12:26:14 +0000. Executed 1 test, with 0 failures (0 unexpected) in 0.000 (0.000) seconds
      
      







例2-オブジェクトプロパティ値の計算



この例では、オブジェクトを作成し、そのプロパティに値を割り当て、別のプロパティが正しく作成されているかどうかを確認します。



プロジェクトに新しいクラスを追加します-「Objective-Cクラス」テンプレートを選択し、「NSObjectのサブクラス」を選択し、保存時に「Triangle」という名前を入力して、「Targets OcuTests」ボックスをチェックします。 その結果、OcuTestsグループでは、2つの新しいファイル「Triangle.h」と「Triangle.m」を取得します。

それらに必要なメソッドを作成します。



Triangle.h

 #import <Foundation/Foundation.h> @interface Triangle : NSObject { float cathetus1; float cathetus2; } - (id)initWithCathetus1:(float)cat1 andCathetus2:(float)cat2; - (float)getHypotenuse; @end
      
      







Triangle.m

 #import "Triangle.h" @implementation Triangle - (id)initWithCathetus1:(float)cat1 andCathetus2:(float)cat2 { cathetus1 = cat1; cathetus2 = cat2; return self; } - (float)getHypotenuse { float hypotenuse = hypotf(cathetus1, cathetus2); return hypotenuse; } @end
      
      







それに応じて、テストに変更を加えます。

OcuTests.h

 #import <SenTestingKit/SenTestingKit.h> @interface OcuTests : SenTestCase - (void)testTriangleHypotenuse; @end
      
      







OcuTests.m

 #import "OcuTests.h" #import "Triangle.h" //   ,    @implementation OcuTests - (void)setUp { [super setUp]; } - (void)tearDown { [super tearDown]; } - (void)testTriangleHypotenuse { float cat1 = 3.0; float cat2 = 4.0; Triangle *tri = [[Triangle alloc] initWithCathetus1:cat1 andCathetus2:cat2]; STAssertTrue([tri getHypotenuse]==5.0, @"Hypotenuse should be 5.0 with catheti: %f, %f", cat1, cat2); [tri release]; }
      
      







テストを実行し、合格したテストに関するメッセージを取得します。

 Test Suite 'OcuTests' started at 2012-11-23 14:25:39 +0000 Test Case '-[OcuTests testTriangleHypotenuse]' started. Test Case '-[OcuTests testTriangleHypotenuse]' passed (0.000 seconds). Test Suite 'OcuTests' finished at 2012-11-23 14:25:39 +0000. Executed 1 test, with 0 failures (0 unexpected) in 0.000 (0.000) seconds
      
      







PS:

次の記事を読むことに興味があるなら、あなたが見たいテストの例を書いてください。



All Articles