使用Selenium设置自动化测试框架

时间:2012-08-10 13:24:39

标签: java testing architecture selenium webdriver

我正在开发大型网站,每周至少更新一次(更新新功能,更改内容等)。然而,如果在任何情况下,测试从未像它应该的那样彻底。所以一周前我开始研究自动化测试和硒。

我读到如果你想做得对,不要仅仅依靠硒。编程测试提供了更多选择。我对第三方PHP绑定感到不舒服,所以我很快就跳过使用java编程测试。

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

  • 测试将/应该是完全自主的
  • 然而,我希望有一些主要的应用程序来循环所有这些测试并一个接一个地运行它们
  • 主应用程序应该全天候运行,或至少通过cronjob或其他东西定期启动
  • 测试应该在尽可能多的浏览器(或模拟客户端??)中运行。到目前为止,我通过他们各自的WebDrivers使用FF,IE和chrome。
  • 我想命名一些文件夹并收集该文件夹中的所有测试。然后主应用程序将只接受该文件夹中的任何内容并运行它。然后每个人都会创建他们的测试并将它们放在该文件夹中,这样他们就会被添加到队列中
  • 有一种方法可以创建使用selenium ide的测试,导出它们并且它们可以立即与我的主应用程序一起使用(即它们可以正确运行而无需任何修改)。好吧,我知道我说过,selenium ide是不适应的,但我觉得这是一些简单测试的良好开端。此外,没有任何编程知识的人仍然可以使用它。就像现在一样,我将使用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的专家,所以不要被糟糕的形式推迟(比如主方法的long throws-declaration)。

现在,我的问题:

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

3 个答案:

答案 0 :(得分:0)

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

我还会考虑使用PageObjects&amp; amp;来建模测试用例。 PageFactories,这将进一步帮助进行封装和健壮的测试。

答案 1 :(得分:0)

尽管我没有完整的解决方案,但我确实有一些经验可以考虑:

  • 尽量不要测试整个网站,而要从大多数进口零件开始 (业务)至关重要。在具有
    自助服务部分,我将重点介绍自助服务部分。如果有
    是主页上的关键业务部分,您可以编写
    自动化的测试。
  • 可以打破测试的人应该编写测试。随着开发人员一直在破坏测试(通过编写/更改代码),开发人员应该编写测试!
  • 在我看来,开发人员应该选择自己的工具。在我们的例子中,PHP开发人员使用beehat.org来访问网站。自助服务应用程序的Angular开发人员使用量角器。
  • 要测试多个浏览器和版本,请访问BrowserStack.com。即使使用browserstack,您仍然要考虑要测试的浏览器数量。因为每个浏览器/版本都是一个额外的工作。也许您可以测试大多数用户使用(80%?)访问您网站的浏览器,并使企业接受不进行100%测试的风险。当然,这在很大程度上取决于您的业务模式和风险偏好。

希望这会有所帮助。

答案 2 :(得分:-1)

  1. 你的概念还可以,但你如何实现它是远离它的。

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

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

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

  5. 所以我的解决方案是

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

    3. 对于日程安排和概述,我会从Jenkins运行测试。这允许您为不同类型的操作系统,浏览器等设置作业。 Jenkins支持在slave上运行测试用例。因此,每个从属服务器可以为您要测试的每种类型的浏览器提供不同版本。

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