【发布时间】:2011-12-10 16:14:08
【问题描述】:
我已经准备好功能流的 Selenium 自动化脚本,现在我想将这些脚本与 JMeter 集成以进行负载测试。
这可能吗?
如果可以,如何整合两者?
我的第一个目标是使用 selenium 运行自动化脚本,而不是在 jmeter 中运行这些脚本以进行负载或性能测试。
【问题讨论】:
标签: java selenium junit automated-tests jmeter
我已经准备好功能流的 Selenium 自动化脚本,现在我想将这些脚本与 JMeter 集成以进行负载测试。
这可能吗?
如果可以,如何整合两者?
我的第一个目标是使用 selenium 运行自动化脚本,而不是在 jmeter 中运行这些脚本以进行负载或性能测试。
【问题讨论】:
标签: java selenium junit automated-tests jmeter
以下是从 JMeter 运行 Selenium 测试用例的可能方法:
如果您想重用已经自动化的 (Java) Selenium 场景而不是为 WebDriver Sampler 重新编写 JS 脚本,那么以这种方式运行 Selenium 测试可能很有用。
准备 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 测试计划导出为 .jar 并保存到 %JMETER_HOME%/lib/junit/。
注意:您的测试类应扩展 TestCase 或 SeleneseTestCase 以允许 JMeter 选择此测试计划,测试用例的名称应以“test”开头) .
注意:默认情况下,SeleneseTestCase 扩展了 JUnit 3.x TestCase,SeleneseTestCase 也期望外部 Selenium 服务器正在运行。
2.1。在 JMeter 测试计划中添加 JUnit Request sampler.
根据 Selenium 测试计划中的一项设置Class Name。
将Test Method 设置为即将运行的测试。
其他参数默认保留。
JUnit 3.x 与 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 - 被视为测试方法,因此它们可以根据需要独立运行
您已准备好使用 JMeter 开始 Selenium 测试。
JUnit 请求采样器的 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();
}
}
这种情况是下面另一个答案中提到的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();
}
}
更新。
使用 Selenium + JUnit + JMeter 捆绑包的另一个优点和分步指南:
在这种情况下,selenium test-scenario 直接在 JMeter 的BeanShell Sampler 中执行。
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;
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 执行。
对于performance considerations,这种方法似乎比使用上述的 BeanShell 采样器更可取。
为 JSR223 Sampler 添加 Groovy 支持:
2.1。 download latest Groovy二进制分发;
2.2.从分发的“embeddable”文件夹中复制groovy-all-${VERSION}.jar并将其放到%JMETER_HOME%/lib/;
2.3.重启 JMeter。
配置 JSR233 采样器:
3.1。将 JSR233 采样器添加到线程组;
3.2.在采样器的设置中将Script Language 设置为groovy;
3.3.将您的 selenium 测试场景放入 Script 部分(将接受 Java 代码):
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;
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 Sampler 案例的常见注意事项:
Script file 字段)的外部 .bsh / .groovy 文件,而不是直接在采样器中使用 Beanshell / Groovy 代码进行密集测试。IsSuccess = STATUS 或 SampleResult.setSuccessful(STATUS),参见上面的代码),而无需使用响应断言。
【讨论】:
所以基本上你先用 selenium 记录你的脚本,然后用 jmeter 重新记录 selenium 测试用例。 :-)
http://codenaut.blogspot.com/2011/06/icefaces-load-testing.html
【讨论】:
有更简单的方法来运行 Selenium 脚本。
添加此代码
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 文章。
【讨论】:
没有必要将 Selenium 与 JMeter 一起使用。 Selenium 脚本一次将采用一个浏览器实例。然而,JMeter 不使用浏览器的真实实例来生成负载。
请告诉我是否可以使用 Selenium 脚本从 UI 角度为 5000 个 vuser 生成负载。应该可以吧。但是我们是说 Selenium 脚本现在需要在同一系统上运行 5000 个浏览器实例吗?测试是否仍会运行或挂起系统? JMeter 作为 Recorder 也已经有了很好的选择。它从“负载”测试的角度提供了很好的统计数据。
暂时如果我们认为了解 Selenium 的用户不会知道如何在 JMeter 中编写脚本,因此会出现学习曲线。但在 JMeter 的情况下,这甚至不是真的。这是因为一开始就不需要创建诸如逻辑序列或程序之类的东西。
【讨论】:
虽然接受的答案确实对我很有效,但 Selenium RC 已经过时了。所以这是更新后的Selenium WebDriver 方法。
注意:可以从接受的答案中重复使用设置。
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import junit.framework.TestCase;
public class SimpleGoogleSearch extends TestCase {
@Test
public void testSelenium() {
// Replace the following line with the path to your chromedriver.
System.setProperty("webdriver.chrome.driver",
"path to your chrome driver");
WebDriver driver = new ChromeDriver();
driver.get("http://www.google.com");
WebElement searchField = driver.findElement(By.cssSelector("input[class = 'gLFyf gsfi']"));
searchField.sendKeys("google");
searchField.submit();
assertEquals("google - Google Search", driver.getTitle());
driver.close();
driver.quit();
}
}
【讨论】: