*

Xcode6-Beta2でSwiftのユニットテスト(Unit Test)をXCTestフレームワークで試してみる。

公開日: : 最終更新日:2014/10/21 Swift , ,


スポンサードリンク



タイトルの通りですが、Xcode6-Beta2でSwiftのユニットテスト(XCTestフレームワーク)が書けるそうなので
試してみたいと思います。

Quickを試してみようと思ったのですが

「iOS Developer LIbrary – Pre-Release」の「Testing with Xcode」に以下の記述があり

The test class is implemented in Objective-C in this example, but can also be implemented in Swift.

Note: The implementation examples in this text are all written in Objective-C for consistency.
Swift is fully compatible with using XCTest and implementating your test methods. All Swift and Objective-C cross-language implementation capabilities can be used as well.

じゃあとりあえず先に「XCTestフレームワーク」を試そうとの短絡的な思考の結果です。
Quickはビヘイビア駆動開発(BDD)指向のテストフレームワークだそうで、RSpecやJasmineのテストの記載方法と似ていると感じます。

BDDできるって魅力的ですよね。でもとりあえず「XCTestフレームワーク」です。

「XCTestフレームワーク」の詳細につきましては、
「Xcode5でUnitTest(XCTestフレームワーク)を利用してみる。」をご覧ください。

検証用のプロジェクトの作成

プロジェクトの作成

検証を行うためのプロジェクトを作成します。

以下の内容で新規プロジェクトを作成してください。それ以外はデフォルトのままでお願いします。
template for your project:「Empty Application」
Poduct Name:SwiftXCTestSample
Language:Swift

生成されたテストの内容確認

Xcode5と同様にプロジェクト作成時に
$(SRCROOT)/SwiftXCTestSampleTestsにSwiftXCTestSampleTests.swiftが作成されます。

SwiftXCTestSampleTests.swift

Xcode5より進化してますね、
「functional test case」と「performance test case」のひな形が生成されています。
機能要件だけでなく、パフォーマンスといった非機能要件もフレームワークで考慮できてるんですね。
いきなり楽しくなってきました。

それ以外にこのソースから分かることは

  • テストクラスはXCTestCaseを継承して作成する。
  • setUp、tearDownメソッドは基底クラスのメソッドをオーバーライドして実装する。
  • 各テストメソッドはtestから始まる名前とする。

があります。JUnit3系に非常に似ていますね、Javaのアノテーションって言語仕様として魅力的ですよね・・・

Swiftの話に戻りまして、あたりまえですが、全てSwiftで書かれています。
「All Swift and Objective-C cross-language implementation capabilities can be used as well.」
ですもんね、またまた楽しみになってきました。

SwiftでXCTestフレームワークのテストを実装

簡単なアサーションメソッドから試して行きたいと思います。

XCTAssert

testXCTAssertメソッドでXCTAssertをコード補完で選んで確定しました。
結果は以下のようになりました。

ちゃんとSwiftでもこのあたりのメソッドのコード補完はできるんですね。
しかしいきなり@auto_closureですか・・・
「Swift Programming Series 第1巻」
の497ページに説明があります。

“An autoclosure function captures an implicit closure over the specified expression, instead of the expression itself. ”

@auto_clojure属性を持つ引数として渡された式は、普通の実行式とし即座に実行されるわけではなくクロージャとして保持されます。

以下の例も「Swift Programming Series 第1巻」の497ページの例です。

@auto_closureは引数は指定できない、戻り値は1つ指定できます。
closureを個別の関数として定義し、その関数をclosure引数とする関数を定義すればclosureの引数も戻り値も自由に設定可能ですので、auto_closureは一回限りしか利用しない処理を想定しているのでしょうか?

closureとauto_closureは別エントリーでまた説明させていただきます。
XCTAssertのコード補完時のテンプレートについても意味をよく考えてみます。
そうしないとテストが・・・

XCTAssertEqual

失敗時のメッセージ無し版

Stringの配列を作成しておき、XCTAssertEqualで要素の数を検証しています。

失敗時のメッセージ有り版

失敗時のメッセージを指定して呼び出すパターンです。期待値を6にしてテストが失敗するようにしています。

テスト失敗時の画面は以下のようになります。
スクリーンショット 2014-07-04 21.56.17

XCTAssertEqualObjects

「Xcode5でUnitTest(XCTestフレームワーク)を利用してみる。」では検証を行うために独自クラスPersonを作成しました。

今回も同じようにPersonクラスを作成しました。

テストメソッドとテストケースも同じようにしてみました。

テストを実行するとXCTAssertNotEqualObjectsは成功、XCTAssertEqualObjectsは失敗しました。
スクリーンショット 2014-07-04 22.25.57

これもXcode5のXCTestフレームワークの動きと同じですね、XCTAssertEqualObjectsの基本動作はオブジェクトの格納アドレスが同じかどうかで判定しています。

基本動作はオブジェクトの格納アドレスで比較、結局は同一オブジェクトかどうかですが、Objective-CのときはisEqualをオーバーライドすることで、任意の値を利用した比較動作に変更できましたので、同じようにisEqualをオーバーライドしてみました。

isEqualでotherPerson is Personとアンドの結果を返却したいのですが、コンパイルエラーが出てできなかったので
単純にnameが同じかをリターンしています。Swwiftの修行が足りませんね、ってなんもやってねー
ちゃんと調べないと・・・

これでtestXCTAssertEqualObjectsは成功しました。

measureBlockを利用したperformance test

パフォーマンステストですが、Xcode5から存在していたのですね・・・

今回はどんな感じの動きになるかを確認するために以下のようなテストにしていみました。

NSThread.sleepForTimeIntervalで1秒止まるだけです。

実行結果は以下のようになりました。処理の実行時間が表示されるんですね。
スクリーンショット 2014-07-05 12.30.08

self.measureBlock()で3秒たったらテスト失敗にするとかがないと「performance test」ではないような・・・

「Xcode6-Beta2でSwiftのユニットテスト(Unit Test)をXCTestフレームワークで試してみる。」は以上です。

 
関連オススメ書籍


スポンサードリンク

Googleアドセンス

Googleアドセンス




関連記事

Swift入門[公式リファレンスのチュートリアルのSteps2の前半]

「Swift」と「Xcode 6」を少しずつさわっていこうと思ってはいるのですが、「Xcode 6

記事を読む

Swift入門(Xcode6のXCTestフレームワークで学ぶ) 第一回「Swiftの概要」 

Swiftの簡単な説明 アップルのiOS(iOS8以降)およびOS Xのためのプログラミング言語。

記事を読む

Xcode6(Swift)のデリゲートとプロトコルの使い方

Xcode(Objective-C)のデリゲートの使い方では利用言語がObjective-Cの時のデ

記事を読む

Xcode6-Beta3でSwiftでBDDを行うためにQuickを導入し動作させる手順

Clone the repository Create a using Quick Pro

記事を読む

Xcode6の正式版がリリースされApp Storeからダウンロードしインストール可能になりました。

ついにSwiftが利用できるXcode6の正式版がリリースされました。 ブラウザからMac App

記事を読む

Xcode6とSwiftでイメージ(画像)やアニメーションを表示する方法

本エントリーでは、Xcode6(言語はSwift)を利用してイメージ(画像)やアニメーションを表示す

記事を読む

Swift入門[公式リファレンスのチュートリアルのSteps2の後半]

「Swift入門」では、Steps2の前半まで説明させていただきました。 本エントリーでは、

記事を読む

Xcode6_Beta5&SwiftでUITableViewでUINibを使ったカスタムセル(UITableViewCell)を利用する方法

前回は、「Xcode5&Objective-CでUITableViewでUINibを使ったカ

記事を読む

Swift(Xcode6-Beta2)でMagicalRecord関連の処理を含んだDAOクラスのユニットテスト(UnitTest:XCTestフレームワーク)を実装する時にハマった事

SwiftでMagicalRecord関連の処理を含んだDAOクラスを作成し、ユニットテスト(XCT

記事を読む

Xcode6(xcode_6_beta_7、Xcode 6 GM seed)のインストール方法

2014年9月22日追記 Xcode6の正式版がリリースされApp Storeからインストール可能

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

動画で英語を学習できるiOSの無料アプリCapTubeをリリースいたしました。

個人では初となるiOSアプリをリリースいたしました。 何度もリジ

no image
Ruby on rails4系でBootstrapを利用するためのtips

MacでRuby on rails4系のBootstrapを利用しよう

no image
Java、Eclipse、JUnit関連のエントリーの移行のお知らせ

Java、Eclipse、JUnit関連のエントリーは http:/

iOS8開発者向けお勧め本紹介[詳細! Swift iPhoneアプリ開発 入門ノート Swift 1.1+Xcode 6.1+iOS 8.1対応]

iOS7開発者向けお勧め本紹介を以前に紹介させていただきまいたが、今回

Swift入門(Xcode6のXCTestフレームワークで学ぶ) 第二回「関数(メソッド)とクロージャーの利用方法」

前回はSwiftの概要をザックリと説明させていただきました。 今

→もっと見る

Optimization WordPress Plugins & Solutions by W3 EDGE
PAGE TOP ↑