Slide 1

Slide 1 text

少人数の SDK 開発を支えるテストの話
 じぬ@gotanda.unity#13


Slide 2

Slide 2 text

だれ?
 地主龍一( ) ● じぬ ● 部(新規開発部署) ● 部キャプテン(昨日から) 最近 ● キングダムハーツ ● オクトパストラベラー ●

Slide 3

Slide 3 text

アジェンダ
 ● 前振り( と開発体制) ● 完成品のテスト ● エディタ拡張のテスト ● 表示結果のテスト

Slide 4

Slide 4 text

位置情報と 3D リアルマップによる
 AR アプリ開発プラットフォーム

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

ベータ版ってことは...
 ● フィードバックを受けて改善 ● 新機能の開発 ● コアバリューのさらなる強化

Slide 7

Slide 7 text

なぜお前は
 テストをしてるのか


Slide 8

Slide 8 text

なぜテス
 うちのチーム ● スピード開発を重視 ● 元々人数が少ない(少数精鋭) ○ エンジニア: 人 ○ : 人 エンジニアが する ⇒ バグが出るとクリティカルに開発工数が減る

Slide 9

Slide 9 text

テストを書く指針
 テスト対象 ● テストに時間がかかる機能 ● テストがめんどくさい機能 ● テストを見落としがちな機能 ● 前科がある機能 こだわり ● 自動化にはこだわらない ● 今後も増やしやすいように

Slide 10

Slide 10 text

テストを書く指針
 テスト対象 ● テストに時間がかかる機能 大量のマップデータ ● テストがめんどくさい機能 エディタ拡張 ● テストを見落としがちな機能 完成品の内容物 ● 前科がある機能 バグ修正 こだわり ● 自動化にはこだわらない ● 今後も増やしやすいように

Slide 11

Slide 11 text

全体像
 SDK データソース データソース データソース arowmap arowmap arowmap arowmap arowmap arow-sdk.zip (リリース物) SDK MapTools ● 3D 表現 ● エディタ拡張 Unity で実行 パッケージ化

Slide 12

Slide 12 text

全体像
 SDK データソース データソース データソース arowmap arowmap arowmap arowmap arowmap arow-sdk.zip (リリース物) SDK MapTools ● 3D 表現 ● エディタ拡張 Unity で実行 パッケージ化

Slide 13

Slide 13 text

完成品のテスト


Slide 14

Slide 14 text

完成品の内容物
 完成品 ● ● マップツール(スクリプト各種) 展開後の構成が知りたい

Slide 15

Slide 15 text

unitypackage
 ● が提供するアーカイブ形式 ● 展開すればすぐに 可 ● 実は フォーマット

Slide 16

Slide 16 text

いい感じにしてくれるライブラリ
 https://github.com/gered/extractunitypackage

Slide 17

Slide 17 text

Unity におけるテスト


Slide 18

Slide 18 text

Unity Test Runner
 ● が提供する ● テンポラリな シーン上でテスト ● ●

Slide 19

Slide 19 text

yield return を用いたテスト
 [UnityTest] public IEnumerator TestMyFunc() { // 時間がかかる処理 while (/* 上記の処理が完了 */) { yield return null; } // 時間がかかる処理に対するテスト }

Slide 20

Slide 20 text

エディタ拡張のテスト


Slide 21

Slide 21 text

エディタ拡張
 ● なのでエディタ拡張も製品の一部 ● テスト忘れがち ● 地味にバグる(パスの直し忘れとか) 実装の困ったところ ● ●

Slide 22

Slide 22 text

Reflection

Slide 23

Slide 23 text

Reflection
 ● メタデータを使ってデータやメソッドにアクセス ● とメソッド名(文字列)でコール 評価 ● パフォーマンス悪い ● 保守性悪い(と思う) ● が、テストなので割り切り

Slide 24

Slide 24 text

リフレクションによる呼び出し
 var type = typeof(MyClass); var methodName = "MyMethod"; var flags = BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; var method = type.GetMethod(methodName, flags); var obj = new MyClass(); Object[] parameters = { ... }; method.Invoke(obj, parameters);

Slide 25

Slide 25 text

エディタ拡張で提供している機能
 ● サイズ変換 ● ライセンス認証 の生成 ● 建物用 ファイルの生成 ● ローカルサーバの起動 ● 建物 の静的生成 ● の設定

Slide 26

Slide 26 text

エディタ拡張で提供している機能
 ● サイズ変換 ● ライセンス認証 の生成 ● 建物用 ファイルの生成 ● ローカルサーバの起動 ● 建物 の静的生成 ● の設定 SetUp で実行してファイルが 存在するかテスト Test で実行して yield return で 完了まで待機 TagManager.asset から layers プロパティで取得 Selection.activeObject に 代入して選択状態を再現

Slide 27

Slide 27 text

表示結果のテスト


Slide 28

Slide 28 text

arowmap は
 100万ファイルあるぞ


Slide 29

Slide 29 text

段取り
 建物 を生成 スクリーンショットを撮影 実行時間でフォルダ分け で前回生成分と比較 差分があれば検知

Slide 30

Slide 30 text

スクリーンショット
 ● で建物生成 ● で実行 ● に を設置 ● スクリーンショット撮影 yield return new WaitForEndOfFrame(); var texture = ScreenCapture.CaptureScreenshotAsTexture();

Slide 31

Slide 31 text

テクスチャのリサイズ
 ● をリサイズ後の大きさで確保 ● リサイズ前テクスチャをコピー ● で確保した を 化 ● リサイズ後の大きさで を生成 ● で取り込み コピー ReadPixels

Slide 32

Slide 32 text

で比較した差分
 差分なし 差分あり

Slide 33

Slide 33 text

差分を生んだ犯人


Slide 34

Slide 34 text

差分を生んだ犯人


Slide 35

Slide 35 text

Game View
 ● テスト起動ごとに の大きさが異なる ( のせい?) ● どうにかして の大きさを固定したい ● ライブラリあった ○ ○ 中身はリフレクション ○ 追加・変更・削除が可能

Slide 36

Slide 36 text

まとめ
 やったこと ● 完成品のテスト ● エディタ拡張のテスト ● スクリーンショットの差分テスト 感想 ● テスト書いてたらバグ見つけた ● テストが動いてるという安心感がある ● ハックしている体感がよい

Slide 37

Slide 37 text

https://arow-3dmap.connpass.com/event/139812/ ● 時間: 土 〜 日 ● 場所:ドリコム社カフェ ● ほか:ステキな賞品カッコカリ

Slide 38

Slide 38 text

参考資料
 テスト ● https://developer.aiming-inc.com/unity/unity-playmode-test-runner/ ● https://qiita.com/su10/items/560302ceafa6bf43a13e リフレクション ● https://www.shibuya24.info/entry/2017/02/07/093000 テクスチャのリサイズ ● http://light11.hatenadiary.com/entry/2018/04/19/194015 ライブラリ ● https://github.com/gered/extractunitypackage ● https://github.com/anchan828/unity-GameViewSizeHelper ドキュメント ● https://docs.unity3d.com/ScriptReference/ScreenCapture.CaptureScreenshot AsTexture.html

Slide 39

Slide 39 text

Reflection ご清聴ありがとうございましたっ