2012-08-10 69 views
1

我正在大型網站上工作,每週至少更新一次(新功能添加,內容更改等)。然而,如果在目前,測試從來沒有像應該那樣徹底。所以一週前我開始研究自動化測試和硒。使用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中所有的專家,所以不要被不好的形式被推遲(如主要方法的長時間拋出聲明)。

現在,我的問題:

  1. 是我的整個概念,我上面制定,好嗎?那就是:讓一個主應用程序運行所有測試以及一個可以隨時添加/刪除測試的隊列。或者還有其他關於這方面最佳實踐的方法嗎?你能想到什麼其他概念/架構?
  2. 有沒有一種方法可以用selenium ide創建測試,導出它們,並且它們可以立即與主應用程序一起工作,而無需進行任何修改?
  3. 好吧,因爲我發佈的代碼,你可能想瘋了,批評,;-)我打開各種建議。
  4. 是否有可能與硒運行不同版本的IE瀏覽器(或任何瀏覽器,就此而言)?它可能只是運行我已經安裝的瀏覽器版本。所以如果我想測試一個瀏覽器的不同版本,我必須調用遠程機器,這意味着硒電網?我真的只是猜測,現在:)
+1

更好地使用像Hudson/Jenkins這樣的持續集成服務器,這樣提供java文件的人就可以上傳它們,並且你可以上傳java文件名,以便它們能夠被它們給出。 – 2012-08-10 13:38:45

回答

0

我會用TestNG編排測試,而不是一個主要方法,它允許參數設置爲以前的答案州,如果你使用硒GRID 2,你可以運行並行和在許多不同的瀏覽器/操作系統版本組合的測試

我也會考慮使用PageObjects & PageFactories建模測試用例,這將進一步幫助測試封裝和健壯。

-1
  1. 你的概念是好的,但你如何實現它的方式。

  2. 你的標準之一是一個不斷變化的網頁。對於這個Selenium IDE是沒用的。你會經常更新你的測試用例。

  3. 錯誤地假設如何編寫測試用例。

  4. 由於測試用例在普通機器上運行,因此對於不同版本的瀏覽器類型,沒有簡單的方法運行。每個版本都需要不同的機器。

所以我對這個解決辦法是

  1. 正如前面回答,TestNG的驅動測試用例執行。它允許分組和設置/拆卸方法。
  2. 如前所述,使用每個要使用的元素的函數爲每個網頁創建一個類。還要創建助手類來組織你的流程。這會極大地降低維護時間。它只需要在幾個類中更新,而不是每個測試用例。

  3. 對於調度和概述,我將運行詹金斯的測試。這使您可以爲不同類型的操作系統,瀏覽器等設置作業。 Jenkins支持在從屬設備上運行測試用例。所以每個奴隸可以有不同版本的每種類型的瀏覽器,你想測試。

  4. 對於真正的高級我會動態地創建虛擬機作爲奴隸使用VMWare或KVM。這將允許您在每次開始測試運行時設置所需的服務器類型。您可以爲每種類型的操作系統設置創建映像,並在Jenkins中啓動作業時通過選項決定從哪個映像創建虛擬機。