テストの実践
Seleniumプロジェクトからのテストに関するいくつかのガイドラインと推奨事項
「ベストプラクティス」に関するメモ:このドキュメントでは、“ベストプラクティス"というフレーズを意図的に避けています。
すべての状況に有効なアプローチはありません。
“ガイドラインとレコメンデーション"というアイデアを好みます。
これらを一通り読み、特定の環境でどのアプローチが効果的かを慎重に決定することをお勧めします。
機能テストは、多くの理由で適切に行うのが困難です。
まるでアプリケーションの状態、複雑さ、および依存関係が、テストを十分に難しくしないと思えるほど、ブラウザ(特にクロスブラウザの非互換性)を扱うのは、良いテストの作成を難しくします。
Seleniumは、機能的なユーザーインタラクションを簡単にするツールを提供しますが、適切に設計されたテストスイートの作成には役立ちません。
この章では、機能的なWebページの自動化に取り組む方法に関するアドバイス、ガイドライン、および推奨事項を提供します。
この章では、長年にわたって成功を収めてきたSeleniumの多くのユーザーの間で人気のあるソフトウェア設計パターンを記録します。
1 - デザインパターンと開発戦略
(以前の場所: http://github.com/SeleniumHQ/selenium/wiki/Bot-Style-Tests)
概要
時間の経過とともに、プロジェクトは多数のテストが積み上がる傾向があります。
テストの総数が増えると、コードベースに変更を加えることが難しくなります。
アプリケーションが正常に機能していても、1回の"単純な"変更で多数のテストが失敗する可能性があります。
これらの問題が避けられない場合もありますが、問題が発生した場合は、できるだけ早く稼働を再開する必要があります。
次のデザインパターンと戦略は、テストの作成と保守を容易にするためにWebDriverで以前に使用されています。
それらもあなたにとって役に立つかもしれません。
DomainDrivenDesign:アプリのエンドユーザーの言語でテストを表現します。
PageObjects:WebアプリのUIの単純な抽象化
LoadableComponent:PageObjectsをコンポーネントとしてモデリングします。
BotStyleTests:PageObjectsが推奨するオブジェクトベースのアプローチではなく、コマンドベースのアプローチを使用してテストを自動化します。
ロード可能なコンポーネント
それは何ですか?
LoadableComponentは、PageObjectsの作成の負担を軽減することを目的としたベースクラスです。
これは、ページがロードされることを保証する標準的な方法を提供し、ページのロードの失敗のデバッグを容易にするフックを提供することによってこれを行います。
これを使用して、テストの定型コードの量を減らすことができます。これにより、テストの保守が面倒になります。
現在、Selenium 2の一部として出荷されるJavaの実装がありますが、使用されるアプローチは、どの言語でも実装できるほど単純です。
簡単な使用方法
モデル化するUIの例として、新しいissueのページをご覧ください。
テスト作成者の観点から、これは新しい問題を提出できるサービスを提供します。
基本的なページオブジェクトは次のようになります。
package com.example.webdriver;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
public class EditIssue {
private final WebDriver driver;
public EditIssue(WebDriver driver) {
this.driver = driver;
}
public void setTitle(String title) {
WebElement field = driver.findElement(By.id("issue_title")));
clearAndType(field, title);
}
public void setBody(String body) {
WebElement field = driver.findElement(By.id("issue_body"));
clearAndType(field, body);
}
public void setHowToReproduce(String howToReproduce) {
WebElement field = driver.findElement(By.id("issue_form_repro-command"));
clearAndType(field, howToReproduce);
}
public void setLogOutput(String logOutput) {
WebElement field = driver.findElement(By.id("issue_form_logs"));
clearAndType(field, logOutput);
}
public void setOperatingSystem(String operatingSystem) {
WebElement field = driver.findElement(By.id("issue_form_operating-system"));
clearAndType(field, operatingSystem);
}
public void setSeleniumVersion(String seleniumVersion) {
WebElement field = driver.findElement(By.id("issue_form_selenium-version"));
clearAndType(field, logOutput);
}
public void setBrowserVersion(String browserVersion) {
WebElement field = driver.findElement(By.id("issue_form_browser-versions"));
clearAndType(field, browserVersion);
}
public void setDriverVersion(String driverVersion) {
WebElement field = driver.findElement(By.id("issue_form_browser-driver-versions"));
clearAndType(field, driverVersion);
}
public void setUsingGrid(String usingGrid) {
WebElement field = driver.findElement(By.id("issue_form_selenium-grid-version"));
clearAndType(field, usingGrid);
}
public IssueList submit