わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

単体テストとオンラインジャッジ,どう違うの?

「なるほど,そんなことは,考えたことがなかったなあ….
 単体テストも,オンラインジャッジも,プログラムを入力にとり,仕様に適合しているかどうかを,実行して判定する,という共通点はあります.
 しかし,違うところのほうが多いと言っていいでしょう.例えば…オンラインジャッジでは,問題文には,自然言語による仕様だけでなく,入力と出力のペアが書かれているのが一般的です.プログラムは最低限,その入力に対して,その出力にしないといけないのですが,判定する側は,公開している仕様と別に,判定用の入力・出力を用意しています.用意しているあらゆるテストケースで正解だったときに,Acceptedの結果となります.
 それに対し,単体テストの判定は,テストコードがすべてです.隠されたコードを使って判定する,ということはありません.
 プログラムを作成する側の考え方も,違ってきます.オンラインジャッジでは,パスすることが最優先です.とりわけ,時間の短さや順位が,スコアに影響するなら,『なるはや』が望まれます.
 それに対し(連発は良くないなあ…),単体テストを含むソフトウェアテストは,そのテストにパスすればよい,それが最優先課題だ,というスタンスを基本的にはとりません.ソフトウェアテストは,開発しているソフトウェアをより良くするための手段であり,定評のあるなになにテストの中で,用途に合うなら単体テストを採用するのです」

授業で何をしたか

 昨日の授業は,JSPファイルを編集して2週で一つのWebアプリケーションを完成させる,というのの2週目でした.1週目は例年通りでしたが,2週目の課題を変更し,JUnitによる単体テストの実行を課題に含めました.
 Moodleを通じて提供したのは,2つのJavaファイルです.一つには,テスト対象の(そして今回のWebアプリケーションのロジックに当たる)クラスを定義し,もう一つには,テストを実行するためのクラスです.このペアについて,所定の手順で実行*1すると,okの出力になります.もちろんそれで終わりというわけではなく,テスト実行のJavaファイルには,/* と */ による大きめのコメントを入れていまして,そのコメントを取り除いて走らせ,okとなるよう,テスト対象のクラスをきちんと定義することを指示したのでした.
 本日の記事のタイトルは,TAが発したものです.回答としてしゃべったのは,教室の学生全体に向けて話したのではなかったものの,前方の学生は,課題を実施しながら耳に入っていたはずです.

*1:Pleiades All in Oneは,Java版をインストールしていればJUnitが利用可能となっていました.PaizaCloudのターミナルでは,https://zenn.dev/peg/articles/456ce6550cacb8をもとに,動作確認を行ってから,学生向けに手順書を作成しました.