我正在大型網站上工作,每週至少更新一次(新功能添加,內容更改等)。然而,如果在目前,測試從來沒有像應該那樣徹底。所以一週前我開始研究自動化測試和硒。使用Selenium設置自動化測試框架
我讀過,如果你想要做正確的話,不要單純依靠硒元素。編程你的測試提供了更多的選擇。我對第三方PHP綁定感到不舒服,所以我很快跳過了使用java編程測試。
現在我的問題圍繞着如何巧妙地設置將要運行測試的系統。我的想法是以下幾點:
- 測試將/應該完全自主
- 不過我想有某種主要應用循環所有這些測試和運行它們陸續
- 主要應用一個應該全天候運行或者至少由cronjob或其他東西定期開始運行
- 測試應儘可能在多個瀏覽器(或模擬客戶端)中運行。到目前爲止,我通過各自的WebDrivers使用FF,IE和Chrome。
- 我想命名一些文件夾並收集該文件夾中的所有測試。那麼主應用程序就會採取該文件夾中的任何內容並運行它。那麼每個人都會創建他們的測試並將它們放在該文件夾中,這樣他們就會被添加到隊列中
- 有一種方法可以用selenium ide創建測試,導出它們並立即與我的main應用程序(即它們無需任何修改即可正確運行)。好吧,我知道我說過,硒的缺點很少,但我覺得這是一些簡單測試的好開始。另外,沒有任何編程知識的人仍然可以使用它。就像現在一樣,我將用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創建測試,導出它們,並且它們可以立即與主應用程序一起工作,而無需進行任何修改?
- 好吧,因爲我發佈的代碼,你可能想瘋了,批評,;-)我打開各種建議。
- 是否有可能與硒運行不同版本的IE瀏覽器(或任何瀏覽器,就此而言)?它可能只是運行我已經安裝的瀏覽器版本。所以如果我想測試一個瀏覽器的不同版本,我必須調用遠程機器,這意味着硒電網?我真的只是猜測,現在:)
更好地使用像Hudson/Jenkins這樣的持續集成服務器,這樣提供java文件的人就可以上傳它們,並且你可以上傳java文件名,以便它們能夠被它們給出。 – 2012-08-10 13:38:45