selenium rc使用
单元测试框架(例如JUnit)可让您测试服务器上运行的代码。 但是,在典型的Web应用程序中,该服务代码只是应用程序中总代码的一小部分。 这样的应用程序还可以包含很多代码,这些代码实际上只能使用与浏览器一起测试该应用程序的工具进行测试。
测试Web应用程序更具挑战性的方面之一就是测试应用程序的UI,这是通常由HTML和JavaScript代码生成的应用程序代码的一部分。 它在浏览器中运行,而不是在服务器进程中运行,因此只能通过Internet浏览器进行测试。 此类代码的示例包括JavaServer Pages(JSP)页面,PHP代码和Ruby。
本文介绍了社区中的一种工具-Selenium,可用于创建和自动化Web测试。 您将学习如何快速创建一些示例测试,如何扩展它们以及如何使用Selenium Remote Control将它们作为自动化测试运行。
了解Selenium RC
Selenium RC是Selenium项目的一组工具的一部分。 它允许您运行以自动化方式创建的测试。 Selenium RC在许多不同的操作系统上运行,并且可以启动不同浏览器的实例,包括Windows®InternetExplorer®,Mozilla Firefox和Opera。
使用Selenium RC,您可以根据需要自动运行测试多次。 与仅使用Selenium IDE相比,该工具还使您能够创建更复杂的测试。 您可以将条件语句和迭代添加到测试中,如果您要使用一组数据运行测试,则可以提供帮助。 您还可以使用单元测试框架(例如JUnit)中可用的构造来处理预期的异常。
下载并安装Selenium RC
要开始使用Selenium RC,必须先下载并安装它。 Selenium服务器只是一个JAR文件,您可以使用Java™运行时环境(JRE)运行它。 您可以从SeleniumHQ站点下载JAR文件和其他支持文件(请参阅参考资料中的链接)。
下载完成后,解压缩包含Selenium RC的存档文件,并将其扩展到以后您会记得的位置。 您可以通过运行以下命令来执行Selenium服务器:
java -jar selenium-server.jar
样本应用程序进行测试
本文使用一个带有JSP页面的简单动态Web应用程序来演示Selenium RC的工作原理以及如何在自动测试中使用。 这个简单的Web应用程序有两个页面:一个登录页面和一个页面,您可以在该页面上输入诸如姓名和出生日期之类的信息,该应用程序将从该页面计算您的年龄并说“你好”。
该示例应用程序提供了一个机会,展示了如何执行测试以在不同条件下工作。 清单1显示了第一页。这是简单的登录页面,可让您登录到Web应用程序。 为了使此示例简单,将登录信息与一些硬编码的字符串进行比较。
清单1. index.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
if ("process".equals(request.getParameter("action")))
{
if ("user".equals(request.getParameter("username")) &&
"secret".equals(request.getParameter("password")))
{
response.sendRedirect("enterInfo.jsp");
return;
}
}
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Test Login Page</title>
</head>
<body>
<form action="<%= request.getRequestURI() %>" method="POST">
<input type="hidden" value="process" name="action" />
<label for="username">Username:<br />
<input type="text" id="username" name="username" />
</label>
<br />
<label for="password">Password:<br />
<input type="password" id="password" name="password" />
</label>
<br />
<input type="submit" value="Login" />
</form>
</body>
</html>
清单2显示了第二页。输入名字和出生日期后,该页面仅显示“ Hello”,并告诉您您的年龄。 这个示例有些人为,因为在大多数Web应用程序中,此类信息将需要登录,并且数据将被存储用于下次登录。
清单2. enterInfo.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@page import="java.util.Date"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="java.text.ParseException"%>
<%!
private Date parseDate(String dateValue)
{
Date returnDate = null;
try
{
// this is not the most efficient of methods, and try...catch
// statements ideally should not be used as business exception
// processing...
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
returnDate = dateFormat.parse(dateValue);
} catch (ParseException pe)
{
// do nothing...
}
return returnDate;
}
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="<%= request.getRequestURI() %>" method="POST">
<input type="hidden" value="process" name="action" />
<label for="name">Your name:<br />
<input type="text" id="name" name="name" />
</label>
<br />
<label for="birthdate">Your birth date (in MM/DD/YYYY format):<br />
<input type="text" id="birthdate" name="birthdate" />
</label>
<br />
<%
if ("process".equals(request.getParameter("action")))
{
// verify the date
Date birthDate = parseDate(request.getParameter("birthdate"));
if (birthDate == null)
{
// display the error messages...
out.write("<p class=\"error\">Please enter a valid date.</p>");
} else {
// display the nice messages...
}
}
%>
<input type="submit" value="Submit" />
</form>
</body>
</html>
编写第一个测试
要快速编写一些可以用作自动化测试基础的测试,可以使用Selenium IDE入门。 Selenium IDE是Firefox的插件,可让您记录测试。 然后,您可以导出记录的测试,以便可以向它们添加奇特效果-条件,迭代等。
要开始使用SeleniumIDE,从链接下载相关主题 。 通过单击链接将其安装为Firefox插件。 Firefox应该提示您安装插件,然后必须重新启动浏览器以使更改生效。
安装插件后,启动服务器,以便可以开始使用Web应用程序。 通过在Firefox中单击工具> Selenium IDE来打开Selenium IDE。 打开Selenium IDE后,单击“ 记录” 。 录制Selenium IDE之后,它将记住您在浏览器中执行的所有操作。 要登录到示例应用程序,请执行以下步骤:
- 使用Selenium IDE记录,导航到index.jsp网页。
- 输入您的用户名。
- 在密码框中键入有效的密码 。
- 单击登录 。
成功登录后,您的Web应用程序应转到enterInfo.jsp页面。 至此,您的测试中已包含操作,但是到目前为止,还没有任何东西可以验证您的操作是否有效。 Selenium需要知道要查找什么才能知道您的enterInfo.jsp页面正在按预期方式呈现。
您可以添加验证操作,以确保您的应用程序显示正确的内容。 当Selenium仍在记录时,请执行以下步骤:
- 右键单击HTML元素之一,例如“
Your name
标签,然后单击“ verifyTextPresent您的名字:” 。 - 使用
Your birth date
标签重复步骤1。 - 单击录制停止录制。
如果要查看实际的测试,请单击“全部运行” (请参见图1)。 测试将执行并通过。
图1.单击全部运行
要查看Selenium IDE如何真正测试您的应用程序,请转至IDE并更改有效用户名的值。 重新部署您的应用程序,然后再次单击“全部运行” 。 这次,您的测试将失败,因为Web应用程序将不会显示带有正确标签的enterInfo.jsp页面。
将测试导出到JUnit
既然您已经记录了第一个测试,则可以将其导出以在JUnit中使用。 在Selenium IDE中突出显示测试的情况下 ,单击文件>将测试用例导出为> Java(JUnit)-Selenium RC 。 输入测试的名称(例如IndexTests.java ),并将其保存在您可以记住的位置,以便将其导入Eclipse。
执行以下步骤:
- 创建一个新的Java项目,其中包括使用JUnit构建的Java单元测试。
- 下载Selenium RC二进制文件(请参阅参考资料中的链接)。 将归档文件保存到可以将其中的文件导入Eclipse中新Java项目的位置。
- 在Java项目中创建一个名为lib的新文件夹。
- 单击文件>导入 ,然后从列表中单击文件系统 。 单击下一步 。
- 浏览到提取Selenium RC文件的位置,然后选择selenium-java-client-driver-1.0.1目录。
- 从列表中选择selenium-java-client-driver.jar,然后单击OK将Selenium Java客户端驱动程序JAR文件导入到项目的lib目录中。
- 从Selenium IDE导出的Java文件导入到新Java项目的src目录中。
您会注意到的第一件事是,您将获得许多编译错误。 首先,新的Java文件可能不在正确的软件包中,因为它直接在src文件夹中。 其次,找不到JUnit或Selenium类。 幸运的是,使用Eclipse可以轻松解决这些错误。
解决Eclipse中的错误
单击错误,然后按Ctrl-1打开提示,以解决程序包错误。 选择Move MyTest.java来打包'com.example.mywebapp.tests' 。 Eclipse为您创建包结构并移动文件。
添加JUnit测试
现在,通过单击Package Explorer中的Java项目并单击Build Path> Configure Build Path来添加Selenium和JUnit测试。 在“ 库”选项卡上,单击“ 添加JAR” ,然后选择selenium-java-client-driver.jar文件。 单击确定 。
编译Java源文件时,它应类似于清单3。
清单3.基于从Selenium IDE导出的代码的JUnit测试
package com.example.mywebapp.tests;
import org.junit.Before;
import org.junit.Test;
import com.thoughtworks.selenium.SeleneseTestCase;
public class EnterInfoTests extends SeleneseTestCase {
@Before
public void setUp() throws Exception {
setUp("http://localhost:8080/tested-webapp/index.jsp", "*firefox");
}
@Test
public void testBadDate() {
doLogin();
selenium.type("name", "User");
selenium.type("birthdate", "@#$#@");
selenium.click("//input[@value='Submit']");
selenium.waitForPageToLoad("30000");
verifyTrue(selenium.isTextPresent("Please enter a valid date"));
}
@Test
public void testValidDate() {
doLogin();
selenium.type("birthdate", "12/2/1999");
selenium.click("//input[@value='Submit']");
selenium.waitForPageToLoad("30000");
verifyFalse(selenium.isTextPresent("Please enter a valid date"));
}
private void doLogin()
{
selenium.open("/tested-webapp/index.jsp");
selenium.type("username", "user");
selenium.type("password", "secret");
selenium.click("//input[@value='Login']");
selenium.waitForPageToLoad("30000");
}
}
如果由于限制无法使用Firefox而无法下载和安装Selenium IDE,则仍可以编写可使用Selenium RC运行的测试。 只要使用这里显示为开始和在规定的Selenium文档中的实例相关主题 。
查看测试结果
现在,您已经编写了第一个示例测试,您可以通过启动Selenium服务器并将该测试作为标准JUnit单元测试运行来查看它的运行情况。 通过键入以下命令来启动Selenium服务器:
java -jar selenium-server.jar
启动Selenium服务器之后,可以通过右键单击IndexTest.java文件,然后单击Run As> JUnit Test来运行单元测试 。 Selenium服务器启动浏览器实例并运行测试可能需要一段时间。 测试完成后,您将在Eclipse中看到与普通单元测试相同的输出。
深层发掘
现在,您已经使用Selenium IDE创建了一个简单的测试并将其导出为Java文件,现在创建一个更复杂的测试以验证enterInfo.jsp页面的功能。 清单4中显示了示例测试。
清单4.用于测试enterInfo.jsp的JUnit测试
package com.example.mywebapp.tests;
import org.junit.Before;
import org.junit.Test;
import com.thoughtworks.selenium.SeleneseTestCase;
public class EnterInfoTests extends SeleneseTestCase {
@Before
public void setUp() throws Exception {
setUp("http://localhost:8080/tested-webapp/index.jsp", "*firefox");
}
@Test
public void testBadDate() {
doLogin();
selenium.type("name", "User");
selenium.type("birthdate", "@#$#@");
selenium.click("//input[@value='Submit']");
selenium.waitForPageToLoad("30000");
verifyTrue(selenium.isTextPresent("Please enter a valid date"));
}
@Test
public void testValidDate() {
doLogin();
selenium.type("birthdate", "12/2/1999");
selenium.click("//input[@value='Submit']");
selenium.waitForPageToLoad("30000");
verifyFalse(selenium.isTextPresent("Please enter a valid date"));
}
private void doLogin()
{
selenium.open("/tested-webapp/index.jsp");
selenium.type("username", "user");
selenium.type("password", "secret");
selenium.click("//input[@value='Login']");
selenium.waitForPageToLoad("30000");
}
}
示例测试使用清单3中所示的LoginTest
类作为起点。 doLogin()
函数具有用于将您登录到应用程序的代码,该代码在测试开始时用于使您到达正确的位置。
testBadDate()
方法用于在窗体的生日日期字段中输入错误值,然后提交。 如果日期不正确,它将验证是否显示了相应的错误消息。 testValidDate()
方法测试表单上的有效日期,并确保提供用户年龄的消息正确无误。
利用JUnit中可用的Java技术的强大功能,您可以循环浏览示例,为测试添加条件,并可以预期异常。 请参见中的链接相关的话题更多地了解JUnit和单元测试。
自动化测试
现在,借助Apache Ant脚本和一些目标,您已经在Eclipse IDE中运行了测试,您可以完全自动化测试。 之后,你有这个Ant脚本,您可以使用工具,如哈德森,CruiseControl的(参见相关主题 )持续运行这些测试。
要自动化测试,可以使用Ant脚本,该脚本采用JUnit目标来执行Selenium RC测试。 该脚本如清单5所示。
清单5.用于运行Selenium测试的Ant脚本
<project name="tested-webapp-tests" default="run-tests" basedir=".">
<property name="selenium.server.jar"
value="/path/to/selenium-server.jar" />
<property name="src" value="${basedir}/src" />
<property name="build" value="${basedir}/bin" />
<property name="lib" value="${basedir}/lib" />
<!-- Could be defined in Ant runtime classpath, but here is better -->
<property name="hamcrest.home"
value="/path/to/eclipse/plugins" />
<property name="junit4.home"
value="/path/to/junit4/" />
<path id="classpath">
<fileset dir="${lib}" includes="**/*.jar" />
<fileset dir="${hamcrest.home}" includes="org.hamcrest.core*.jar" />
<fileset dir="${junit4.home}" includes="junit.jar" />
</path>
<target name="start-selenium-server">
<java jar="${selenium.server.jar}" fork="true" spawn="true">
<arg line="-timeout 30" />
</java>
</target>
<target name="compile-tests">
<javac srcdir="${src}" destdir="${build}" />
</target>
<target name="run-tests" depends="compile-tests">
<junit printsummary="false"
showoutput="true"
outputtoformatters="true">
<formatter type="brief" usefile="false" />
<classpath>
<path refid="classpath" />
<pathelement path="${build}" />
</classpath>
<batchtest fork="yes">
<fileset dir="${src}">
<include name="**/*Tests.java" />
</fileset>
</batchtest>
</junit>
<echo message="Finished running tests." />
</target>
<target name="stop-selenium-server">
<get taskname="selenium-shutdown"
src="//localhost:4444/selenium-server/driver/?cmd=shutDownSeleniumServer"
dest="result.txt"
ignoreerrors="true" />
</target>
<target name="run-all">
<parallel>
<antcall target="start-selenium-server">
</antcall>
<sequential>
<echo taskname="waitfor" message="Wait for proxy server launch" />
<waitfor maxwait="1" maxwaitunit="minute" checkevery="100">
<http
url="http://localhost:4444/selenium-server/driver/?cmd=testComplete" />
</waitfor>
<antcall target="run-tests">
</antcall>
<antcall target="stop-selenium-server">
</antcall>
</sequential>
</parallel>
</target>
</project>
Ant脚本具有三个目标。 第一个目标start-selenium-server
,以派生和衍生模式启动Selenium服务器,使其在后台运行。 run-tests
目标实际上执行JUnit测试,而stop-selenium-server
目标通过调用向服务器发送关闭命令的URL来停止服务器。
使用像这样的Ant脚本,您可以通过调度它们或在持续集成工具中使用Ant脚本以自动化的方式运行Selenium测试。 请参阅相关信息的链接,约持续集成构建的更多信息。
在其他浏览器中运行测试
到目前为止,在本示例中,测试都是在Firefox中执行的。 但是,有时可能需要在其他浏览器中测试Web应用程序,以确保功能可以在所有浏览器中正常工作。
您可能已经注意到,当在JUnit测试的setUp()
方法中设置Selenium测试时, *chrome
被作为第二个参数传递给父对象的setUp()
方法。 此参数启动Firefox浏览器的实例。
要针对其他浏览器运行测试,只需提供浏览器名称作为第二个参数。 例如, *iexplore
使用Internet Explorer而不是Firefox作为浏览器。 对于Opera浏览器使用*opera
或对于Apple Safari使用*safari
。
请注意,运行测试的操作系统必须支持浏览器。 如果尝试对操作系统上不存在的浏览器执行测试(例如,运行Linux®的系统上的*safari
或*iexplore
,则会出现异常,因此测试失败。
结论
本文介绍了Selenium及其两个组件:Selenium IDE和Selenium RC。 Selenium IDE是开始为Web应用程序编写测试的简便方法。 Selenium RC是一个组件,您可以使用它添加功能并自动执行测试。
从浏览器角度看,自动化的Web应用程序测试可能是增加覆盖应用程序其他部分的现有单元测试的好方法。 通过自动测试,开发人员可以更快地获得有关问题的反馈,并且测试回归速度更快。
翻译自: https://www.ibm.com/developerworks/web/library/wa-testweb/index.html
selenium rc使用