私は、少なくとも週に 1 回更新される大規模な Web サイト (新機能の追加、コンテンツの変更など) に取り組んでいます。ただし、テストがあったとしても、本来あるべきほど徹底したものではありません。だから一週間前、私は自動化されたテストとセレンを調べ始めました。
正しくやりたいのなら、セレンideだけに頼らないでください。テストをプログラミングすると、より多くのオプションが提供されます。私はサードパーティの PHP バインディングにまったく慣れていなかったので、すぐにテストのプログラミングに Java を使用することにしました。
さて、私の質問は、テストを実行するシステムを巧みにセットアップする方法に関するものです。私の考えは次のとおりでした:
- テストは完全に自律的になります/すべきです
- それにもかかわらず、これらすべてのテストをループして次々と実行する何らかのメインアプリケーションが必要です
- メイン アプリケーションは 24 時間年中無休で実行するか、少なくとも cronjob などで定期的に開始する必要があります
- テストは、できるだけ多くのブラウザー (またはシミュレートされたクライアント??) で実行する必要があります。これまでのところ、それぞれの WebDriver を介して FF、IE、およびクロムを使用しています。
- いくつかのフォルダーに名前を付けて、そのフォルダー内のすべてのテストを収集したいと思います。メインアプリケーションは、そのフォルダーにあるものをすべて取得して実行します。その後、誰もがテストを作成してそのフォルダーに入れるだけで、キューに追加されます
- Selenium ide を使用してテストを作成し、それらをエクスポートして、すぐにメイン アプリケーションで動作させる方法があると便利です (つまり、変更を加えることなく正しく実行されます)。わかりました、私が言ったことは知っています、セレンideはお勧めできませんが、いくつかの簡単なテストの良いスタートだと思います. また、プログラミングの知識がなくても使用できます。今のところ、selenium ide で作成したテストを「Java / JUnit 4 / WebDriver」としてエクスポートし、少しコードを変更しています (WebDriver オブジェクトをパラメーターとして渡します)。
私の「メインアプリケーション」のコードは次のとおりです。
import java.io.File;
import java.io.FilenameFilter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
public class SeleniumTest {
public static void main(String[] args) throws
ClassNotFoundException, InstantiationException,IllegalAccessException,
NoSuchMethodException, SecurityException, IllegalArgumentException,
InvocationTargetException {
String[] drivers = {
"org.openqa.selenium.firefox.FirefoxDriver",
"org.openqa.selenium.ie.InternetExplorerDriver",
"org.openqa.selenium.chrome.ChromeDriver"
};
Class params[] = {WebDriver.class};
String testFolderName = "lookhere";
while (true) {
//get all .java files from some folder. those will be the tests to run
File testFolder = new File(testFolderName);
FilenameFilter filter = new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".java");
}
};
String[] tests = testFolder.list(filter);
if (tests == null) {
System.exit(0);
}
for(int i=0; i<drivers.length; i++) {
//loop through different drivers, instantiate them
Class webDriverClass = Class.forName(drivers[i]);
WebDriver driver = (WebDriver) webDriverClass.newInstance();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
for (int j=0; j<tests.length; j++) {
//loop through tests, instantiate them
String currentTestName = tests[j].replace(".java", "");
Class testClass = Class.forName(currentTestName);
Object test = testClass.newInstance();
Method methods[] = testClass.getDeclaredMethods();
Method fn;
//run every method that starts with "test" (usually just one)
//also run setUp, passing the driver object
for(int k=0; k<methods.length; k++) {
if (methods[k].getName().startsWith("test")) {
fn = testClass.getDeclaredMethod(methods[k].getName());
fn.invoke(test);
} else if(methods[k].getName().equals("setUp")) {
fn = testClass.getDeclaredMethod("setUp", params);
fn.invoke(test, driver);
}
}
}
driver.quit();
}
}
}
}
ご覧のとおり、私は Java の専門家ではありません。したがって、(メイン メソッドのロング スロー宣言のような) 悪い形で先延ばしにしないでください。
さて、私の質問のために:
- 私が上で定式化した私の全体のコンセプトは大丈夫ですか?つまり、メイン アプリケーションですべてのテストを実行し、その場でテストを追加/削除できるキューを作成します。または、これに関するベストプラクティスの他の方法はありますか? 他にどのようなコンセプト/アーキテクチャを思いつきますか?
- Selenium ide でテストを作成し、それらをエクスポートして、変更を加えることなくすぐにメイン アプリケーションで動作させる方法はありますか?
- 私がコードを投稿したので、あなたはおそらく夢中になり、それを批判したいと思うでしょう;-)私はあらゆる種類の提案を受け入れます。
- Selenium を使用して、異なるバージョンの IE (または任意のブラウザー) を実行することは可能ですか? おそらく、私がインストールしたブラウザのバージョンを実行するだけです。1 つのブラウザの異なるバージョンをテストしたい場合は、リモート マシンを呼び出す必要があります。これは、セレン グリッドを意味しますか? 私は本当に今ちょうど推測しています:)