Index: [Article Count Order] [Thread]

Date:  Tue, 5 Sep 2000 09:07:45 +0900
From:  omura@....jp
Subject:  [XP-jp:00815] fixture のかきかた
To:  extremeprogramming-jp@....jp (extremeprogramming-jp ML)
Message-Id:  <20000905090655omura@....jp>
Posted:  Tue, 05 Sep 2000 09:06:55 +0900
X-Mail-Count: 00815

大村です。

fixutreを適当に書いていると、setUp()でまとめるのはいいんだけど、その中にはあるテストでは使わない
データがあったりして、気持ちが悪かったりします。

その気持悪さを解消しようとすれば、fixture毎にまとめてTestCaseを作るということになると思います。

でも、さらに考えてみると、おんなじfixtureで異なるクラスのテストをしたりすることもあるはずで、だとすると
fixtureを中心にクラスを構成するようなやり方が有効になるのかなと思います。

つまり、fixtureを作るクラス群と、具体的なテストのメソッドを持つクラス群を二つのレイヤーにわけてしまうと
気持ちいいかな、なんて思ったりしてます。

まあ、実際にはケースバイケースなんでしょうけど、ひとつのパターンとして有効かなと考えるわけです。

たとえば、MemberListTestの場合だと、次のようなコードを書きたくなるんですが、どう思いますか。

今の場合、クラスOneMembersMemberListTestFixture, TwoMembersMemberListTestFixtureは不要で
TestCaseの中にsetUp()を埋め込んでしまえばいいんですけど、気持ちをみてもらいたいのでこう書きました。
(ある意味YAGNI違反?)
また、constructor, main()などあんまり関係ない部分ははしょってます。


public class RootMemberListTestFixture extends TestCase {
	protected MemberList memberList;
	protected void setUp() {
		memberList = new MemberList();
	}
}
public class OneMembersMemberListTestFixture extends RootMemberListTestFixture {
	protected Member member;
	protected void setUp() {
		super();
		member = new Member("aaa@....ccc");
	}
}
public class TwoMembersMemberListTestFixture extends RootMemberListTestFixture {
	protected Member firstMember;
	protected Member secondMember;
	protected void setUp() {
		super();
		firstMember = new Member("aaa@....ccc");
		secondMember = new Member("ddd@....fff");
	}
}
public class MemberListBasicTest extends RootMemberListTestFixture {
    public void testNewMemberList() {
        assertEquals(memberList.getSize(), 0);
    }
    // 他のテストメソッドが続く....
}
public class MemberListOneMemberTest extends OneMembersMemberListTestFixture {
    public void MemberListOneMemberTest() {
        memberList.add(member);
        assertEquals(memberList.getSize(), 1);
    }
    // 他のテストメソッドが続く....
}
public class MemberListTwoMemberTest extends TwoMembersMemberListTestFixture {
    public void testTwoMemberList() {
        memberList.add(firstMember);
        memberList.add(secondMember);
        assertEquals(memberList.getSize(), 2);
	}
    // 他のテストメソッドが続く....
}}


このコードの問題点として認識していること...

・ テストケースが、fixutreの集合みたいなクラスを継承するのはへんかも。
  でも、setUp()を継承したいから、こう書くしかないのよね。

・ クラスの数が多すぎ。これだと Fixutureの構造が複雑になると、こんなことやってられない。


他には?