« NetBeansでcoverage reportを行う | トップページ | NicoBrowser(nico browser) - 403返却時への対応 »

2009/02/15

FESTを使用してJava GUI (Swing)のテストを実行してみる

FEST-Swingを使用してみた手順を記載する。なお、NetBeans用プラグインも存在するが、現時点ではリリースされているバージョンより古いものがインストールされる。ライブラリを自動で作成してくれる程度のことしか行っていないように見えるので、プラグインにこだわる必要は無いだろう。

環境設定

テストライブラリにfest-assert-1.0.jar, fest-reflect-1.0.jar, fest-swing-1.0.jar, fest-util-1.0.jarを追加する。(これらはプラグインに含まれていたものであり、実際に全て使用しているのかは未検証)

fest01

恒常的に使用するのであれば、ライブラリ化しておくと良いだろう。

 

1つのチェックボックスの状態をテストする

チェックボックスを用いてテストを行ってみる。今回はJUnit4.5を使用した。

以下がテスト用のウィンドウである。JFrameの中にチェックボックスコンポーネントを1個配置した(ソースコード)。

fest02

 

まず、テストケース実行前後に以下の処理を実行させる。

    @Before
    public void setUp() {
        window = new FrameFixture(new NewJFrame());
        window.show(); // shows the frame to test
    }

    @After
    public void tearDown() {
        window.cleanUp();
    }

続いて、チェックボックスが選択された状態になっていることを確認するテストケースを作成する(ソースコード)。

    @Test
    public void testCheckBox() {
        window.checkBox().requireSelected();
    }

ここまでのNetBeansプロジェクトとソースコードはこちら(NetBeansで実行するには、test_lib以下に冒頭のfestライブラリをコピーする必要がある)。

Shift+F6を押してテストケースを実行してみると、下記のエラーとなる(折り返されて見づらいが、実際には1行で表示される)。

junit.framework.AssertionFailedError: [javax.swing.JCheckBox[name=null, text='チェックボックス', selected=false, enabled=true, visible=true, showing=true] - property:'selected'] expected:<true> but was:<false>

selected(true)を期待していたが、実際にはfalseになっている、というJUnitの報告が挙がっている。

そこで、起動初期状態として、チェックボックスが選択された状態にするコードを追加する。

    public NewJFrame() {
        initComponents();
        jCheckBox1.setSelected(true); // 追加
    }

NewJFrame.javaに上記の3行目を追加し、Ctrl+F6でテストを実行する。結果、JUnitは成功して終了する。[補足:本来は、この程度であれば上記のように手でコードを追加するより、Mattise上のプロパティ(下図)で設定を行った方が、手段の統一としては良いのかもしれない]

fest03

2つのチェックボックスの状態をチェックする

先ほどJUnitが成功したJFrameに、チェックボックスをもう1つ追加する(プロジェクト, ソースコード)。

fest11

ここで、先ほど成功したはずのテストケースを再度実行すると、失敗してしまう。

Found more than one component using matcher org.fest.swing.core.TypeMatcher[type=javax.swing.JCheckBox, requireShowing=true].

チェックボックスを探したところ、複数のコンポーネントがヒットしたのでどちらか特定できなくなっている。

これに対するfest側が想定している通常の対応は、コンポーネントに名前を付けておき、その名前で識別しよう、というものだ。

メインのコードで

    public NewJFrame() {
        initComponents();
        jCheckBox1.setSelected(true); // 追加
        jCheckBox1.setName("1個目"); // コンポーネントに名前を設定
        jCheckBox2.setName("2nd");
    }

setNameメソッドで名前をセットしておけば、テストコード上ではその名前で識別できるようになる。

    @Test
    public void testCheckBox() {
        window.checkBox("1個目").requireSelected(); // 引数に名前を指定
        window.checkBox("2nd").requireNotSelected();
    }

ただ、あらかじめこのことを知っていれば良いのだが、通常、名前をつけるようなことはあるのだろうか。私は今回初めてnameという属性があるのを知ったのだが...

nameの設定を行っていない場合、表示されている文字列(setTextで設定した文字列)で2つのチェックボックスを識別できれば良いのでは、と考えた。

今まで使用してきたcheckboxメソッドは、Javadocを見るとContainerFixtureで実装されていることが分かる。また、このメソッドはnameを引数にとるものの他、GenericTypeMatcherを引数にとるものがある。今回はこちらを用いる(ソースコード)。

    @Test
    public void testCheckBox() {
        GenericTypeMatcher<JCheckBox> matcher1 =
                new GenericTypeMatcher<JCheckBox>(JCheckBox.class) {

                    @Override
                    protected boolean isMatching(JCheckBox component) {
                        return "チェックボックス".equals(component.getText()) ? true : false;
                    }
                };
        GenericTypeMatcher<JCheckBox> matcher2 =
                new GenericTypeMatcher<JCheckBox>(JCheckBox.class) {

                    @Override
                    protected boolean isMatching(JCheckBox component) {
                        return "2nd check".equals(component.getText()) ? true : false;
                    }
                };

                window.checkBox(matcher1).requireSelected();
                window.checkBox(matcher2).requireNotSelected();
    }

上記のように、isMatchingの中でコンポーネントを識別できるような実装を行うことになる。

コンポーネントごとにmatcherを作る必要があるようなので、かなり面倒な作業になる。festを使用するのであればnameは設定しておくべき、ということなのだろう。

なお、表示文字列で識別する場合、多言語対応しているアプリケーションでは問題が出るであろうことが予想される。(自分で実装しない部分、たとえばOK/キャンセルダイアログのボタン等も実行環境によって文字列が自動で切り替わる。このようなものについても検討が必要かもしれないが、未検証。)

 

参考:

« NetBeansでcoverage reportを行う | トップページ | NicoBrowser(nico browser) - 403返却時への対応 »

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/18902/44065130

この記事へのトラックバック一覧です: FESTを使用してJava GUI (Swing)のテストを実行してみる:

» FEST-Swing1.2a3の新機能で気付いたこと [雪羽の発火後忘失]
今まで1.1を使用しており、今回初めて1.2a3を利用してみているのだが、コンポーネントのtextでコンポーネントを探すことができるようになっているようだ。 従来より、FEST-Swingはコンポーネントをnameにより識別する方針を採っている。 例えば”適用”ボタンがあったとすると、このボタンのnameは”適用”ではなく、別途設定する必要がある。ちなみに、このときの”適用”は何かというとtext... [続きを読む]

» FEST-Swingを利用する(8) 視覚の威力 [雪羽の発火後忘失]
期間があいた割にネタが用意できていないので、今回は総集編、回想回です… 過去FEST-Swingに関して記述したエントリを以下に示します。 FESTを使用してJava GUI (Swing)のテストを実行してみる FEST-Swingの紹介。FEST-Swingの機能概要を、簡単なサンプルをもとにして実行してみます。 NetBeansでFEST-Swingを利用する その1 インストール 実際にF... [続きを読む]

« NetBeansでcoverage reportを行う | トップページ | NicoBrowser(nico browser) - 403返却時への対応 »

other sites

  • follow us in feedly
  • github
  • stackoverflow

ソフトウェアエンジニアとして影響を受けた書籍

  • Christain Bauer: HIBERNATE イン アクション

    Christain Bauer: HIBERNATE イン アクション
    理論と実践が双方とも素晴らしい製品であるHibernate。本書はそのプロダクトを書名に冠していますが、Hibernateを使うつもりがなく、ORマッピングの解説書として読むにしても十分な良書です。Second EditionとしてJava Persistence With Hibernateという書籍も出版されていますが、残念ながら現在のところ 和訳はされていません。-インアクションは2.xの、Java Persistence-は3.1の頃のものなので、最新版とはちょっと違うところもあることに注意。 (★★★★★)

  • アンドリュー・S・タネンバウム: 分散システム 原理とパラダイム 第2版

    アンドリュー・S・タネンバウム: 分散システム 原理とパラダイム 第2版
    クライアント/サーバシステムを構築する上で必要となる知識が総論されてます。Web技術者も、フレームワーク部分を開発するのであれば必読。 (★★★★★)

  • Joel Spolsky∥著: ジョエル・オン・ソフトウェア

    Joel Spolsky∥著: ジョエル・オン・ソフトウェア
    前述の書籍「ソフトウエア開発プロフェッショナル」をより砕いたもの、という感じでしょうか。 前書きではプログラマでなくSE向けの本のように書かれているが、プログラマが読んでも面白い本であると思われます。 SEになった新人(あるいはそういう会社に入る/入りたての人)にとっては、これからどういったことが仕事を遂行していく上で起こりえるのか、どのように考えて行なっていけばいいのか決定する助けになると思います。 元は″Joel on Software″というブログの記事で、web上でも一部日本語で読めます。 http://japanese.joelonsoftware.com/ (★★★)

  • ドナルド・C・ゴース,ジェラルド・M・ワインバーグ: ライト、ついてますか

    ドナルド・C・ゴース,ジェラルド・M・ワインバーグ: ライト、ついてますか
    問題解決(一昔前のの流行語で言うところの『ソリューション』)能力は、システムエンジニアのスキルとして備えるべきもののうちのひとつです。しかし、これは難しい。学校で出されるテストと違い、唯一の、(問題提出者が想定している)解を求めるだけが「問題解決」では無いからです。そもそも、何が問題なのか、それは本当に問題なのか、それは本当に解決すべき問題なのか、その問題解決方法は正しいのか、などを解決しなければ、「その解は正しいのか」に辿りつくことができません。この本の最も良いところのひとつは、本があまり厚くないこと。すぐに読めるし、何回も読み返す気になるでしょう。 (★★★★★)

  • スティーブ・マコネル: ソフトウエア開発プロフェッショナル

    スティーブ・マコネル: ソフトウエア開発プロフェッショナル
    コードコンプリートで有名なスティーブマコネルの著書。新人SEに読んで欲しい。個人として業界の中でどうあるべきか、組織としてどうあるべきか、SEのプロ意識とは?SEの心構え概論、といったところでしょうか。また、業界における資格の重要性についても説かれています。この業界では資格が特に軽んじられる傾向がありますが、この傾向はどんな弊害をもたらすのか、将来的にこの業界は資格に対してどのような姿勢で臨んでいくべきなのか。日経BP社では(他の出版社もだが)最近、似たような類いのあまり面白くない書籍が乱出版されていますが、この本は別格だと思うので安心して購入して欲しいと思います。 (★★★★★)

無料ブログはココログ