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



我正在开发大型网站,这些网站每周至少更新一次(添加新功能,更改内容等)。 然而,测试,即使存在,也永远不会像应有的那样彻底。 所以一周前,我开始研究自动化测试和硒。

我读到如果你想把它做好,不要仅仅依赖硒IDE。 对测试进行编程提供了更多选项。 我对第三方PHP绑定完全不满意,所以我很快就跳过了使用Java来编程测试。

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

  • 测试将/应该是完全自主的
  • 尽管如此,我还是想有某种主应用程序来循环所有这些测试并一个接一个地运行它们
  • 主应用程序应该 24/7 全天候运行,或者至少通过 cronjob 或其他东西定期启动
  • 测试应该在尽可能多的浏览器(或模拟客户端??)中运行。 到目前为止,我正在通过各自的WebDriver使用FF,IE和Chrome。
  • 我想命名某个文件夹并收集该文件夹中的所有测试。 然后,主应用程序将获取该文件夹中的任何内容并运行它。 然后每个人都会创建他们的测试并将它们放在那个文件夹中,这样他们就会被添加到队列中
  • 最好有一种方法可以使用Selenium IDE创建测试,导出它们,它们立即与我的主要应用程序一起使用(即它们无需任何修改即可正确运行)。 好的,我知道我说过,不建议使用Selenium IDE,但我觉得这是一些简单测试的良好开端。 此外,没有任何编程知识的人仍然可以使用它。 就像现在一样, 我将使用 Selenium ide 创建的测试导出为"Java/JUnit 4/WebDriver"并更改了一些代码(将 WebDriver obect 作为参数传递)。

这是我的"主应用程序"的代码:

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的专家,所以不要被糟糕的形式(如main方法的长抛声明)所推迟。

现在,对于我的问题:

  1. 我上面制定的整个概念好吗? 也就是说:让一个主应用程序运行所有测试和一个队列,我可以在其中动态添加/删除测试。 或者是否有其他最佳实践方法? 您还能想到什么其他概念/架构?
  2. 有没有办法使用 Selenium ide 创建测试,导出它们并立即与主应用程序一起使用,而无需任何修改?
  3. 好吧,既然我发布了代码,你可能想发疯并批评它;-)我愿意接受各种建议。
  4. Selenium是否可以运行不同版本的IE(或任何浏览器,就此而言)? 它可能只是运行我已安装的浏览器版本。 因此,如果我想测试一个浏览器的不同版本,我必须调用远程机器,这意味着硒网格? 我现在真的只是猜测:)
我会使用

TestNG 而不是 main 方法来编排测试,它允许像前面的答案状态那样进行参数化,如果您使用 selenium GRID 2,您可以在许多不同的浏览器/操作系统版本组合上并行运行测试

我还会考虑使用 PageObjects 和 PageFactory 对测试用例进行建模,这将进一步帮助使测试封装和健壮。

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

  • 尽量不要测试整个网站,而是从导入最多的部分开始(业务)关键。在一个典型的内容网站中,
    具有自助服务部分,我会专注于自助服务部分。
    如果有是主页上的关键业务部分,您可以写
    自动测试也是如此。
  • 能够打破测试的人应该编写测试。由于开发人员一直在破坏测试(通过编写/更改代码),开发人员应该编写测试!
  • 在我看来,开发人员应该选择自己的工具。在我们的例子中,PHP开发人员使用 beehat.org 网站。自助服务应用程序的 Angular 开发人员使用量角器。
  • 要测试多个浏览器和版本,请查看 BrowserStack.com。即使使用浏览器堆栈,您仍然需要考虑要测试的浏览器数量。因为每个浏览器/版本都需要额外的努力。也许您可以测试大多数用户访问您网站的浏览器(80%?),并让企业接受不努力测试100%的风险。当然,这在很大程度上取决于您的业务模式和风险偏好。

希望这在某种程度上有所帮助。

  1. 你的概念是可以的,但你如何实现它还有很长的路要走。

  2. 您的标准之一是不断变化的网页。对于这个硒IDE是没有用的。您将经常更新测试用例。

  3. 对如何编写测试用例的错误假设。

  4. 由于测试用例是在常规计算机上运行的,因此没有简单的方法可以针对不同版本的浏览器类型运行。每个版本都需要不同的计算机。

所以我的解决方案是

  1. 如前所述,Testng 来驱动测试用例实现。它允许分组和设置/拆卸方法。
  2. 如前所述,为每个网页创建一个类,其中包含您要使用的每个元素的函数。还可以创建用于组织流的帮助程序类。这会大大缩短您的维护时间。它只需要在几个类中更新,而不是在每个测试用例中更新。

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

  4. 对于真正高级的,我会动态创建虚拟机,以使用 VMWare 或 KVM 用作从属设备。这将允许在每次启动测试运行时设置所需的确切类型的服务器。您将为每种类型的操作系统设置创建映像,并且在 Jenkins 中启动作业时通过选项决定从哪个映像创建虚拟机。

相关内容

最新更新