cukunity(キュキュニティー)とは、自動化及びテストのための一つフレームワークである。 目的としては、BDD(振舞駆動開発)を Unity3Dのゲームの開発プロセスにより簡単に引き取ること。
cukunityはBDD(振舞駆動開発) という開発プロセスの意思に触発されて出来たものである。 「cukunity」といった言葉自体が「Cucumber」と「Unity」というかばん語である。 そういう意味では、Cucumber用のヘルパークラスも提供するが cukunityを単体でも使える(操作のシミュレーションなどのため)。
下記にcukunityの基本機能の説明である:
- 実機でUnity3Dのゲームをインストール・アンインストール・実行することが出来るプラットフォームにとらわれないAPIの提供。
- Unity3Dのゲームにタッチ・キーボード入力といったイベントを発生(シミュレーション)させるプラットフォームにとらわれないAPIの提供。
- 既存のUnity3Dのプロジェクトにcukunityプラグインをインポートするための
cukunity
といった実行ファイルのツールの提供。 - Cucumberで使えるデフォルトのヘルパークラスとステップ定義の提供。
- cucunityを使ったデフォルトのrakeタスクの提供。
現状、cukunityの使い方が下記制限によって限られている。
- Android 2.x以降とiOS 5.x以降にしか対応していない(将来的に Desktop/Flash/WebPlayer にも適用出来ると望ましい)。
- XcodeはMacOSXでしか使えないためcukunityによるiOSでのテストもMacOSXでしか出来ない。
- iOSの場合、Unity3DプロジェクトのBuild Settingsにて "Development Build" といった設定が必要。
- Androidの場合、現状MacOSXでしか出来ていないが将来的に(約束ではないが)WindowsもLinuxもサポート可能 。
追加詳細は、プロジェクトの進捗とロードマップ
を参照下さい。
- Ruby 1.9.x以降( RVM などでインストール可能)。
- cukunityをcucumberで使うにはcucumberをインストールする (例
gem install cucumber
)。 - Mac OS X 10.6以降(Snow Leopardで動作確認したが、Lionでも大丈夫だと思う)。
- iOSの場合、iOS SDKを含めて XCode 4.2 以降と mobiledevice をインストール。
- Androidの場合、Android SDK とplatform-toolsパケージをインストール。
まずはRuby 1.9.x以降がインストールしてあることを確認した上で、cukunityを下記のようにインストールする:
gem install cukunity
最新バージョンを使うには、下記の方でインストールする:
git clone git://github.com/imkira/cukunity.git
cd cukunity
rake install
オプション無しで下記のようにcukunityを実行すると、
cukunity
下記の通り、基本使い方の説明画面の確認が出来る(下記は日本語に翻訳したもの)。
Usage: cukunity [オプション] <コマンド>
コマンド:
doctor テスト環境に問題があるかどうかをチェック。
bootstrap <ぱパス> 既存のUnity3Dのプロジェクトにcukunityプラグインをインポート。
features [<パス>] 「path」に存在するcucumber用のフィチャーファイルをインプットにしてcucumberを実行する。
オプション:
-v, --[no-]verbose 詳細出力をオン/オフにするといったスイッチ。
--[no-]android Androidプラットホームを使う/使わないといったスイッチ。
--[no-]ios iOSプロとホームを使う/使わないといったスイッチ。
-h, --help 同ヘルップ画面を表示する。
cukunityをインストールした直後に、 cuckunity doctor
を実行して
テスト環境に問題があるかどうかをチェックしよう!
同コマンドは、iOS及びAndroidでcukunityを使用するための必要なツールが
全てインストールされているかどうかっといったチェックを行う。
--no-ios
もしくは --no-android
を指定すれば、そのプラットホームのチェックを外すことが出来る。
既存のUnity3Dのプロジェクトにcukunityプラグインをインポートするには、 下記コマンドを実行する:
cukunity bootstrap <unity/プロジェクトへの/ベースのパス>
同コマンドは、必要なファイルを Assets/Plugins
にコピーする。
その後に、 CukunityInstance.prefab
といったプレハブをゲームの起動時に最初に読み込まれるシーンに
ドラッグ&ドロップしてください。
「全てのシーンにも追加しないと行けないの?」、「他のシーンをロードしたらどうなるの?」など
は、もう手配済みなので大丈夫!
最後に、Unity3Dのプロジェクトを再ビルドする。 注意:iOSの場合は、 Unity3DプロジェクトのBuild Settingsにて"Development Build" といった設定を有効にしてください!
同コマンドでフィーチャーファイルをインプットにしてcucumberを実行することが出来る。
cukunity features <cucumber用の/features/フォルダーへの/パス>
同コマンドは、Rubyの require 'cukunity/cucumber'
でcukunityをインクルードしてcucumberを実行する。
そして、features
フォルダーにあるフィーチャーファイルをインプットとして cucumber
を実行する。
また、--no-ios
もしくは --no-android
を指定すればそのプラットホームのテストが行われない。
次は、cukunity features
というコマンド(あるいは、Rubyで require 'cukunity/cucumber'
)で
デフォルトで使える機能の一覧である。そのため、予めコピーを撮っておく必要がない。ただ、
デフォルトの動作をカスタマイズしたりするには、コピーを撮っておいて好きに編集することが出来る。
- ゲームをインストールする
- ゲームを起動する
- 現在のシーン情報を取得する
- キーボード入力のイベントを発生させる
- タッチ入力のイベントを発生させる
- 画面に表示されているオブジェクトのセレクター
- Unityのレベルをロードさせる
Cukunityがi18nに対応している。 現状英語がデフォルトですが、日本語でのフィーチャーファイルの記述に対応している。
下記は、倉庫番というゲームをテストするサンプルのフィーチャーの定義ファイルである。
# language: ja
フィーチャ: cukunityが提供するデフォルトのステップ定義のサンプル
Unityのゲームをcukunityでテストするためには
プログラマーとして
Unityのデフォルトのステップ定義を使いたい。
Background:
# Specify fixtures/sokoban.apk (Android) or fixtures/sokoban.app (iOS) as the target game.
Given I install the app "fixtures/sokoban"
# launch it on device
And I launch it
# You probably don't need this, but this will cause an Application.LoadLevel of "demo_title" level.
And I load the "demo_title" level
背景:
# fixtures/sokoban.apk (Android) もしくは fixtures/sokoban.app (iOS) のようにテスト対象となるゲームへのパス(拡張子は不要)を指定するにして端末にインストールさせる。
前提 "fixtures/sokoban"からゲームをインストールしている
# 端末でアプリを起動させる。
かつ ゲームを起動している
# おそらく下記要らないかもしれないが、Application.LoadLevelで"demo_title"というレベルを強制的にロードさせる。
かつ レベル"demo_title"をロードしている
シナリオ: ゲームが起動する
# ゲームが動作していることを確認する。
かつ アプリが動作していること
# "demo_title"というレベルがロードされていることを確認する。
かつ レベル"demo_title"がロードされていること
# "OptionsMenu"というGameObjectが存在しないことを確認する。
かつ "OptionsMenu"が存在していないこと
Scenario: Clear game
When I tap "Play"
And I tap "Up"
# <ommited for simplicity>
# A GameObject called "GameClear" should be visible.
Then I should see "GameClear"
# A label showing it took us "40" steps should be visible.
And I should read "40"
シナリオ: パーフェクトでレベル1をクリアする
# "Play"という画面に表示されているGameObjectをタップさせる。
もし "Play"をタップしたら
# "Up"という画面に表示されているGameObjectをタップさせる。
かつ "Up"をタップしたら
# 省略
# "GameObject"というGameObjectが画面に表示されているかを確認する。
ならば "GameClear"を表示していること
# "40"という内容を持ったラベルが画面に表示されているかを確認する。
かつ "40"と表示していること
シナリオ: Optionsメニューにてプレイヤー名を変更する
# "Options"という画面に表示されているGameObjectをタップさせる。
もし "Options"をタップしたら
# "PlayerName"という画面に表示されているGameObjectをタップさせる。
かつ "PlayerName"をタップしたら
# "Super Player"という文字列をキーボードで入力させる。
かつ "Super Player"と入力したら
# "Super Player"という内容を持ったラベルが画面に表示されているかを確認する。
ならば "Super Player"と表示していること
シナリオ: ゲームをQuitボタンから終了する
# "Quit"という画面に表示されているGameObjectをタップさせる。
もし "Quit"をタップして3秒待ったら
# ゲームが動作していない(いなくなる)ことを確認する。
ならば アプリが動作していないこと
元々のUnityプロジェクトのソースコードは こちらへ。 サンプルのフィーチャーファイルは こちらへ。
同動画は、主にキーボード入力のイベントと タッチ入力のイベントのシミュレーションのデモ動画となる。 フィーチャーの記述ファイルは こちらへ 。
低解像度のデモ動画は、申し訳ない。どうか、基本機能のデモになればと嬉しい。
cukunityのソースコードはまだドキュメンテーションがとても足りない。 近いうちにどうにかしたいが、それが出来るまでに自動生成されたドキュメンテーションを こちら でご参照ください。
現状、cukunityがUnityのコアなクラスの一部(GameObject、Component、Behavior、Camera、 GUIElement、GUIText、GUITexture、Transformなど)とGameObjectとGameObjectの親・子の関係しか対応していない。 そのため、今後のバージョンのロードマップとしてはUnityのデフォルトのクラスに完全に対応する事と EZGUIのようなプラグインのクラスととあるゲームのスペシフィックなクラスのテストも より簡単に対応出来る仕組みを用意する事。
また、実際に開発されてマーケットにリリースされているゲームのテストに役に立つステップ定義を デフォルトのステップ定義として新しいステップ定義を提供したり、現在あるステップ定義を調整したりする必要があると。
- 「不具合を発見!」
- 「こんな凄い機能を作っちゃったのでcukunityに追加したいけど...」
といった時にcukunityプロジェクトをforkしpull requestをお願いします!
cukunityに関する最新情報は @imkira85 をフォーローください。
cukunityはMIT Licenseに準拠する:
www.opensource.org/licenses/MIT
Copyright (c) 2012 Mario Freitas. LICENSE.txtをご確認ください。