使用JMeter运行Selenium脚本

时间:2011-10-19 06:43:54

标签: java selenium junit automated-tests jmeter

我已准备好功能流的Selenium自动化脚本,现在我想将这些脚本与JMeter集成以进行负载测试。
这可能吗?
如果是这样,如何整合两者?

我的第一个目标是使用selenium运行自动化脚本,而不是在jmeter中运行这些脚本以进行负载或性能测试。

4 个答案:

答案 0 :(得分:26)

以下是从JMeter运行Selenium测试用例的可能方法:


JUnit请求采样器

如果您想重新使用已经自动化(Java)的Selenium场景而不是为WebDriver Sampler重写JS脚本,那么以这种方式运行Selenium测试可能很有用。

Selenium RC


  1. 准备Selenium测试项目和设置。

    1.1。下载Selenium Java客户端库并将selenium-java-${version}.jar放到JMeter类路径中,例如%JMETER_HOME%/lib/
    1.2。 Selenium服务器应该启动并监听:

    java -jar selenium-server-standalone-${version}.jar
    

    1.3。将Selenium test-plan导出为.jar并将其保存到%JMETER_HOME%/lib/junit/

    注意:您的测试类应该扩展TestCaseSeleneseTestCase以允许JMeter选择此测试计划,测试用例的名称应该以“test”开头< / b>的)。
    注意:默认SeleneseTestCase扩展JUnit 3.x TestCase,同时SeleneseTestCase期望外部Selenium服务器正在运行。

  2. 配置JUnit Request sampler

    2.1。在JMeter测试计划中添加JUnit Request sampler 根据Selenium测试计划中的一个设置Class Name 设置Test Method以测试即将运行 默认情况下保留其他参数。

    enter image description here

    JUnit 3.x vs. 4.x
     JUnit Request Sampler可以处理JUnit3和JUnit4样式的类和方法。要将Sampler设置为搜索JUnit 4测试(@Test注释),请在上面的设置中选中Search for Junit4 annotations (instead of JUnit 3)复选框。
     识别以下JUnit4注释:

      

    @Test - 用于查找测试方法和类。支持“预期”和“超时”属性   @Before - 与JUnit3中的setUp()处理相同   @After - 与JUnit3中的tearDown()相同   @BeforeClass,@ AfterClass - 被视为测试方法,因此可以根据需要独立运行

  3. 您已准备好使用JMeter开始您的Selenium测试。

  4. JUnit Request sampler的Java代码:

    JUnit 3.x

    package com.example.tests;
    
    import com.thoughtworks.selenium.*;
    
    public class selenium extends SeleneseTestCase {
    
        private static Selenium selenium;
    
        public void setUp() throws Exception {
            selenium = new DefaultSelenium("localhost", 4444, "*firefox", "http://www.google.com/");
            selenium.start();
            selenium.windowMaximize();
        }
    
        public void testSelenium() throws Exception {
            selenium.open("/");
            selenium.waitForPageToLoad("30000");
            Assert.assertEquals("Google", selenium.getTitle());
        }
    
        public void tearDown() throws Exception {
            selenium.close();
        }
    }
    

    JUnit 4.x

    用JUnit 4编写的测试脚本使用JUnit注释:

    package com.example.tests;
    
    import com.thoughtworks.selenium.*;
    
    import org.junit.After;
    import org.junit.Assert;
    import org.junit.Before;
    import org.junit.Test;
    
    public class selenium extends SeleneseTestCase {
    
        private static Selenium selenium;
    
        @Before
        public void setUp() throws Exception {
            selenium = new DefaultSelenium("localhost", 4444, "*firefox", "http://www.google.com/");
            selenium.start();
            selenium.windowMaximize();
        }
    
        @Test
        public void testSelenium() throws Exception {
            selenium.open("/");
            selenium.waitForPageToLoad("30000");
            Assert.assertEquals("Google", selenium.getTitle());
        }
    
        @After
        public void tearDown() throws Exception {
            selenium.stop();
        }
    }
    

    Selenium WebDriver


    此案例是下文另一个答案中提到的WebDriver Sampler的替代方案。

    的先决条件

    与Selenium RC案例的唯一区别是Selenium设置准备:

    1.1。下载selenium-server-standalone-${version}.jar并将其放到JMeter类路径中,例如%JMETER_HOME%/lib/
    注意:无需启动Selenium服务器。

    所有其他步骤与上述情况相同。

    
    package org.openqa.selenium.example;
    
    import junit.framework.TestCase;
    
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.After;
    import org.openqa.selenium.*;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.firefox.FirefoxDriver;
    import org.openqa.selenium.firefox.FirefoxProfile;
    
    public class selenium extends TestCase {
        public static WebDriver driver;
    
        @Before
        public void setUp() {
            FirefoxProfile profile = new FirefoxProfile();
            driver = new FirefoxDriver(profile);
        }
    
        @Test
        public void testSelenium() throws Exception {
            driver.get("http://www.google.com/");
            Assert.assertEquals("Google", driver.getTitle());
        }
    
        @After
        public void tearDown() {
            driver.quit();
        }
    }
    

    <强> UPD。

    使用Selenium + JUnit + JMeter捆绑包的另一个好点和分步指南:


    BeanShell采样器

    在这种情况下,selenium测试场景直接在JMeter的BeanShell Sampler中执行。

    1. Selenium设置准备与上述情况完全相同:下载Selenium库,放入JMeter类路径,启动Selenium服务器(如果是Selenium RC)。
    2. 将您的selenium测试场景放入BeanShell Sampler:
    3. enter image description here

      Selenium RC

      import com.thoughtworks.selenium.*;
      import java.util.regex.Pattern;
      
      Boolean result = true;
      
      try {
          selenium = new DefaultSelenium("localhost", 4444, "*iexplore", "http://www.google.com/");
          selenium.start();
          selenium.windowMaximize();
      
          selenium.open("/");
          selenium.waitForPageToLoad("30000");  
      
          if (!selenium.isTextPresent("Google")) result = false;
      } catch (Exception ex) {
          ex.printStackTrace();
          IsSuccess = false;
          ResponseCode = "500";
          ResponseMessage = ex.getMessage();
      } finally {
          selenium.stop();
      }
      
      IsSuccess = result;
      return result;
      

      Selenium WebDriver

      import org.openqa.selenium.By;
      import org.openqa.selenium.WebDriver;
      import org.openqa.selenium.WebElement;
      import org.openqa.selenium.htmlunit.HtmlUnitDriver;
      
      Boolean result = true;
      
      try {
          driver = new HtmlUnitDriver();
          driver.setJavascriptEnabled(true);
      
          driver.get("http://www.google.com/");
      
          if (!driver.getTitle().contains("Google")) result = false;
      } catch (Exception ex) {
          ex.printStackTrace();
          IsSuccess = false;
          ResponseCode = "500";
          ResponseMessage = ex.getMessage();
      } finally {
          driver.quit();
      }
      
      IsSuccess = result;
      return result;
      

      JSR223 Sampler + Groovy

      在这种情况下,selenium测试场景通过JSR223 Sampler + Groovy执行 对于performance considerations,这种方法似乎比使用上述BeanShell Sampler更优选。

      1. Selenium设置准备与上述情况完全相同:下载Selenium库,放入JMeter类路径,启动Selenium服务器(如果是Selenium RC)。
      2. 为JSR223采样器添加Groovy支持:

        2.1。 download latest Groovy二进制分布;
        2.2。从“embeddable”分发文件夹中复制groovy-all-${VERSION}.jar并将其放到%JMETER_HOME%/lib/;
        2.3。重启JMeter。

      3. 配置JSR233采样器:

        3.1。将JSR233 Sampler添加到Thread Group;
        3.2。在采样器的设置中将Script Language设置为groovy;
        3.3。将您的selenium测试场景放入Script部分(将接受Java代码):

      4. enter image description here

        Selenium RC

        import com.thoughtworks.selenium.*;
        import java.util.regex.Pattern;
        
        Boolean result = true;
        
        try {
            selenium = new DefaultSelenium("localhost", 4444, "*iexplore", "http://www.google.com/");
            selenium.start();
            selenium.windowMaximize();
        
            selenium.open("/");
            selenium.waitForPageToLoad("30000");      
        
            if (!selenium.isTextPresent("Google")) result = false;
        } catch (Exception ex) {
            ex.printStackTrace();
            log.error(ex.getMessage());
             SampleResult.setSuccessful(false);
             SampleResult.setResponseCode("500");
             SampleResult.setResponseMessage(ex.getMessage());
        } finally {
            selenium.stop();
        }
        
        SampleResult.setSuccessful(result);
        return result;
        

        Selenium WebDriver

        import org.openqa.selenium.By;
        import org.openqa.selenium.WebDriver;
        import org.openqa.selenium.WebElement;
        import org.openqa.selenium.htmlunit.HtmlUnitDriver;
        
        Boolean result = true;
        
        try {
            driver = new HtmlUnitDriver();
            driver.setJavascriptEnabled(true);
        
            driver.get("http://www.google.com/");
        
            if (!driver.getTitle().contains("Google")) result = false;
        } catch (Exception ex) {
            ex.printStackTrace();
            log.error(ex.getMessage());
             SampleResult.setSuccessful(false);
             SampleResult.setResponseCode("500");
             SampleResult.setResponseMessage(ex.getMessage());
        } finally {
            driver.quit();
        }
        
        SampleResult.setSuccessful(result);
        return result;
        

        BeanShell / JSR223采样器案例的常见说明:

        • 使用带有测试场景(Script file字段)的外部.bsh / .groovy文件,而不是直接在采样器中使用Beanshell / Groovy代码进行密集测试。
        • 由于BeanShell / JSR233采样器可以访问JMeter的变量,您可以直接在测试场景中设置测试(=采样器执行)状态(通过例如IsSuccess = STATUSSampleResult.setSuccessful(STATUS),参见上面的代码),而不使用响应断言。

答案 1 :(得分:7)

有更简单的方法来运行Selenium脚本。

  1. 下载WebDriver plugin并转到lib /文件夹。
  2. 将jp @ gc - Firefox驱动程序配置和jp @ gc - Web驱动程序采样器添加到测试树
  3. Jmeter test tree

    • 添加此代码

          var pkg = JavaImporter(org.openqa.selenium)
          var support_ui = JavaImporter(org.openqa.selenium.support.ui.WebDriverWait)
          var wait = new support_ui.WebDriverWait(WDS.browser, 5000)
          WDS.sampleResult.sampleStart()
          WDS.log.info("Opening page...");
          WDS.browser.get('http://duckduckgo.com')
          var searchField = WDS.browser.findElement(pkg.By.id('search_form_input_homepage'))
          searchField.click()
          WDS.log.info("Clicked search field")
          searchField.sendKeys(['blazemeter'])
          WDS.log.info("Inserted blazemeter keyword")
          var button = WDS.browser.findElement(pkg.By.id('search_button_homepage'))
          button.click()
          WDS.log.info("Clicked search button");
          var link = WDS.browser.findElement(pkg.By.ByCssSelector('#r1-0 > div.links_main > h2 > a.large > b'))
          link.click()
          WDS.log.info("Clicked blazemeter link");
          WDS.log.info(WDS.name + ' finishing...');
          WDS.sampleResult.sampleEnd()
      
    • 运行测试

    有关代码语法和最佳做法的更多详细信息,请参阅Using Selenium with JMeter's WebDriver Sampler文章。

答案 2 :(得分:1)

所以基本上你首先用selenium记录你的脚本,然后用jmeter重新记录selenium测试用例。 :-)

http://codenaut.blogspot.com/2011/06/icefaces-load-testing.html

答案 3 :(得分:0)

不需要将Selenium与JMeter一起使用。 Selenium脚本一次将使用一个浏览器实例。而JMeter并不使用浏览器的真实实例来生成负载。

请让我知道是否可以使用Selenium脚本从UI角度为5000个vuser生成负载。可能可以。但是我们是在说Selenium脚本现在在同一系统上需要5000个浏览器实例吗?测试是否仍将运行或挂起系统? JMeter作为记录器已经有了不错的选择。从“负载”测试的角度来看,它提供了出色的统计信息。

有一会儿,如果我们认为了解Selenium的用户将不知道如何在JMeter中编写脚本,因此就不会学习。但是在JMeter的情况下,这甚至不是事实。这是因为不需要首先创建逻辑序列或程序之类的东西。