前回の いつまでもメンテナンス出来るシステムを作るには で長期間使えるシステムを作るには End to End テスト が重要だと書きましたが End to End テストの情報はまだまだ少ないと思うので、今回から数回 End to End テスト に書きたいと思います。
著者は偶然か、いろいろなサービスにEnd to End テストを書いています。
End to End テスト とは
End to End テストとは、システムをユーザーがブラウザーやアプリを操作し結果が得られるかを確認するテストを、人が操作して確認するのではなく自動的に行うテストです。基本的には操作手順や結果の確認はプログラムまたは、独自の言語で記述します。
テスト環境
テストツール/テスト環境の構築は、単体テスト(Unit Test, RSpec等)に比べると大がかりになります。
End to End テストを行うには
- 実際にサービスの動くサーバーを準備し、ブラウザーを制御する、またはブラウザー同等のソフトを使ってテストを行う
- 上の画像のように、サーバーやブラウザーに相当する部分をツールで置き換えサーバーを起動せずにテストを行う
このように、テスト環境を構築するのに手間がかかります。また End to End テスト用のツールはいくつもあるのですが決定版というのがなく、 いろいろなツールが登場しては消えていきました。
唯一 Selenium は2004年から現在も使われているツールです、ただしAPIが大きく変わったりと変化しています。
テスト記述用言語
ブラウザー等の操作や結果の確認は、何らなの言語で記述します。大きく分類すると
- Ruby, JavaScriptなどの通常のプログラミング言語(+テスト用API)
- 自然言語に近いGherkin記法、とブラウザー等の操作を結ぶログラミング言語(CucumberではStepsと呼ばれています)
- 独自の言語
- ノンプログラミング
1,2が主流ではないかと思います。 4.のノンプログラミングは独自のWebベースのGUIを使いテスト手順を作っていきます、またブラウザーでの操作をキャプチャーする機能がありプログラマーでない人にもテストを作れるメリットがあります。
以前、ノンプログラミングのツール Selenium IDE を利用した事がありましたが、テストの規模が大きくなるとテストのメンテナンスが大変になり、テスト全体を Selenium + RSpecに書き換えました。
ここで重要な事があります、単体テスト(Unit Test, RSpec等)はサービスやアプリを記述するプログラミング言語と同じ言語で書きますが、End to End テストの場合は 必ずしもサービスやアプリを記述するプログラミング言語と同じ言語を使う必要がないことです。
テスト環境の 1. の場合は基本的にはサービスやアプリとテストは独立しているので、テストに最適なツールがサービスやアプリとテストとは別の言語でも使う事が可能です。
End to End テスト用の有名なツール Cucumber は、最初はRubyで作られツールでしたが、その素晴らしい特徴からJavaやPHP等で開発している人達の間でも使われていました。
つづく・・・