丸三角四角

IT業界にしがみつく新人SEが立派なプログラマになろうともがく奮闘記

【Java】プログラミングコンテスト用JUnit基底クラス_Ver1

プログラミングコンテストの問題を解く時に、毎回コンソールで入力して出力が合ってるかを手動で行なっていたので自動化することにしました。

最新バージョンのコードは以下の記事で紹介しています。

dadainu.hateblo.jp

わたしはJavaで問題を解いているので、JUnitでテストを実行してます。その際に共通して行っている処理をこの基底クラスにまとめて、各テストドライバを作成する際はこの基底クラスを継承するようにしました。

import static java.lang.System.out;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.PrintStream;
import java.util.Scanner;
import org.junit.After;
import org.junit.Before;

public class BaseTest {

    /** コンソール正常出力取得クラス */
    protected final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
    /** コンソール正常出力取得結果 */
    protected String[] outList;
    /** コンソール異常出力取得クラス */
    protected final ByteArrayOutputStream errContent = new ByteArrayOutputStream();
    /** コンソール異常出力取得結果 */
    protected String[] errList;

    /** テスト実行前処理 */
    @Before
    public void setUp() throws Exception {
        System.setOut(new PrintStream(outContent));
        System.setErr(new PrintStream(errContent));
    }

    /** テスト実行後処理 */
    @After
    public void tearDown() throws Exception {
        System.setOut(null);
        System.setErr(null);
    }

    /** 入力データ取得 */
    protected String[] getInData(String inDataPath) {
        String inData = "";
        try (Scanner scan = new Scanner(new File(inDataPath))) {
            while ((inData = scan.nextLine()) != null || !"".equals(inData)) {
                inData += inData;
            }
        } catch (Exception e) {
            printErr(e);
        }
        return inData.split("\n");
    }

    /** 出力値検証 */
    protected void assertOut(String[] outList, String outDataPath) {
        try (Scanner scan = new Scanner(new File(outDataPath))) {
            for (String out : outList) {
                assertEquals(scan.nextLine(), out);
            }
        } catch (Exception e) {
            printErr(e);
        }
    }

    /** エラー情報出力 */
    protected void printErr(Exception e) {
        errList = errContent.toString().split("\n");
        printList(errList);
        fail(e.getMessage());
    }

    /** リスト情報出力 */
    protected void printList(String[] outList) {
        for (String item : outList) {
            out.println(item);
        }
    }
}

 

後々ドライバを作成していて同じような処理を記載しなければならない場合は、この基底クラスにメソッドを追加していくような形をとります。

この基底クラスを作成してテストがだいぶ楽になりましたので、参考にしてみてはどうでしょうか。

 

わたしが行っているプログラミングコンテストは以下です。

AOJ - 修行

 

アルゴリスムで困った時は、以下の本を参考にしてます。Javaに置き換えるのが少々難解ですが、、、