SlideShare a Scribd company logo
1 of 43
Download to read offline
Unity編
GMO Pepabo, Inc.
HIROTO IMOTO
2015/12/13 Unity Fukuoka 09
テストを書こう
@adarapata
Imoto Hiroto
> GMOペパボ WEBエンジニア
> ロリポップ!開発やってる
> 業務ではruby + php
> 趣味でUnity
> 八耐によくいる
> ハッカソン好き
テスト書いてる?
今日話すこと
> テストコード
> Unity5.3のTest Runner
> Unityでのユニットテスト
今日話さないこと
> Unity Test Tools Asset
> Unity Integration Test
コードの動作確認
どうしてる?
こんなん書いて・・
using UnityEngine;
using System.Collections;
public class Test : MonoBehaviour {
// Use this for initialization
void Start () {
SugoiClass s = new SugoiClass();
Debug.Log(s.Sugoi());
}
}
動いた!OK!
置き場に困るTest.cs
都度改造されるTest.cs
using UnityEngine;
using System.Collections;
public class Test : MonoBehaviour {
// Use this for initialization
void Start () {
YabaiClass s = new YabaiClass();
Debug.Log(s.Yabai());
}
}
ほんとよくある
何をしたかった?
> 書いたコードが正しく動くか確認
> コンポーネントとして当てないと確
認できないので、Test.csを書いた
> 使い捨てコードを書きたいわけでは
ない!
コードが正しく動く
か確認したい
そういうのあります
テストコード
テストコードって?
> コードが正しい挙動か確認するため
のコード
> 技術というより文化
> 各言語に様々なテスティングフレー
ムワークがあったりする
> phpunit, rspec, JUnit etc…
例
using UnityEngine;
using System.Collections;
public class SugoiClass {
public string Sugoi()
{
return "Sugoi!!!!";
}
}
using UnityEngine;
using UnityEditor;
using NUnit.Framework;
public class SugoiClassTest {
[Test]
public void SugoiTest()
{
SugoiClass s = new SugoiClass();
Assert.AreEqual("Sugoi!!!!", s.Sugoi(), "Sugoi!!!!って返ってくる");
}
}
実装したクラス
テストコード
テストの種類(ごく一部)
> 単体テスト(Unit Test)
> 結合テスト(Integration Test)
> ググったらその他諸々出てきた・・
単体テスト
> Unit Testとも言う
> 一つ一つの機能の挙動をテストする
> だいたいメソッド単位でのテスト
> Unity5.3ではこれが書ける
> 粒度が小さいので書きやすい
結合テスト
> Integration Testとも言う
> 複数の機能が関連して動作するか
> マリオがクリボーを踏んだら倒せるか
> Unity5.3にはない
> UnityTestToolsには実装されている
Unityのテスト
> 2014年初頭にUnity公式がAsset
StoreにUnityTestToolsリリース
> Unity5.3にて、上記Assetの一部機
能(Test Runner)が取り込まれる
> NUnitが使われている
https://www.assetstore.unity3d.com/jp/#!/content/13802
TestRunner
> 書いたテストを実行するやつ
> Window->EditorTestsRunner
DEMO
基本の流れ
> Create -> Editor Test C# Script
> [Test]属性をメソッドに付ける
> Assertionを書く
> TestRunnerから実行
> 全部自動でやってくれる!
Assertionいろいろ
> AreEqual(expected, actual)
> expected == actual 値が等しいならパスする
> AreSame(expected, actual)
> Object.Equals(expected,actual) 同一オブジェクトならパスする
> IsTrue(condition)
> condition == true 真であるならパスする
> IsNull(anObject)
> anObject IS null NULLであるならパスする
> IsInstanceOf<T>(actual)
> actual IS T Tクラスであるならパスする
> Greater(arg1, arg2)
> arg1 > arg2 arg1の方がarg2より大きいならパスする
MonoBehaviourのユニットテスト
> Unitテストで書けるがちょっと苦手
> UnitTest内で各種Eventは呼ばれない
(Awake,Start,Update,Collision etc..)
> Undo.AddComponentで任意コンポーネ
ントの追加は可能
> Behaviourに実装したメソッドのテストく
らいなら・・
テストのメリット
> 変更に強い
> 理解のしやすさ
> コードの品質の向上
> 精神の安定
変更に強い
> 既存の改修、変更を行った場合の影響範囲を
どう調べるか
> 規模が大きいほど洗い出すの無理・・
> 変なとこからバグが出る・・
> 挙動が変わったらまずテストが落ちるので範
囲を絞り込める
> 結果的にテストプレイよりは速くなりそう
理解のしやすさ
> そのクラスがどのように使われている
かがテストから判断できる
> テストコード = 1つの使用例
> 他の人(半年後の自分)が理解出来る
> テストコードがドキュメントである
> というのが一つの到達点・・・
コードの品質の向上
> ユニットテストしにくいコードとは
> 複数の要素が絡みまくってできない
> 密結合だったりすることが多い
> もっと良い書き方があるのでは?
> より良い設計への気づき・ヒントになる
> がっつり改修してもテストで動作を担保できる
精神の安定
> コードが正しく動くということが担
保されている安心感
> バグの存在にかなり気付きやすくな
る
> リファクタリング、新規コーディン
グへの抵抗を減らせる
テストのデメリット
> コーディングの作業量は増える
> もちろんコードが増えればテストも増える
> 最初は頑張ったけど〆切が近づくにつれてテストが
なくなるはよくある
> テストの記法の学習コスト
> Assertion、Mock、etc..
> ここに時間かけ続けてしまうと本末転倒になりがち
ちゃんとテストコード書いたら
人力テストはもうしなくていい?
それは無理
どこまでテストを書ける?
> 2014のUniteJapanでUnityTestToolsの
作者がその辺の話をしている
> http://japan.unity3d.com/unite/unite2014/files/
DAY2-1700-room1-Tomek.pdf
> https://vimeo.com/98119345
> 比率的には Unit >> Integration >>>>>>>> UI
> 見た目部分はまだまだ人の力が必要
> VIEWに依存しない低い部分はモリモリ書くべき(私見)
> 裏を返せばVIEWに依存するコードを書くと辛くなる
テスト駆動開発(TDD)
> 実際のコードより先にテストコードを
書く開発手法
> 失敗するテストを書く
> 上記のテストを通る最小限のコードを書く
> 最適化を行う
> 不要な処理を入れずにシンプルに書ける
テストを書き始めて・・・・
> 考える時間が増えた
> 「どんな機能が必要か」を考えた上でテス
トに起こすのでひたすら考える
> テスト通った瞬間が気持ちいい
> より設計に気を配れる。リファクタが楽
> 変なコード書いたらテスト落ちるし
まとめ
結局Unityでテスト書いたほうがいいの?
> 書いて損はない
> 現状だと痒いところに手が届かない感じ
> Monobehaviourのテストなど
> Unityならではの不具合もあったりする
> NUnit自体はC#であれば使えるので無駄にはならない
> IntegrationTestなど今後のアップデートには期待出
来る
> テスト文化自体は大事だから根付かせていくべき
まずは始めてみよう!
おまけ
> TestRunnerで実行した場合のstaticな値
はリセットされない。
> 例えばゲームのスコア(static)加算のテストとか書
いたら、テストのたびにスコアが増え続ける
> エディタからゲームを再生するタイミングで初期化
される
> そのテストを書かないか、テストコードの
最後に自前でリセットする処理を書こう
おまけ
> テスト内でインスタンスを普通に生成すると
テスト後にシーンに残り続ける
> シーン再生時みたいに状態を保持しているわけではな
いため。
> 生成する際はUndo.RegisterCreatedObjectUndo
メソッドを使おう
> http://docs.unity3d.com/ja/current/
ScriptReference/
Undo.RegisterCreatedObjectUndo.html

More Related Content

What's hot

【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜
【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜
【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜
モノビット エンジン
 
ゲームエンジンとMVC
ゲームエンジンとMVCゲームエンジンとMVC
ゲームエンジンとMVC
AimingStudy
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
 
日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについて
kumake
 

What's hot (20)

「宴」実装時に得られたUnityプログラムノウハウ
「宴」実装時に得られたUnityプログラムノウハウ「宴」実装時に得られたUnityプログラムノウハウ
「宴」実装時に得られたUnityプログラムノウハウ
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
 
Unityでオニオンアーキテクチャ
UnityでオニオンアーキテクチャUnityでオニオンアーキテクチャ
Unityでオニオンアーキテクチャ
 
Unityと.NET
Unityと.NETUnityと.NET
Unityと.NET
 
Unityでパフォーマンスの良いUIを作る為のTips
Unityでパフォーマンスの良いUIを作る為のTipsUnityでパフォーマンスの良いUIを作る為のTips
Unityでパフォーマンスの良いUIを作る為のTips
 
【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜
【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜
【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜
 
ゲームエンジンとMVC
ゲームエンジンとMVCゲームエンジンとMVC
ゲームエンジンとMVC
 
ドキュメントを作りたくなってしまう魔法のツールSphinx
ドキュメントを作りたくなってしまう魔法のツールSphinxドキュメントを作りたくなってしまう魔法のツールSphinx
ドキュメントを作りたくなってしまう魔法のツールSphinx
 
Deep Dive async/await in Unity with UniTask(UniRx.Async)
Deep Dive async/await in Unity with UniTask(UniRx.Async)Deep Dive async/await in Unity with UniTask(UniRx.Async)
Deep Dive async/await in Unity with UniTask(UniRx.Async)
 
UnityのクラッシュをBacktraceでデバッグしよう!
UnityのクラッシュをBacktraceでデバッグしよう!UnityのクラッシュをBacktraceでデバッグしよう!
UnityのクラッシュをBacktraceでデバッグしよう!
 
大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化
 
UniTask入門
UniTask入門UniTask入門
UniTask入門
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
 
【Unity道場スペシャル 2017博多】TextMesh Pro を使いこなす
【Unity道場スペシャル 2017博多】TextMesh Pro を使いこなす【Unity道場スペシャル 2017博多】TextMesh Pro を使いこなす
【Unity道場スペシャル 2017博多】TextMesh Pro を使いこなす
 
日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについて
 
データ基盤グループを支えるチームビルディング
データ基盤グループを支えるチームビルディングデータ基盤グループを支えるチームビルディング
データ基盤グループを支えるチームビルディング
 
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
 
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
 
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
 

Viewers also liked

知って得するC# LINQ to Objects編
知って得するC# LINQ to Objects編知って得するC# LINQ to Objects編
知って得するC# LINQ to Objects編
Shota Baba
 
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
Yoshifumi Kawai
 

Viewers also liked (9)

RuntimeUnitTestToolkit for Unity
RuntimeUnitTestToolkit for UnityRuntimeUnitTestToolkit for Unity
RuntimeUnitTestToolkit for Unity
 
NextGen Server/Client Architecture - gRPC + Unity + C#
NextGen Server/Client Architecture - gRPC + Unity + C#NextGen Server/Client Architecture - gRPC + Unity + C#
NextGen Server/Client Architecture - gRPC + Unity + C#
 
知って得するC# LINQ to Objects編
知って得するC# LINQ to Objects編知って得するC# LINQ to Objects編
知って得するC# LINQ to Objects編
 
ゲームジャムに使える! いろんな素材サイトとライセンスに関するご注意
ゲームジャムに使える! いろんな素材サイトとライセンスに関するご注意ゲームジャムに使える! いろんな素材サイトとライセンスに関するご注意
ゲームジャムに使える! いろんな素材サイトとライセンスに関するご注意
 
Test Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるかTest Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるか
 
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
 
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
 
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
 
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
 

Similar to テストを書こう、Unity編

ユニットテスト_2日目
ユニットテスト_2日目ユニットテスト_2日目
ユニットテスト_2日目
Yoshiki Shibukawa
 
Windowsにpythonをインストールしてみよう
WindowsにpythonをインストールしてみようWindowsにpythonをインストールしてみよう
Windowsにpythonをインストールしてみよう
Kenji NAKAGAKI
 
Eclipse を使った java 開発 111126 杉浦
Eclipse を使った java 開発 111126 杉浦Eclipse を使った java 開発 111126 杉浦
Eclipse を使った java 開発 111126 杉浦
urasandesu
 
Test Plugins
Test PluginsTest Plugins
Test Plugins
ykhr
 
griffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jgguggriffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jggug
kimukou_26 Kimukou
 
Mojolicious::Liteを使ってみよう
Mojolicious::Liteを使ってみようMojolicious::Liteを使ってみよう
Mojolicious::Liteを使ってみよう
charsbar
 

Similar to テストを書こう、Unity編 (20)

Jenkins+Play!で気軽にCI
Jenkins+Play!で気軽にCIJenkins+Play!で気軽にCI
Jenkins+Play!で気軽にCI
 
そうだプラグイン作ろう =Unityの巻=
そうだプラグイン作ろう =Unityの巻=そうだプラグイン作ろう =Unityの巻=
そうだプラグイン作ろう =Unityの巻=
 
UniRx - Reactive Extensions for Unity
UniRx - Reactive Extensions for UnityUniRx - Reactive Extensions for Unity
UniRx - Reactive Extensions for Unity
 
こんなに違う!Unityアプリケーション講座
こんなに違う!Unityアプリケーション講座こんなに違う!Unityアプリケーション講座
こんなに違う!Unityアプリケーション講座
 
ユニットテスト_2日目
ユニットテスト_2日目ユニットテスト_2日目
ユニットテスト_2日目
 
GroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackGroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hack
 
Gws in fukuoka
Gws in fukuokaGws in fukuoka
Gws in fukuoka
 
(たぶん)やさしいUnity
(たぶん)やさしいUnity(たぶん)やさしいUnity
(たぶん)やさしいUnity
 
Windowsにpythonをインストールしてみよう
WindowsにpythonをインストールしてみようWindowsにpythonをインストールしてみよう
Windowsにpythonをインストールしてみよう
 
2010/8/27 TechEd2010 ライトニングトーク
2010/8/27 TechEd2010 ライトニングトーク2010/8/27 TechEd2010 ライトニングトーク
2010/8/27 TechEd2010 ライトニングトーク
 
Eclipse を使った java 開発 111126 杉浦
Eclipse を使った java 開発 111126 杉浦Eclipse を使った java 開発 111126 杉浦
Eclipse を使った java 開発 111126 杉浦
 
FlexUnit4とMockitoFlex
FlexUnit4とMockitoFlexFlexUnit4とMockitoFlex
FlexUnit4とMockitoFlex
 
Test Plugins
Test PluginsTest Plugins
Test Plugins
 
Unityの夕べ in Fukuoka
Unityの夕べ in FukuokaUnityの夕べ in Fukuoka
Unityの夕べ in Fukuoka
 
griffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jgguggriffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jggug
 
Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中
 
GUI Test is (not) necessary
GUI Test is (not) necessaryGUI Test is (not) necessary
GUI Test is (not) necessary
 
第4回勉強会 単体テストのすすめ
第4回勉強会 単体テストのすすめ第4回勉強会 単体テストのすすめ
第4回勉強会 単体テストのすすめ
 
はこだてIKA 第4回勉強会 単体テスト
はこだてIKA 第4回勉強会 単体テストはこだてIKA 第4回勉強会 単体テスト
はこだてIKA 第4回勉強会 単体テスト
 
Mojolicious::Liteを使ってみよう
Mojolicious::Liteを使ってみようMojolicious::Liteを使ってみよう
Mojolicious::Liteを使ってみよう
 

Recently uploaded

Recently uploaded (7)

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 

テストを書こう、Unity編