スポンサーリンク

IE AutoTester で,UIの回帰テストを完全自動化

テスト仕様を書けば,仕様書自身がテスト(ブラウザ操作)を自動でやってくれる。

Excelのシート上に,下記のように記述する。

IE起動		
開く	http://www.yahoo.co.jp/	
		
存在判定	srchtxt	
存在判定	srchbtn	
		
入力	srchtxt	hogeraccho
クリックして待機	srchbtn	

 が,それだけではない。

  • テスト仕様書に,試験の結果も自動で記録してくれる。
  • Seleniumで可能な通常のDOM操作に加えて,
    • マウスのドラッグドロップや,
    • ファイルのアップロード・ダウンロードといった,込み入ったUIのテストも自動化できる。
  • クロスドメインでテストできる。(テスト対象のサーバ上に,テスト用のファイル不要)

「Excelでテスト仕様書を書く」というのはExceleniumと同じやり方だが,上記のようにSeleniumで不可能だった点を補っている。


それが,今回紹介する IE AutoTester というツール。


動作キャプチャ:



  • Excelのシートの左側で,操作のステップを書く。
  • すると右側で,テスト仕様書としての文章がリアルタイムで生成される。Exceleniumと同じ。


ここで「全シートを実行」のボタンを押すと,シートに書いてある通り,ブラウザが自動的に動く。



  • マウスのドラッグドロップを自動でテストしている風景。



  • テストしながら,「実行ログ」の欄に結果が書き込まれてゆく。
  • OKのセルは緑に,NGは赤になる。
  • NG数はシート上部で集計される。

テストだけでなく,ブラウザの気軽な自動操作にも利用できるだろう。

IE AutoTester ダウンロード

http://www.name-of-this-site.org/codi...

以下は,サンプルと使い方。



上の圧縮ファイルを解凍すると,「IEAutoTester.xls」というエクセルファイルがある。

これを開く際,Excelの設定が必要なので済ませておく。

(Excel2003の場合)

ツール>マクロ>セキュリティ>信頼できる発行元>Visual Basic プロジェクトへのアクセスを信頼する をオン


(Excel2007の場合)

リボンの「開発」タブ>マクロのセキュリティ>VBAプロジェクトオブジェクトモデルへのアクセスを信頼する


http://support.microsoft.com/kb/28283...

※「プログラミングによるVisual Basicプロジェクトへのアクセスは信頼性に欠けます」というエラーメッセージが出ないようになる。

(1)導入

導入に必要な手順は,3つだけ。


1番目に,
下記サイトから「UWSC」というWindowsスクリプトエンジンをダウンロード。(フリー版)

http://www.uwsc.info/download.html

適当なフォルダに解凍。


2番目に,
先ほどダウンロードしたIEAutoTester.xlsと同じフォルダに同梱されている「IEManipulation.uws」を,uwsc.exeと同じフォルダに設置。


3番目に,
上で入手したエクセルの1ページ目,「初期設定」シートに

  • UWSC.exe設置パス
  • スクリプト設置パス

として,uwsc.exeの存在するパスを記入。



これだけ。


(2)動作

動かしてみよう。

テストケースのシート上で「全シート実行(ログなし)」というボタンを押下。


IEが動き出す。

  • Yahooで検索
  • マウスで並び替え

の2サンプルが実行される。


ログなしなので,結果は記録されない。


(3)ログを記録させよう

今度は,「全シート実行(ログあり)」というボタンを押下。

ブラウザの動作が終わると,「ログを閲覧しますか?」と聞かれる。


「はい」を押すと,テスト仕様書が開く。

右の方を見ると,「OK」と書いてあるはずだ。




簡単な使い方の説明はここまで。

もし,動作にバリエーションがほしかったら・・・

  • 「コマンド一覧」シートの内容を増やす。
  • 「Uコード」コマンドで,UWSCコードを埋め込む。
  • 「JSコード」コマンドで,JavaScriptコマンドを埋め込む。

など,拡張のしようがある。



以下は動作原理。


裏側でやっていること


実行可能なコマンドについては,「コマンド一覧」のシートを見ればわかる。

それらのコマンドの実装は,IEManipulation.uwsの中身を見ればわかる。

ブラウザの自動テスト中に,テスト結果をExcelに記録させる(UWSCでIEを自動操作するライブラリ 1.3)
http://language-and-engineering.hatenablog.jp/entry/20090918/p1


サンプルと同じく,Excel上で下記のようなコマンドを記述したとする。

IE起動		
開く	http://www.yahoo.co.jp/	
		
存在判定	srchtxt	
存在判定	srchbtn	
		
入力	srchtxt	hogeraccho
クリックして待機	srchbtn	


「実行(ログなし)」のボタンを押すと,マクロで下記のようなuwsスクリプトが生成され・・・

// システム名:テスト記述のサンプル
// 機能大区分:基本機能
// ※このファイルを直接編集しないでください。

call .\IEManipulation.uws



// ---------- シート番号:1,機能小区分:01_サーチエンジン操作 ----------

// 検索
_ie = IE.new(); IE.show( _ie )
IE.jump( _ie, "http://www.yahoo.co.jp/")
IE.assert_element_present( _ie, "srchtxt" )
IE.assert_element_present( _ie, "srchbtn" )
IE.type( _ie, "srchtxt", "hogeraccho" )
IE.click_and_wait( _ie, "srchbtn" )


// 終了処理
IE.save_and_close_logfile()
IE.end_manipulation()


そして,このスクリプトがuwsc.exeに渡される。

Excelをいじっている人からは,ひとりでにIEが動き出すように見える。



「実行(ログあり)」のボタンを押した場合はどうか。

下記のようなuwsスクリプトが生成される。

// システム名:テスト記述のサンプル
// 機能大区分:基本機能
// ※このファイルを直接編集しないでください。

call .\IEManipulation.uws
IE.use_log(True)
Sleep(3)
IE.open_xls_as_logfile("D:\temp\excel_ie\IEAutoTester\IEAutoTester.xls")



// ---------- シート番号:1,機能小区分:01_サーチエンジン操作 ----------

// 検索
IE.set_pgcount( "01_サーチエンジン操作", 11, 11 )
_ie = IE.new(); IE.show( _ie )
IE.set_pgcount( "01_サーチエンジン操作", 12, 11 )
IE.jump( _ie, "http://www.yahoo.co.jp/")
IE.set_pgcount( "01_サーチエンジン操作", 14, 11 )
IE.assert_element_present( _ie, "srchtxt" )
IE.set_pgcount( "01_サーチエンジン操作", 15, 11 )
IE.assert_element_present( _ie, "srchbtn" )
IE.set_pgcount( "01_サーチエンジン操作", 17, 11 )
IE.type( _ie, "srchtxt", "hogeraccho" )
IE.set_pgcount( "01_サーチエンジン操作", 18, 11 )
IE.click_and_wait( _ie, "srchbtn" )


// 終了処理
IE.save_and_close_logfile()
IE.end_manipulation()


ログなしの場合と比べて,IE.set_pgcountコマンドの分だけ,行数が増える。

このコマンドは,ログの記録位置を指定している。たとえば

IE.set_pgcount( "01_サーチエンジン操作", 14, 11 )

は,次の検証コマンドのログ記録位置を,テスト仕様書の「01_サーチエンジン操作」というシートの14行11列目に指定している。

だから,続く行にある

IE.assert_element_present( _ie, "srchtxt" )

の結果は,その位置に記録される。


※pgcountというのは「プログラムカウンタ」のつもり。



なお,VBAマクロは IEAutoTesterCore.basに記述されており, 複数のブックから共有できる。

下記の手法を使っている。

Excel VBAのマクロを,複数のブックから利用する方法 (標準モジュールをブックの外部で管理して,共通ライブラリとして読み込み)
http://language-and-engineering.hatenablog.jp/entry/20090731/p1

比較

Selenium / Excelenium と,このIE AutoTester を比較する。



 Selenium/ExceleniumIE AutoTester
Excelに操作手順を書くだけ
テストにJavaScriptを埋め込み可能
クロスドメイン×
テスト結果を直接記録×
ローカル環境(ファイル等)の操作×
要素のドラッグドロップ×
ファイルのアップロード×
ファイルのダウンロード×
クロスブラウザ×(名前の通り,IEのみ)
テストメソッドの充実度△(増やせる)
XPath標準サポート×


本ツールは,Exceleniumの欠点を補う目的で作成された。

  • 基本はExceleniumで
  • 複雑なUIの部分はIE AutoTesterで

それぞれ,回帰テストを組むといいだろう。



また興味深い点として,Exceleniumと本ツールの間で,「Excel仕様書からのスクリプト生成」が一般化された。


両ツールにおいて,異なっているのは

  • コマンドのセット(「コマンド一覧」シートの内容)
  • 生成物を渡して解釈させる行先

だけ。

この形式を流用すれば,開発プロジェクト内のさまざまな手順を自動化できることだろう。


補足:ファイルアップロードのテスト

サンプルの3シート目には,「ファイルアップロード」という内容が載っており,コメントアウトされている。

このシートを動かすためのサンプルアプリケーションを掲載する。

Ruby on Railsで,ファイルをアップロードする簡単なコード:


hoges_controller

require 'kconv'

class HogesController < ApplicationController

  # アップロード画面
  def uptest
  end


  # アップロード実行アクション
  # http://rails.takeda-soft.jp/blog/show/51
  def uptest_exec

    # 送信されてきたファイル
    file_obj = params[ "my_file" ]

    # 保存パスを決定
    @file_name = file_obj.original_filename
    save_path = Dir::pwd + "/public/" + get_platform_filename( @file_name )
      # 現時点でのカレントディレクトリは,/appの上の階層
      #raise Dir::pwd

    # 保存
    file_content = file_obj.read
    File.open( save_path, "wb"){ |f| 
      f.write( file_content ) 
    }

  end


private

  # OSに適したファイル名に変換します。
  # http://ruby-gnome2.sourceforge.jp/ja/hiki.cgi?libglade2-tut-create-src
  def get_platform_filename( filename )

    if RUBY_PLATFORM.include?( "mswin32" )
      # Windowsの場合,ファイル名の文字コードはSJIS
      return Kconv.tosjis( filename )
    else
      # その他はUTF8
      return Kconv.toutf8( filename )
    end
    
  end

end

uptest.rhtml (アップロードするためのフォーム)

<select id="hoge1">
  <option>a</option>
  <option>b</option>
</select>

<br>

<select id="hoge2">
  <option value="1">a</option>
  <option value="2">b</option>
</select>

<br>


<!-- アップロードに関係のある部分 -->
<%= form_tag( { :action => "uptest_exec" }, :multipart => true ) %>

  アップロードしたいファイル:
  <%= file_field_tag( "my_file" ) %>

  <%= submit_tag( "送信", { :id => "commit_button" } ) %>

<%= end_form_tag %>


uptest_exec.rhtml

<%= link_to "ダウンロード",  "/" + @file_name %>

アップしたファイルをRailsのpublicフォルダに直接置いているという,何とも危険な構成だが,まあテスト実行用なのでOKとする。


ファイルアップロード部分のテストを動作させるためには,デスクトップに「a.txt」というファイルを作成しておくこと。

関連する記事:

UWSCのマクロで,IEを起動して自動操作するサンプルコード
http://language-and-engineering.hatenablog.jp/entry/20140204/controlIeBrowser...


JScript / VBScript (WSH)で,IEを自動操作しよう
http://language-and-engineering.hatenablog.jp/entry/20090713/p1


「実行可能ドキュメント」が満たすべき性質 − テスト自動化ツール「Excelenium」で使われている技術や手法
http://language-and-engineering.hatenablog.jp/entry/20101112/p1