SeleniumIDEでさくさくアクセプタンステスト

ユーザー操作をシミュレートしてテストをしたいというニーズはあって、それに使えるツールとしてSeleniumIDEがあります。以下では、SeleniumIDEを使って、簡単にアクセプタンステストをする方法を説明します。

  • SeleniumIDEでテストケース記録
    • t/acceptance/ にTestCaseのHTMLを保存
  • TestSuiteの生成
    • gen_acceptance_testsuite.pl
  • 実行
    • ./acceptance.sh

gen_acceptance_testsuite.pl

#!/usr/bin/env perl
use strict;
use warnings;

use String::TT qw(tt strip);
use Path::Class qw(dir file);

my $TESTCASE_DIR   = 't/acceptance';
my $TESTSUITE_FILE = 't/acceptance.html';

main();

sub main {
    my $testcases = collect_testcases($TESTCASE_DIR);
    generate_test_suite( $testcases, $TESTSUITE_FILE );
}

sub collect_testcases {
    my $dir            = shift;
    my $testcase_files = [];
    dir($dir)->recurse(
        callback => sub {
            my $file = shift;
            return unless -f $file;
            push @{$testcase_files}, $file;
        }
    );
    return $testcase_files;
}

sub generate_test_suite {
    my $testcases           = shift;
    my $test_suite_file     = shift;
    my $test_suite_template = strip tt q{
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <meta content="text/html; charset=UTF-8" http-equiv="content-type" />
  <title>Test Suite</title>
</head>
<body>
<table id="suiteTable" cellpadding="1" cellspacing="1" border="1" class="selenium"><tbody>
<tr><td><b>Test Suite</b></td></tr>
[% FOREACH t = testcases %]
<tr><td><a href="[% t.absolute %]">[% t.basename %]</a></td></tr>
[% END %]
</tbody></table>
</body>
</html>
};

    my $fh = file($test_suite_file)->openw;
    $fh->printflush($test_suite_template);
    $fh->close;
}

acceptance.sh
適宜変数は書き換えてください

#!/bin/sh
BASEURL=http://www.google.co.jp/
TEST_DIR=file:///Users/dann/workdir/cattest/MyApp/t
TESTSUITE=$TEST_DIR/acceptance.html
RESULT=$TEST_DIR/acceptance_result.html
firefox-bin -chrome "chrome://selenium-ide-testrunner/content/selenium/TestRunner.html?baseURL=$BASEURL&test=$TESTSUITE&auto=true&resultsUrl=$RESULT"

ブラウザベースのアクセプタンステストはEnd to Endのテストとして絶対に必要で、SeleniumIDEはそれにはとても向いているツールですね。

ただ、これだけだとContinuous Integration用には使えないので(自動化できないという点で)、SeleniumRCと併用して使うのがいいですね。

ただ、SeleniumRCは不安定なので、Continuous Integration用に使うのはいまいちなので、その辺はMechanize系との使い分けが必要なわけですが、それについてはまた別エントリで。

# 個人がサービスのアクセプタンステスト作るには、これくらいテストコストが低くないとダメなんじゃないかとは思ってます。アプリケーション規模とテストのバランスについても、エントリに書きたいなと。