(これは AtCoder関連サービス Advent Calendar 2018 の25日目の記事です)
AtCoder Unit Test という、ブラウザの拡張機能を作りました。
これは、どういうものかというと「AtCoder の問題ページから、自動でテストケースを生成するツール」です。
現在の対応言語は、Java, Kotlin, C#, Python 31 です。
その他の言語については Pull Request をお待ちしています。
動作確認を手動でやってますか?
AtCoder にコードを提出する前に、たいていの場合は動作確認をします。その時に、以下の手順でやるのが一般的です。
- プログラムを実行
- 問題ページから入力例をコピー&ペースト
- 実行結果を目視で確認
- 1~3を入力例ごとに繰り返し
でも、これはめんどくさいです。
かといって動作確認なしで提出すると、WA を出してしまいがちです…。
このツールを使うと
そんな手間が、このツールを使うとたったのこれだけになります!
- 問題ページからテストコードをコピー&ペースト
- テストを実行
以上。
これだけで、 全部の入力例を一度に実行できて、しかも実行結果が正しいかどうかも一発で分かります。
これで、うっかりミスで WA を出してしまうのを避けられます。
使い方
使い方は、とても簡単です。
拡張機能を入れた状態で、AtCoder の問題ページを開いて右クリックします。
すると「ユニットテストを生成」というメニューが追加されているので、それをクリック。
これで、以下のようなテストコードがコピーされます。
これをIDEに貼り付けます。
import static org.hamcrest.CoreMatchers.is;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import org.junit.Assert;
import org.junit.Test;
public class MainTest {
@Test
public void 入力例_1() throws Exception {
String input =
"25";
String output =
"Christmas";
assertIO(input, output);
}
@Test
public void 入力例_2() throws Exception {
String input =
"22";
String output =
"Christmas Eve Eve Eve";
assertIO(input, output);
}
private void assertIO(String input, String output) throws Exception {
ByteArrayInputStream in = new ByteArrayInputStream(input.getBytes());
System.setIn(in);
ByteArrayOutputStream out = new ByteArrayOutputStream();
System.setOut(new PrintStream(out));
Main.main(new String[0]);
Assert.assertThat(out.toString(), is(output + System.lineSeparator()));
}
}
あとは回答を書いて、これらのテストを実行してみましょう2。
すべて通ればOKです。安心して提出しましょう!
ちょっとした注意点
- C#
- 問題を解くクラスの名前を Program にする必要があります。
- Python
- 問題を解く関数の名前を resolve にする必要があります。
- Kotlin
- 問題を解くメソッドの名前をパッケージ内で一意の名前にした上で、
main
はその関数を呼ぶのみの作りになっている必要があります。
また、生成されたテストコードのabc000X()
をテスト対象のメソッドに書き換える必要があります。
- 問題を解くメソッドの名前をパッケージ内で一意の名前にした上で、
fun main(args: Array<String>) {
abc123A()
}
fun abc123A() {
// 実装
}
まとめ
ということで、ぜひ使ってみてください!