質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.65%

JUnitテストについて質問です

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 4,014

fnglsh_mae

score 8

今、以下のクラスについてのJUnitテストを書こうとしているのですが、どういう風にテストメソッドを設定すればよいか分かりません。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Age {

    public static void main(String[] args) throws IOException{
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
       System.out.println("年齢を教えてください");
       int x;
       x = Integer.parseInt(br.readLine());
      
    
     if (x>=20)
             System.out.println("成人ですね。");
     else
             System.out.println("未成年ですね。");
     

}
}

元々テストメソッドの書き方がいまいち理解できていないので、どなたかご教授願えますでしょうか?
初歩的な質問で申し訳ありません。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

JUnitは一般的にホワイトボックステストに使います。実装時に「この時はこの処理を行なう」、「この処理を行うと変数はこうなる」等を考えなら実装すると思います。これをそのままテストメソッドにすればいいと思います。簡単に言えば下記の観点でテストを作ればいいでしょう。
・引数Aを渡すと値Bを返却する。
・Aメソッドを呼ぶと変数Bの値が変更される


テスト1
xが0以外である
テスト2
xが20以上の時にコンソールに「成人ですね。」が表示される。
テスト3
xが20未満の時にコンソールに「未成年ですね。」が表示される。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/26 23:00

    ご回答ありがとうございます。
    追加で申し訳ないのですが、
    テスト2、テスト3の時のコンソール表示は具体的にどのようなコードで書けばいいと思われますか?
    余裕がございましたら、お答えして頂けると幸いです。

    キャンセル

  • 2015/09/26 23:54

    少しは調べたでしょうか?
    下記に解決済みの質問を貼ります。
    https://teratail.com/questions/3694
    正しいかは自身で調査をお願いいたします。

    キャンセル

0

Age.java と AgeTest.java を以下に示します。
また、 eclipse で emma プラグインをつかってカバレージもとりながらテストを実行したときのスクリーンショットも示します。

参考情報として以下を参照してください。
- JUnitで標準入力をつっこんで流す http://qiita.com/Takmiy/items/ea234d2211aba66e7659
- 単体テスト実施時にテストのカバレッジを計測するツール:EclEmmaプラグイン http://d.hatena.ne.jp/MoonMtLab/20130826/1377467826

イメージ説明
Age.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Age {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("年齢を教えてください");
        int x = Integer.parseInt(br.readLine());

        if (x >= 20) {
            System.out.println("成人ですね。");
        } else {
            System.out.println("未成年ですね。");
        }
    }
}
AgeTest.java
import static org.junit.Assert.assertEquals;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class AgeTest {
    private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
    private final ByteArrayOutputStream errContent = new ByteArrayOutputStream();
    private final StandardInputSnatcher in = new StandardInputSnatcher();

    @Before
    public void setUpStreams() {
        System.setOut(new PrintStream(outContent));
        System.setErr(new PrintStream(errContent));
        System.setIn(in);
    }

    @After
    public void cleanUpStreams() {
        System.setOut(System.out);
        System.setErr(System.err);
        System.setIn(System.in);
    }

    @Test
    public void testAdult() throws IOException {
        String[] args = {};
        in.inputln("21");
        Age.main(args);
        assertEquals("21歳は成人", "年齢を教えてください\n成人ですね。\n", outContent.toString());
    }

    @Test
    public void testChild() throws IOException {
        String[] args = {};
        in.inputln("19");
        Age.main(args);
        // System.out.print("hello");
        assertEquals("19歳は未成年", "年齢を教えてください\n未成年ですね。\n", outContent.toString());
    }

    @Test
    public void test20() throws IOException {
        String[] args = {};
        in.inputln("20");
        Age.main(args);
        // System.out.print("hello");
        assertEquals("20歳は成人", "年齢を教えてください\n成人ですね。\n", outContent.toString());
    }
}
StandardInputSnatcher.java
import java.io.IOException;
import java.io.InputStream;

// See http://qiita.com/Takmiy/items/ea234d2211aba66e7659
//     > JUnitで標準入力をつっこんで流す

/**
 * 標準入力に対し、文字列入力を行う
 */
public class StandardInputSnatcher extends InputStream {

    private StringBuilder buffer = new StringBuilder();
    private static String crlf = System.getProperty("line.separator");

    /**
     * 文字列を入力する。改行は自動的に行う。
     *
     * @param str    入力文字列
     */
    public void inputln(String str) {
        buffer.append(str).append(crlf);
    }

    @Override
    public int read() throws IOException {
        if (buffer.length() == 0) {
            return -1;
        }
        int result = buffer.charAt(0);
        buffer.deleteCharAt(0);
        return result;
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.65%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る