Unity 2018.1でTest Runnerの使い方が変わっていた話

はいどーもこんばんは、無職こじらせてニートの高等遊民です。
皆さんはきちんとテスト書いてますか。
テスト書いてない人はレガシーコードになってますよ。
僕はレガシーコードしか書いてません。
ちゅーわけで今日はUnityのTest Runnerのお話です。

なんで今さらTest Runnerの話か

Test Runnerの情報なんて日本語文献に限ってさえ腐るほど出てますよね。
僕が今さらTest Runnerのことをアレコレ語るなんて全く意味がないように思えます。
しかしそれでもなおTest Runnerの話題を取り扱ったのは、Unity 2017.3.0f3とUnity 2018.1.0f2でTest Runnerの使い方が微妙に違ったからです。
おそらく開発に慣れている人にとっては「そんなの見たらわかるだろぅ~?」という話なのでしょうが、僕はテスト自体ほとんどしたことがないわけでして、この違いを理解するのに二時間以上かかりました。
というわけで同じような境遇の方が二時間もかからず正解にたどり着けるよう、備忘録も兼ねてUnity 2018.1でのTest Runnerの使い方をまとめようと思ったわけです。

Unity 2017.3ではどうだったか

比較対象としてUnity 2017のTest Runnerの使い方を見てみましょう。
と言っても1から書くのは面倒なので、以下の記事を参考にしてください。
https://qiita.com/Teach/items/c894fcf765365be4fe0f
記事を見た限り、特にややこしいことはないですね。
EditorフォルダにEditMode Test C# Scriptを作れば、あとはメニューのWindowからTest Runnerを起動すればOKです。

Unity 2018.1はどうだったか

さて僕は最近になってUnityのバージョンを2018.1にあげたわけですが、2017のときと同じように2018でもテストを実行しようとしたところ、なんとテストがうまいこと実行できないではないですか。
具体的に言えば、Assets以下に作成したC#スクリプトのクラスにTest Runnerで使用するフォルダ以下のクラスからアクセスできなかったのです.
ついでに言うと、Create→Testingから表示されるメニューが微妙に変わっていました。

現象の再現

「ひょっとして参照がうまく追加されていないのでは?」ということまでは予想がついたのですが、どうやって参照を追加すればよいのかが全くわかりませんでした。
そしてアレコレ二時間ほど試したところ、うまくいく方法が判明したことはすでに書いた通りです。
ですがテストと同じように、まずは失敗してみましょう(あるいはすでに失敗してここにたどり着いている方は斜め読みでも)。

1.テストを追加したいフォルダで「右クリック→Create→Testing→Tests Assembly Folder」を選択
2.Testsフォルダが作成される
3.Testsフォルダの中で「右クリック→Create→Testing→C# TestScript」を選択
4.NewTestScript.csが作成されるので、その中で適当にテストを書く
5.メニューから「Window→Test Runner」を選択

あとは普通にテストするだけです。
ですがここで「Assets以下に作成したC#スクリプトのクラスにTest Runnerで使用するフォルダ以下のクラスからアクセスできなかった」という問題が発生します。
例えばScriptsフォルダを作成していたとして、そのScriptsフォルダにHogeクラスがあったとします。
そのHogeクラスにTestsフォルダのNewTestScriptからアクセスできないということです。

よーわからんという方は、とりあえず一回自分で失敗してみてください。

解決方法

それではHogeクラスにアクセスできるようにする方法をズバリ書いていこうと思います。
前提として、フォルダ構成は以下のようになっていることとします。
Assets→Scripts(ここにHogeクラスがある)→Tests(ここにNewTestScript.csがある)

1.Scriptsフォルダで右クリックして「Create→Assembly Definition」を選択し、Assembly Definitionを作成
2.TestsフォルダのTestsを選択
3.Referencesに先ほど作成したAssembly Definitionを追加

はい、以上です。
わかればなんて簡単なんでしょう!
これでテスト用のクラスから、そうでないクラスへアクセスできるようになります(ただし今回の例の場合、Scriptsフォルダ以下にないスクリプトへのアクセスは無理。詳細については次節で紹介している記事を参考にしてください)。

Assembly Definitionってなんやねん

さてAssembly Definitionというものが出てきましたが、これって一体何でしょうか。
答えはズバリこの記事「C#のコードが出力するアセンブリを複数のアセンブリに分割するだけの、超地味な機能」と書かれています。
たぶんですが、Unity 2018.1からTest Runnerもこれでアセンブリを分割して使いましょうねーという方針になったのだと思います。
ただ僕なんかは「どこで分割したらいいのかなあ……」なんて悩んでしまうので、ちょっと面倒だなあと感じてしまいます。
まあ今はこういう分割(もとい管理方法?)にも慣れないといけないんでしょうねえ……。

終わりに

いかがでしたでしょーか。
本日はTest Runnerについて簡単に書いてみました。
僕はテストを全く活用できていないので、ボチボチ使えるようになりたいなあと思いますよ。

ついでに週休3日から4日のお仕事も募集中です。
お給料は月10万以上で!

ほなそんな感じでまた。

フォローする