2012-08-10 51 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中启动作业时通过选项决定从哪个映像创建虚拟机。