MASATOの開発日記


前の開発日記 次の開発日記 一覧

2002/12/27

一日の頭の動きを良くするためには、最初が肝心です。つまり朝。
朝、30分早く起きて、30分何かコーディングをすると、頭が活性化し、 その日は調子良く過ごせるようです。変な頭だと自分でも思います。

JUnitの快感

Javaの単体テスト用フレームワークとして、JUnitというのがあります。 最近はこれを使って開発を進めているので、感想でも述べたいと思います。

良かった点を2つに分けて述べます。最初は、自動単体テストプログラムについてです。
ここで言う自動単体テストプログラムは、ユーザが手でパラメータを入力することなく、 1つのコマンドを実行するだけで単体テストを行うようなプログラムのことです。
本来のプログラムとは別に、このテストプログラムを作ることにより、 実装時間は2〜3倍になったような気がします。 ただ単にテストプログラムを作るというだけで結構手間ですし、 実装の仕様を少し変更するだけで、テストプログラムにも色々と変更が必要になり、結構面倒でした。
しかし、その分デバッグ時間が1/5になったような気がします。 色々なバグが早期に発見でき、また、仕様変更に伴って紛れ込んだバグもすぐに発見できました。 結果的に総開発時間は短くなった感じがします。 バグが紛れ込むのを恐れず、大胆な仕様変更もできるので、どんどん良い仕様に変えていく事ができました。
結果、自分の作ったプログラムの品質はある程度高いと確信でき、自己満足できました。

次に、JUnitについての感想です。
JUnitは、自動単体テストプログラムのフレームワークなので、 JUnitを使うと、自動単体テストプログラムを簡単に作ることが出来ます。 といっても、JUnitがやってくれることは、大雑把にいうと、 testから始まるメソッド(例えば、testAdd,testDelete、等)を順番に実行していくだけです。 正直、JUnitを使わずに自動単体テストプログラムを作っても、それほど開発時間に差があるとは思えません。
JUnitの真の利点は、他のプログラムとの連携にあると思います。
今、私はEclipseという統合環境を使ってJavaアプリケーションの開発を行っています。 このEclipseには、JUnitとの連携機能があります。 これを使うと、次のようなことができます。

要はテスト&デバッグ周りを統合環境にちょっと支援して貰えるということです。 Eclipse以外にも、JUnitと連携するプログラムは一杯あります。 逆に、オリジナルの自動単体テストプログラムと連携してくれるプログラムは ほとんど無いでしょう。

こうした支援のおかげで、エディタの起動やらなんやらといった本質とは外れた操作を行う必要が無く、 テストプログラムの実装や、デバッグ作業に集中できました。

また、JUnitを使っている人にとって、 JUnitを使ったプログラムのソースコードは、見て分かりやすいものです。 JUnitを使うことにより、テストプログラムの保守性を高めることができるでしょう。

結局のところ、フレームワークを使うことにより色々なメリットが得られるということです。 そして、Javaで、自動単体テストプログラム用のフレームワークでもっともメジャーなのは、JUnitです。 というわけで、JUnitを使うといろいろといいことがありますよ、ということでした。

ゲームにおける自動単体テストプログラム

ゲームという分野に属するアプリケーションの単体テストプログラムは、とても作りにくいものです。 理由は二点あって、一つは、何らかの操作の結果が「画面に表示」という形であらわれることが多いからです。 それが3Dの画像だったりすると、正しく表示されたかどうかを自動的に判断するのが とても難しいのです。
人間の目ならば瞬時に判断できることも多いのですが、自動的にやるとなると、 画面のビットパターンを取得し、正しいビットパターンと比較するとか そのくらいしか思いつきません。しかし、正しいビットパターンを作るのも大変ですし、 ビデオカードの違いによって微妙に表示がずれたりすることもありますので、 これをちゃんとテストするのはとても難しいです。

もう一つの理由は、結果がランダムで求まる事が多いことです。 例えば、敵に与えるダメージにランダム要素が加味されていると、 正しいダメージかどうか判断するのが難しくなります。
例えば、三回テストして、全て正常の範囲の値ならば、それで良しとなるのでしょうか。
例えば、非常に稀な確率で出現するアイテムが、本当に稀な確率ででるかどうかを確認するには どうすれば良いのでしょうか。

この問題が、上記した結果が画面に表示される問題と組み合わさると、さらに事態はややこしくなります。 そして、ゲームでは、こうしたことは、良くあることなのです。
というわけで、ゲームのテストって難しいですねー。人海戦術しかないのですかねー。 でもそれは開発者が1人又は少数だと難しいですねー。うーむ。ということでした。

前の開発日記 次の開発日記 一覧