Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Selenium建立自动化测试框架_Java_Testing_Architecture_Selenium_Webdriver - Fatal编程技术网

Java 使用Selenium建立自动化测试框架

Java 使用Selenium建立自动化测试框架,java,testing,architecture,selenium,webdriver,Java,Testing,Architecture,Selenium,Webdriver,我在大型网站上工作,每周至少更新一次(添加新功能、更改内容等)。然而,如果测试存在的话,它永远不会像应该的那样彻底。所以一周前我开始研究自动化测试和selenium 我读到,如果你想把它做好,不要完全依赖selenium ide。编程测试提供了更多的选项。我对第三方PHP绑定一点也不满意,所以我很快就跳过了使用java编程测试 现在我的问题是如何巧妙地设置运行测试的系统。我的想法如下: 测试将/应该是完全自主的 尽管如此,我还是希望有一些主应用程序来循环所有这些测试并一个接一个地运行它们 主应

我在大型网站上工作,每周至少更新一次(添加新功能、更改内容等)。然而,如果测试存在的话,它永远不会像应该的那样彻底。所以一周前我开始研究自动化测试和selenium

我读到,如果你想把它做好,不要完全依赖selenium ide。编程测试提供了更多的选项。我对第三方PHP绑定一点也不满意,所以我很快就跳过了使用java编程测试

现在我的问题是如何巧妙地设置运行测试的系统。我的想法如下:

  • 测试将/应该是完全自主的
  • 尽管如此,我还是希望有一些主应用程序来循环所有这些测试并一个接一个地运行它们
  • 主应用程序应该全天候运行,或者至少通过cronjob或其他方式定期启动
  • 测试应该在尽可能多的浏览器(或模拟客户端??)中运行。到目前为止,我通过各自的网络驱动程序使用FF、IE和chrome
  • 我想命名一些文件夹并收集该文件夹中的所有测试。然后,主应用程序将获取该文件夹中的任何内容并运行它。然后每个人都会创建他们的测试并将它们放在那个文件夹中,这样它们就会被添加到队列中
  • 如果有一种方法可以使用selenium ide创建测试,导出它们,它们可以立即与我的主应用程序一起工作(即,它们可以在不需要任何修改的情况下正确运行)。好的,我知道我说过,selenium ide是不可取的,但我觉得这对于一些简单的测试来说是一个好的开始。而且,没有任何编程知识的人仍然可以使用它。现在,我将使用selenium ide创建的测试导出为“Java/JUnit 4/WebDriver”,并更改一点代码(将WebDriver对象作为参数传递)
以下是我的“主应用程序”的代码:

导入java.io.File;
导入java.io.FilenameFilter;
导入java.lang.reflect.InvocationTargetException;
导入java.lang.reflect.Method;
导入java.util.concurrent.TimeUnit;
导入org.openqa.selenium.WebDriver;
公共类硒测试{
公共静态void main(字符串[]args)抛出
ClassNotFoundException、实例化Exception、非法访问Exception、,
NoSuchMethodException、SecurityException、IllegalArgumentException、,
调用目标异常{
字符串[]驱动程序={
“org.openqa.selenium.firefox.FirefoxDriver”,
“org.openqa.selenium.ie.InternetExplorerDriver”,
“org.openqa.selenium.chrome.ChromeDriver”
};
类参数[]={WebDriver.Class};
字符串testFolderName=“lookhere”;
while(true){
//从某个文件夹获取所有.java文件。这些将是要运行的测试
文件testFolder=新文件(testFolderName);
FilenameFilter筛选器=新建FilenameFilter(){
公共布尔接受(文件目录,字符串名称){
返回name.endsWith(“.java”);
}
};
String[]tests=testFolder.list(过滤器);
如果(测试==null){
系统出口(0);
}
对于(int i=0;i我将使用它来编排测试,而不是主方法,它允许按照前面的答案状态进行参数化,如果使用selenium GRID 2,则可以在许多不同的浏览器/操作系统版本组合上并行运行测试

我还将考虑使用PaulObjor来建模测试用例,这将有助于使测试封装和健壮。

  • 你的概念还可以,但你如何实现它还远远不够

  • 您的标准之一是一个不断变化的网页。因为这个Selenium IDE是无用的。您将经常更新您的测试用例

  • 关于如何编写测试用例的错误假设

  • 由于测试用例是在普通计算机上运行的,因此无法轻松地针对不同版本的浏览器类型运行。每个版本需要不同的计算机

  • 所以我的解决方案是

  • 如前所述,Testng将驱动测试用例实现。它允许分组和设置/拆卸方法
  • 如前所述,为每个网页创建一个类,为每个要使用的元素创建一个函数。还可以创建具有组织流的帮助器类。这将大大减少维护时间。它只需要在几个类中更新,而不是在每个测试用例中更新

  • 对于计划和概述,我将从Jenkins运行测试。这允许您为不同类型的操作系统、浏览器等设置作业。Jenkins支持在从属服务器上运行测试用例。因此,每个从属服务器可以有您要测试的每种类型的浏览器的不同版本

  • 对于真正高级的虚拟机,我将使用VMWare或KVM动态创建虚拟机作为从机使用。这将允许您在每次启动测试运行时设置所需的确切服务器类型。您将为每种类型的os os设置创建映像,并在Jenkins中启动作业时通过选项决定创建虚拟机的映像因疼痛而疼痛


  • 虽然我没有一个完整的解决方案,但我确实有一些经验需要思考:

    • 尽量不要测试整个站点,而是从最重要的部分开始 是(业务)关键的。在一个具有
      自助部分,我会关注自助部分。如果有
      如果您的主页上有业务关键部分,您可以写
      自动测试也是如此
    • 能够破坏测试的人应该编写测试。由于开发人员一直在破坏测试(通过编写/更改代码),开发人员应该编写测试
    • 我认为开发者应该选择他们自己的工具
      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();
                  }
              }
          }
      }