Open Source WEB

(今日の打ち合わせはスムーズだったな。いつもこの調子だといい んだけどね。。)

森川は、客先の打ち合わせを終えて帰社し、行き先掲示板を 「在室」に変更して自席に戻った。 鞄からノートPCを取り出して電源を入れ、OSの起動を待つ。

ふと、気がつくと隣の内村が腕組みして画面を見つめ、何か考えて いるようだった。

「内村、難しい顔してどうしたんだい?」

深刻にならないように、明るい調子でさぐりを入れる。

「あぁ、森川さん、おかえりなさい。 いえ、ちょっとユニット・テストをどうしようかと思って。。」

「どれどれ。。」

少し自信なさげな様子の内村を見て、状況を確認してみることに し、内村の説明を聞く。

「ログイン処理がほぼ完了なので、次のログイン履歴のロギング 部分を作っているんですが、ユニット・テストをどう作ればいい のか分からなくて悩んでいます。これってファイルに出力した内 容を読み出すんでしょうか。。」

ログイン履歴機能は、ログイン日時とアカウントなどの情報を記 録して、システムの利用状況を把握できるようにするため、顧客 から要望が上がっていたものだ。

仕様では、

1.ファイル名は「accessYYYYMMDD.log」として、日毎のファイ
    ルを生成する。(YYYYは年、MMは月、DDは日を表す)

2.出力内容は日時、およびアカウント情報を CSV形式で出力する
    (YYYY/MM/DD-hh:mm:ss username,...)

となっている。

「なるほどね。ファイルから読み出すとすると。。最後のエントリ を読み出して、出力内容の確認をすればいいのか。確かにユニット・ テストは少し複雑になりそうだね。」

「そうなんですよ。ファイルも実際に作成されるんですよね。。」

「テストが複雑になるときは、一度に複数のテストをしようとして いないか疑ってみるといいよ。」

「え?でも、ログイン履歴の出力だけのテストですよ。」

「いや、そうじゃないんだ。ログイン履歴の出力はひとつの機能だ けど、確認ポイントは複数あるよね。例えば、ファイル名が正し いか、出力内容が正しいか、そしてファイルに正しく出力される かの3点考えられる。」

「。。。」

「今あるログイン履歴の出力メソッドを、こんな感じで分けてみよ う。」

  [AccessLog]
    public void write(String login) {
        // ログイン履歴の出力先ファイル名
        String filename = this.getLogName();

        // 履歴の出力内容
        String line = this.getLogLine(login);
        
        try {
            BufferedWriter writer
                = new BufferedWriter(new FileWriter(filename));
            writer.write(line, 0, line.length());
            writer.newLine();
        } catch (Exception e) {
            ;
        }
    }

    public String getLogName() {
        :
    }

    public String getLogLine(String login) {
        :
    }

「getLogName()、getLogLine()のテストメソッドで、それぞれファ イル名、出力内容の正当性が確認できるようになる。ファイルに出 力できるかは単純なコードだから、一度動くことを確認しておけば、 毎回確認しなくてもまぁいいかな。」

「確かにファイル名と出力内容は、別々にテストできるようにして テストが書きやすくなるのは分かりましたが。。 getLogName()、getLogLine()が public になっています。これは private メソッドにすべきではないんですか?」

「そうだなぁ、普通なら2つのメソッドは private にするかもね。 ただし、ここではテストしやすくなることに重点を置いてるんだ。 それに getter メソッドだから公開メソッドにしても、カプセル化 は壊れないしね。 どうしても気になるなら、パッケージ・プライベートなメソッドに して、テストクラスを同じパッケージに作成してもいいかな」

テスト駆動開発では、従来の設計とは違ってテストが作成しやすい ように設計することがよいとされている。

森川のアドバイスを受け、内村は再びコードを入力し始めた。。


前回:こっそりコード共有 次回:リファクタリングは順番が大事


コメントどうぞ!

Name:
Comment:

There is no comment.

このサイトは、 IPA の「平成15年度オープンソフトウエア活用基盤整備事業」 の委託事業として開発されたKahuaで試験的に運用しております。

Copyright (c) 2004-2007 株式会社タイムインターメディア About Us