矢崎です。
花子さんモード
今日は、三郎さんとペアね。三郎さん、いなくなっちゃったけど、
どうやらMemberListの修正を少しやったみたいね。
ちょっとコードを読んでみます。
tetsuya@....jp さんwrote:
>
> 次に、どのクラスの責任にするかだけど、、、、メンバーリストは全てのメンバー
> がメモリにロードされて使用されるだろうから、今あるMemberListにファイルから
> のロード機能をつけても問題なさそうだね。
>
> では、テストを追加、、、と。MemberListTestにコードを追加するよ。
> ファイル名はコンストラクタで渡すとしておこうか。
>
このへんは、妥当な判断だと思うわ。
> こんな感じでいいよね。
> テストが終わったら、使用したテストファイルを消すようにしたんだ。
> 僕にしては気が利いているだろ?
この方法もグッド。ConfitTestもテストファイルを消すようにしましょう。
忘れないように、タスクカードを書いておくわ。
(タスクカード)
ConfigTestについて、テストファイルをテスト終了後に削除する
ようにする。MemberListTest V1.2を参考。
>
> それと、単なる空行や、スペースのトリム処理ぐらいは確認しておこうか。
トリムについてもConfigTestでも同様のテストをしたほうがいいわね。
これもタスクカードにしてっと。
(タスクカード)
Configファイルについて、前後に空白のある行のテストを追加する。
> なんか同じようなコードを書いているけど、とりあえずは先に進もうかな。
今のところ、テストをとりあえず充実させるほうがいいと思うな。
テストを考えるという思考を中断させるのは、かえってマイナス
だと思うの。とりあえずテストケースをひとおり洗いだせた、と思
うところまで、テストケースを考える帽子をかぶったままでいるほ
うがいいんじゃないかしら。
ということでテストについて少し考えてみました。
1.testLoadCorrectMemberList1について
ファイルから復元したMemberの数が、size()で正しく
取得できるか確認したほうがいいと思うの。それと、
本当に2件のmemberしかmemberListに登録されて
いないかもテストしたほうがよくないかしら、つまりこん
なふうに、、
public void testLoadCorrectMemberList1() {
final String fileName = "correctMemberList1";
try {
createCorrectMemberList1(fileName);
MemberList memberList = new MemberList(fileName);
assertEquals(2,memberList.size()); /* add 1 */
assertEquals(firstMember, memberList.get(0));
assertEquals(secondMember, memberList.get(1));
try{ /* add 2 star */
memberList.get(2);
fail("Should raise an IndexOutOfBoundsException");
}catch(IndexOutOfBoundsException e){
assert(true);
} /* add 2 end */
} finally {
deleteMemberList(fileName);
}
}
add2のところで、getメソッドがインデックスの有効範囲を超えた場合
は一応IndexOutOfBoundsExceptionをthrowする、としたけれど、例外
については三郎君と話あったほうがいいわね。Configと同じように、独
自のExceptionを返す、という考え方もあるんじゃないかしら。
じゃあ、ここでコンパイルして、テストするわね。
コンパイルOK。テストもOK。MemberList本体を直さなくてもテスト通ちゃ
たけど、だいじょうぶかしら。念ためにMemberList本体のコードを確認
しておきます。・・・大丈夫のようね。
2.testLoadCorrectMemberList2について
これもtestLoadCorrectMemberList1と同じように、size()のテストと、
IndexOutOfBoundsExceptionのテストを追加しておくわ。
public void testLoadCorrectMemberList2() {
final String fileName = "correctMemberList2";
try {
createCorrectMemberList2(fileName);
MemberList memberList = new MemberList(fileName);
assertEquals(2,memberList.size());
assertEquals(firstMember, memberList.get(0));
assertEquals(secondMember, memberList.get(1));
try{
memberList.get(2);
fail("Should raise an IndexOutOfBoundsException");
}catch(IndexOutOfBoundsException e){
assert(true);
}
} finally {
deleteMemberList(fileName);
}
}
コンパイル、テスト、これも通ったわ。
3.MemberListファイルが空の場合
MemberListファイルはあるのだけれど、中身が何もない場合が
あるわよね。こういう場合のテストもしましょう。テストメソッドを
追加します。
public void testLoadEmptyMemberList() {
final String fileName = "emptyMemberList2";
try {
createEmptyMemberList(fileName);
MemberList memberList = new MemberList(fileName);
assertEquals(0,memberList.size());
try{
memberList.get(0);
fail("Should raise an IndexOutOfBoundsException");
}catch(IndexOutOfBoundsException e){
assert(true);
}
} finally {
deleteMemberList(fileName);
}
}
private void createEmptyMemberList(String aFileName) {
BufferedWriter bufOut = null;
try {
bufOut = new BufferedWriter(
new FileWriter(aFileName));
} catch (FileNotFoundException e) {
fail(e.toString());
} catch (IOException e) {
fail(e.toString());
} finally {
try {
if (bufOut != null)
bufOut.close();
} catch (Exception e) {
}
}
}
コンパイル、テストっと、あれ、これもMemberListに手をつけないで
テスト通ってしまったわ。
4.MemberListファイルがない場合
コンストラクタの引数で与えられたMemberListファイルの名前に対応
するファイルが存在していなかった場合のテストをしなきゃ。この場合は
コンストラクタから何らかのExcepitonをthrowすることにしよう。例外は、
っと、これは三郎君と要相談だわ。ここでは一応FileNotFoundをthrow
することにするわ。
まず以下のテストメソッドを追加
public void testLoadNoMemberList() {
final String fileName = "noMemberList";
try {
createEmptyMemberList(fileName);
deleteMemberList(fileName);
MemberList memberList = new MemberList(fileName);
fail("Should raise an FileNotFoundExeption");
}catch(FileNotFoundException e){
assert(true);
}
}
今度はコンパイルが通らなかったわ。コンパイルのメッセージ
によれば、上のメソッドで、FineNotFoundExceptionが、対応する
tryブロックでthrowされることはないんだって。だからMemberList
からFineNotFoundExceptionがスローされるように書きなおすわ。
まずMemberListのコンストラクタにthrowsをつけて
public MemberList(String nameOfMemberList) throws FileNotFoundException{
次に、MemberListTestのテストメソッドの中で、上記のコンストラクタ
を使っているメソッドにもthrowsをつけるわ。
public void testLoadCorrectMemberList1() throws FileNotFoundException{
public void testLoadCorrectMemberList2() throws FileNotFoundException{
public void testLoadEmptyMemberList() throws FileNotFoundException{
これで、コンパイルっと。OK。次はテスト。テストは通りませんで
した。テストが通るようにMemberListを修正。
修正は簡単ね。今まで、FileNotFoundExceptionをRuntimeException
に変換して投げていたところをそのまま投げるようにすればいいの
ね。
} catch (FileNotFoundException e) {
throw new FileNotFoundException(); /*修正*/
コンパイル、テスト、はい、通りました。
ここでちょっと休憩するわね。ソースはコミットしておきます。
三郎君、戻ってきたらチェックしてくださいな。
花子としては、次の点を引き続き検討してみたいのだけど。
1.ファイルに同じアドレスの行が複数あった場合。重複は
別々じゃなくて、1つのMemberってしちゃえばいいのよね。
2.引数なしのコンストラクタは本当にいるのかしら。削除
してもいいのじゃないかしら?
3.2がYesだったらだけど、addメソッドもpublicにしておく
必要ないと思うのだけれど。privateでいいんじゃない?
> それと、privateフィールドへのアクセス用ヘルパクラスを作成しました。
> 言い出しっぺの法則です。
>
> 暫定的に、パッケージ「testtool」を作らせていただきます。
>
>
#素モード
まだ、ちゃんと見ていません。明日見ます。
>
> それと、MemberList, MemberListTestの全ては以下のとおり。
> # 今後、ソースの全ての添付は行うべきでないようでしたら、助言をお願いします。
> # 追加部分のみを書いてCVSで管理したほうがいいのかな?
>
私も今まで全文を載せるようにしていましが、他の方はどうでしょう?
HTMLのCVSで最新は見れるので、コミットした場合は全文はメール
には載せないようにしましょうか?コミットしない場合は、メールに載せる
というのはどうでしょう?
--
矢崎 博英 <firo@....jp>