Help us understand the problem. What is going on with this article?

AtCoder Unit Test を使って、動作確認を簡単に!

(これは AtCoder関連サービス Advent Calendar 2018 の25日目の記事です)

AtCoder Unit Test という、ブラウザの拡張機能を作りました。
これは、どういうものかというと「AtCoder の問題ページから、自動でテストケースを生成するツール」です。

現在の対応言語は、Java, Kotlin, C#, Python 31 です。
その他の言語については Pull Request をお待ちしています

動作確認を手動でやってますか?

AtCoder にコードを提出する前に、たいていの場合は動作確認をします。その時に、以下の手順でやるのが一般的です。

  1. プログラムを実行
  2. 問題ページから入力例をコピー&ペースト
  3. 実行結果を目視で確認
  4. 1~3を入力例ごとに繰り返し

でも、これはめんどくさいです。
かといって動作確認なしで提出すると、WA を出してしまいがちです…。

このツールを使うと

そんな手間が、このツールを使うとたったのこれだけになります!

  1. 問題ページからテストコードをコピー&ペースト
  2. テストを実行

以上。

これだけで、 全部の入力例を一度に実行できて、しかも実行結果が正しいかどうかも一発で分かります。
これで、うっかりミスで 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() {
    // 実装
}

まとめ

ということで、ぜひ使ってみてください!


  1. Kotlin は @da_louis さんから、Python 3 は、@frodo821 さんから Pull Request いただいて対応することができました。 

  2. ちなみに、eclipse であれば Quick JUnit プラグインを入れておくと便利です。Ctrl+9 でテストコードへの切り替え、Ctrl+0で実行ができるようになります。 

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away