1

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

我读到,如果你想做对,不要仅仅依赖 selenium ide。对测试进行编程提供了更多选择。我对第三方 PHP 绑定完全不满意,所以我很快跳到使用 java 来编写测试。

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

  • 测试将/应该是完全自主的
  • 尽管如此,我还是希望有某种主应用程序来循环所有这些测试并一个接一个地运行它们
  • 主应用程序应该 24/7 运行,或者至少通过 cronjob 或其他东西定期启动
  • 测试应该在尽可能多的浏览器(或模拟客户端??)中运行。到目前为止,我通过各自的 WebDrivers 使用 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(或任何浏览器,就此而言)?它可能只是运行我安装的浏览器版本。所以如果我想测试一个浏览器的不同版本,我必须调用远程机器,这意味着硒网格?我现在真的只是在猜测:)
4

3 回答 3

0

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

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

于 2012-08-10T18:14:52.913 回答
0

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

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

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

于 2020-02-14T14:37:09.823 回答
-1
  1. 你的概念是好的,但你如何实现它却很遥远。

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

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

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

所以我的解决方案是

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

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

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

于 2015-05-06T06:59:44.993 回答