Fest + JRuby + Cucumber で Swing のテストをする - 序

本人が行き当たり場当たりな性格なので、予告なく内容が変わることがあります(特にコード)

動機

  • Swing のテストをやることになった
  • どうせなら自動化
  • Cucumber 使えないかな
    • JRuby を使えばいけるかな?
    • UI はどうやって叩くんだろう
      • Cucumber + Swinger でできるらしい
      • Swinger 機能がちょっと少ない?
      • 他にないかな
      • Fest ってのがあるらしいぞ
  • Fest + JRuby + Cucumber + Ant でCIだ

材料

インストール

JDK/Juby/Ant インストール

適当で。

Cucumber インストール
> jgem install cucumber
Fest インストール
  • fest-assert-1.4.jar
  • fest-mocks-1.0.jar
  • fest-swing-1.2.jar
  • fest-util-1.1.2.jar
  • fest-util-1.1.2.jar

を適当なディレクトリに置く。

Step01 - 最初の一歩

ディレクトリを掘る
automated-ui-testing-java
  + src
      + local
         + myproject
             + ticket_viewer
  + test-feature
      + step_definitions
      + support
テストコードを書く
# language: ja
フィーチャ: チケット画面を出すところまで
  シナリオ: No1. プロジェクト一覧を取得する
    前提   "メイン画面" が表示されていること
    もし   "URL" に "http://www.r-labs.org/projects.xml" を入力する
    かつ   "ctlFetchProjectList" ボタンをクリックする
    ならば "プロジェクト一覧" に以下が表示されていること:
      |r-labs        |
      |Hudson        |
      |IssueExtension|
      |WikiExtension |
おもむろにテストを実行する

Windowsのコンソールに出すと文字化けするので、仕方なく HTML に出力する
結果は cucumber.html に出力される。

> cucumber test-feature --format html -out cucumber.html
> cucumber.html

当然のごとくテストは動かないので、ここからイロイロやるわけですな。

Step02 - まずは画面を表示する

製品コードを書く

メイン画面とチケット一覧画面を作る。
適当にコントロールとボタンを配置する。

automated-ui-testing-java
  + src
      + local
         + myproject
             + ticket_viewer
                 + MainFrame.java
                 + TicketListFrame.java 
fest を使って画面を表示する

fest FrameFixture を作って画面を表示する。
別にここでテストするわけじゃないので、単に Frame を setVisible すればイイだけではあるが。

テストシナリオの中で起動しても良いんだけども、at_exit フックを使いたかったので
テストシナリオの前に画面を表示する方向で。
support/env.rb に書けば、事前に実行してくれるんじゃないかな?

support/env.rb

#=======================================================================================
# Java のライブラリを使えるようにする
#=======================================================================================
include java

#=======================================================================================
# festの名前空間を定義
#=======================================================================================
# クラスパスを通して
Dir["#{File.dirname(__FILE__)}/../../lib/fest\*.jar"].each { |jar| require jar }
# 名前空間を定義する
module FestFeature
  include_package 'org.fest.swing.fixture'
end

#=======================================================================================
# 製品の名前空間を定義
#=======================================================================================
# こっちも同様に
require "#{File.dirname(__FILE__)}/../../dist/AutomatedUITestingJava.jar"
module MyPrjTicketViewer
  include_package 'local.myproject.ticket_viewer'
end

#=======================================================================================
# 画面を作って、表示する
#=======================================================================================
# Fixture の詳細は http://easytesting.org/swing/apidocs/index.html 辺を参照のこと
mainFrame = FestFeature::FrameFixture.new MyPrjTicketViewer::MainFrame.new
mainFrame.show

#=======================================================================================
# Cucumber のテストが終わった後にやること
#=======================================================================================
at_exit do
  # fest が使った資源をきれいさっぱり掃除する
  mainFrame.cleanUp
end
実行する

画面が一瞬表示されて、終了したらOK。
何もしてないので、当然テストは成功しない。