テストの実行

echealth edited this page Sep 13, 2010 · 4 revisions

Windmill 日本語ドキュメント

この章では記述/記録したテスト内容の実行とプレイバックの方法を解説します。

  • 注意: localhost での Safari を使ったテストは未サポートで Python トレースバックが表示されます。

テストの実行とロード

Windmill においてテストの実行とロードは明確に区別されています。この区別によってテストのデバッグや編集作業がやり易くなっています。

テストの実行とは、テストのファイルが IDE に送られてきたら即座にその内容を実行することを意味します。一方テストのロードとは、テスト内容がサーバーや IDE に読み込まれるだけで、その内容は実行しない状態です。これがテスト内容を読み込んで編集したいときに役立つわけです。

Windmill プロジェクトで開発、メンテナンスされているすべてのテストオーサリング用ライブラリで、テストの実行とロードは区別されています。Windmill のオープンなアーキテクチャは、サードパーティのライブラリが同様に実行とロードを区別して実装することを可能にしており、またそれを推奨しています。

コマンドラインからの Python テストの実行

Windmill は起動の際、テストのオプションを指定できるようになっています。オプションによって特定のテストだけを実行することが可能であり、ファイルまたはディレクトリを指定します(ディレクトリを指定する場合は Python のモジュールとなっている必要があります。詳細は後述します)。


windmill firefox test=mytest.py

テストをロードする場合は次のようにします。


windmill firefox loadtest=mytest.py

これらのオプションはディレクトリを指定することも可能で、その場合ディレクトリは Python モジュールとして構成されていなければなりません。

シェルからの Python テストの実行とロード

以下のメソッドは単一のファイルまたはディレクトリを引数に受け取り、その内容を実行するものです。ディレクトリの指定は絶対パス、相対パスの何れでもかまいません。

実行


run_test('mytest.py')

絶対パス指定による実行

run_test('/path/to/test/dir')

ロード

load_test('mytest.py')

絶対パス指定によるロード

load_test('/path/to/test/dir')

コマンドライン

テスト実行の例: windmill firefox test=/path/to/tests/ http://www.example.com

テストロードの例: windmill firefox loadtest=/path/to/tests/ http://www.example.com
テストファイルの構成

テストに当たり複数のディレクトリ/モジュールを使用する場合、それらのディレクトリ/モジュールと一緒に配置しなければなりません。またそれらのディレクトリには __.py という名前のファイルを配置しておく必要があります。このファイル自体は空のファイルでかまいません。


touch __init__.py

Python テストでの setup/teardown およびテストの依存管理

setup/teardown の処理は functest(nose からテストを起動する場合は nose)が行います。この項では簡単な setup/teardown と依存性の定義について学びます。

次のようなシナリオを想定しましょう。あなたはサイトの3ページ(page1.html, page2.html, page3.html)に跨がる30個のテストを実行しようとしています。2ページ目、3ページ目はログインを必要としますが、1ページ目はログインを必要としません。この場合、テストのディレクトリ階層は次のようになります。


test_mysite/
           /__init__.py ( Defines any overall setup/teardown for the entire test run)
           /test_page1/
           /test_page1/__init__.py
           /test_page1/test1.py .... test10.py
           /test_logged_in/
           /test_logged_in/__init__.py (このファイルにログインを行う setup_module() とログアウトを行う teardown_module() を定義)
           /test_logged_in/test_page2/
           /test_logged_in/test_page2/__init__.py
           /test_logged_in/test_page2/test11.py ... test20.py
           /test_logged_in/test_page3/
           /test_logged_in/test_page3/__init__.py
           /test_logged_in/test_page3/test21.py ... test30.py

上記はモジュールの階層をテストの依存関係として定義した簡単な例です。

たとえば test11.py を実行/ロードする場合、コレクターはモジュールの階層を辿り、そのルートを探し出します。そして test11.py を実行する前に、その上位階層にあるすべての setup_module を実行します。

__.py の詳細 ::

このファイルは setup/teardown 機能のコアとなるものであり、その動作の仕組みをよく理解しておく必要があります。

例:

 
def setup_module(module):
    client = [[WindmillTestClient]](__name__)

    client.waits.forElement(id=u'email', timeout=u'30000')
    client.click(id=u'email')
    client.type(text=functest.registry['email'], id=u'email')
    client.waits.forElement(id=u'pass', timeout=u'30000')  
    client.type(text=functest.registry['password'], id=u'pass')
    client.click(value=u"Login")
    client.waits.for[[PageLoad]](timeout=u'60000') 


def teardown_module(module):
    client = [[WindmillTestClient]](__name__)
    client.waits.forElement(link=u'Home', timeout=u'100000')
    client.click(link=u'Home')
    client.waits.for[[PageLoad]](timeout=u'100000')
    client.waits.forElement(timeout=u'100000', id=u'q')
    client.waits.forElement(link=u'Logout', timeout=u'100000')
    client.click(link=u'Logout')

Nose からのテスト実行

バージョン 1.1 から Windmill には nose プラグインが同梱されています。次のように実行すると nose 用の Windmill コマンドが表示されます。


nosetests --help

nose からテストを実行する方法は functest の場合とよく似ています。ベースとなるテストモジュールの冒頭に次の import 文を記述してください。


from windmill.authoring import setup_module, teardown_module 

コマンドラインから次のように実行すると、nose を使ったテストが実行されるようになります。


nosetests --wmbrowser firefox --wmtesturl http://www.google.com

JavaScript テストの実行

JavaScript テストを実行する場合、以下の何れかの方法を使います。

シェルから実行: run_js_tests('dir/to/js/tests')

コマンドラインから実行: windmill firefox jsdir=./js/test/dir