Selenium远程控制(RC)是Selenium项目的一组工具的一部分,是针对Web应用程序的自动化测试框架。 Selenium RC支持许多编程语言和几乎所有浏览器。 Selenium RC的最重要的优点是驱动浏览器的方法。 与其他Web UI自动化工具不同,Selenium RC通过JavaScript驱动浏览器,因此测试不会因鼠标事件而中断。 测试人员可以在测试运行时执行其他任务。
Selenium Grid通过在不同服务器上并行运行测试来扩展Selenium RC。 它减少了在多种操作系统下在各种浏览器中进行测试所需的时间,从而减少了成本。
Selenium工具套件是开源项目,具有有限的正式文档和指导,因此学习曲线可能会很陡峭。 在本文中,了解有关使用Selenium Grid(版本1.0.6)进行测试,使用Java进行编程以及如何与TestNG测试框架一起运行的知识。
Selenium网格
Selenium Grid具有两个组件:Selenium Hub和远程控制。 集线器接收来自测试的请求(与Selenium RC相同),然后将注册到集线器的远程控制分配给每个测试,如图1所示:
图1.Selenium网格中Selenium Hub和Selenium RC的关系
测试人员可以在不更改Selenium Grid的代码的情况下运行测试。 整个过程是透明的; 测试人员不需要了解或关心实际的基础架构。
如果您熟悉Selenium RC,则可以使用Selenium Grid轻松运行测试。 您还可以在多台计算机上并行运行现有代码,从而节省了测试执行时间并快速获得测试结果的反馈。 但是,Selenium Grid本身不提供并行运行策略。 如果要利用Selenium Grid,则需要以并行模式编写Selenium测试。
准备使用Selenium网格
要开始使用Selenium Grid,首先需要下载并安装它(请参阅参考资料中的链接)。 Selenium Grid是一个文件夹,其中包含库JAR文件,示例文件,Ant的构建文件和其他文件。 要在Selenium Grid中运行测试,您将需要:
- Ant,版本1.7或更高版本,用于编译,组装,测试和运行Java应用程序(在构建文件中作为目标和扩展点进行了描述)。
- JDK 5+。
- Selenium RC的基本知识,因为Selenium Grid基于Selenium RC。 (请参阅相关主题有关SeleniumRC信息)。 测试人员应该知道如何使用Selenium RC编写和运行测试。
本文中的示例使用Java技术和TestNG作为编程语言和测试框架。 TestNG旨在简化广泛的测试需求并扩展JUnit。 (请参阅相关主题有关TestNG的更多信息。)一个简单的TestNG的配置文件清单1所示。
清单1.简单的TestNG配置文件
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite1" parallel="methods" thread-count="2">
<test name="Testcase20" >
<classes>
<class name="com.test.workflow.device.testcase20"/>
</classes>
</test>
</suite>
<suite>
标记可以表示一个包含一个或多个测试的TestNG XML文件。 <test>
标记允许一个测试包含一个或多个TestNG类。 <class>
标记表示TestNG类可以包含一个或多个测试方法。 (参见相关主题 。关于标签的更详细信息)的测试方法是用Java文件中定义,如清单2中:
清单2. Java文件中定义的测试方法
@Test
public void testMethod()
{
....
}
测试人员使用Java编程语言和测试框架来编写测试脚本,并使用Ant从命令行运行TestNG类。 让我们看一下使用Ant运行TestNG的整个过程。
- 在命令行中运行
ant(target name) [build file name]
。 - Ant读取build.xml文件以获取项目参数,导入文件,类路径定义,目标定义等。
- Ant将Java源代码编译为TestNG类。
- Ant专注于要运行的目标并获取目标配置。
- 阅读TestNG配置文件以获取参数,测试类名称等。
- 按照TestNG配置文件中的配置运行TestNG类。
样本测试用例
本文重点介绍如何使用与TestNG和Ant集成的Selenium Grid并行运行测试,因此我们将使用基于PHP页面的简单应用程序。 测试用例旨在仅单击页面上的选项卡。 图2显示了示例应用程序网页。
图2.应用程序网页的一部分
清单3提供了选项卡的示例源代码。
清单3.选项卡的源代码
<div class="Tabs" style="width: 100%;">
<a class="Current">Test Case</a>
<a>View Time</a>
<a>Run Scripts</a>
<a>Long Run</a>
<a>LA</a>
<a>s-CAT</a>
<a>Jmeter</a>
</div>
测试机准备如下。
知识产权 | 操作系统类型 |
---|---|
9.181.138.75 | 赢2003 |
9.181.138.186 | 赢2003 |
9.181.128.184 | 的Linux |
将测试文件夹(其内容如图3所示)放在selenium-grid-1.0.6目录中。
图3.测试用例文件夹的内容
src目录包含Java源代码文件。 目标目录包含编译后的所有类文件和报告文件。 清单4中显示的build.xml文件是一个Ant构建文件,它定义了目标配置。 它包括要调用的TestNG配置文件,项目参数,lib文件路径等。 testng.xml文件是示例测试用例的TestNG配置文件。
清单4. build.xml
<project name="Selenium Grid Test" default="run" basedir=".">
<description>Selenium Grid Test</description>
<property name="rootdir" value="${basedir}/.."/>
<property file="${rootdir}/project.properties"/>
<property name="name" value="Selenium Grid Demo"/>
<property name="artifact" value="selenium-grid-demo"/>
<property name="version" value="SNAPSHOT"/>
<property name="selenium.version" value="SET ME"/>
<property name="build.src" location="src"/>
<import file="${rootdir}/lib/build/common-build.xml" />
<path id="compile.classpath">
<fileset dir="${rootdir}/vendor">
<include name="selenium-java-client-driver-${selenium.version}.jar"/>
<include name="testng-5.7-jdk15.jar"/>
<include name="commons-logging-1.0.4.jar"/>
</fileset>
<pathelement location="${rootdir}/tools/target/classes"/>
<pathelement location=
"${rootdir}/tools/target/dist/lib/selenium-grid-tools-standalone-${version}.jar"/>
<pathelement location="${rootdir}/lib/selenium-grid-tools-standalone-${version}.jar"/>
<pathelement path="${java.class.path}/"/>
</path>
<path id="runtime.classpath">
<path refid="compile.classpath"/>
<pathelement path="${build.output}/"/>
</path>
<target name="run" depends="compile" description="test">
<java classpathref="runtime.classpath"
classname="org.testng.TestNG"
failonerror="true">
<sysproperty key="java.security.policy" file="${rootdir}/lib/testng.policy"/>
<arg value="-d" />
<arg value="${basedir}/target/reports" />
<arg value="-suitename" />
<arg value="suite1" />
<arg value="testng.xml"/>
</java>
</target>
<target name="build" depends="compile"/>
<target name="dist" depends="build"/>
<target name="coverage-analysis" />
</project>
运行样本测试用例
现在已经设置了环境和测试数据,您可以运行三种不同的并行测试方案:
在服务器上的不同浏览器中运行相同案例
要在服务器上的不同浏览器中运行相同的测试用例,请转到Selenium Grid分发目录:
ant launch-hub
在同一台计算机或另一台计算机上的新窗口中,输入以下任一内容:
ant launch-remote-control
ant Denvironment=*iehta launch-remote-control
要么
ant -Dhost=9.181.138.186 DhubURL=http://9.181.138.75:4444 launch-remote-control
ant -Dhost=9.181.138.186 DhubURL=http://9.181.138.75:4444
-Denvironment=*iehta launch-remote-control
在浏览器中,返回集线器的控制台,网址为http:// localhost:4444 / console。 现在,您应该列出了两个可用的远程控件,类似于图5 。
图4. Selenium Grid Hub控制台
将清单5中的测试类源代码放在src目录中。
清单5.测试用例Java源代码
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.thoughtworks.selenium.DefaultSelenium;
import com.thoughtworks.selenium.Selenium;
import org.testng.annotations.Parameters;
public class GridTest2 {
String url = "http://9.181.138.186/index.php";
private Selenium selenium= null;
@Parameters({ "bs" })
@BeforeClass
public void startBroswer(String broswer)
{
selenium= new DefaultSelenium("localhost", 4444, broswer, url);
selenium.start();
selenium.open(url);
selenium.windowMaximize();
}
@Test
public void test() throws InterruptedException
{
selenium.click("xpath=//a[contains(text(),\'LA\')]");
Thread.sleep(10000);
}
@AfterClass
public void clear() {
selenium.stop();
}
}
更改testng.xml的内容,如清单6所示:
清单6. TestNG配置文件内容
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="suite1" verbose="1" annotations="JDK" parallel="tests" thread-count="2">
<test name="test1">
<parameter name="bs" value="*firefox"/>
<classes>
<class name="GridTest2" />
</classes>
</test>
<test name="test2">
<parameter name="bs" value="*iehta"/>
<classes>
<class name="GridTest2" />
</classes>
</test>
</suite>
testng.xml文件中的bs
参数定义test1在Firefox浏览器中运行,而test2在Internet Explorer中运行。 parallel
属性定义测试并行运行。 thread-count
属性定义要运行的线程数。 仅定义了两个测试,因此两个测试将同时运行。
打开一个窗口,然后转到测试目录:
ant run
测试用例将自动运行。
不同案例在不同浏览器中的不同服务器上并行运行
要在不同浏览器的不同服务器上并行运行不同的测试用例,请转到Selenium Grid分发目录:
ant launch-hub
在同一台计算机上的新窗口或另一台计算机上的窗口中,输入:
ant launch-remote-control
ant Dport=6666 Denvironment=*iehta launch-remote-control
在计算机9.181.138.186的窗口中,输入:
ant -Dhost=9.181.138.186 DhubURL=http://9.181.138.75:4444 launch-remote-control
在计算机9.181.138.184上的窗口中,输入:
ant -Dhost=9.181.138.184 DhubURL=http://9.181.138.75:4444 launch-remote-control
在浏览器中,返回集线器的控制台,网址为http:// localhost:4444 / console。 现在,您应该列出了四个可用的遥控器。 它看起来应该类似于图5。
图5. Selenium Grid Hub控制台
将清单7中的测试类源代码放在src目录中。
清单7.测试用例Java源代码
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.thoughtworks.selenium.DefaultSelenium;
import com.thoughtworks.selenium.Selenium;
public class GridTest2(3/4) {
String url = "http://9.181.138.186/index.php";
private Selenium selenium= null;
@Parameters({ "bs" })
@BeforeClass
public void startBroswer()
{
selenium= new DefaultSelenium("localhost", 4444, broswer, url);
selenium.start();
selenium.open(url);
selenium.windowMaximize();
}
@Test
public void test() throws InterruptedException
{
selenium.click("xpath=//a[contains(text(),\'View Time\')]");
//any code is ok
Thread.sleep(10000);
}
@AfterClass
public void clear() {
selenium.stop();
}
}
更改testng.xml文件的内容,如清单8所示:
清单8. TestNG配置文件内容
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="suite1" verbose="1" annotations="JDK" parallel="tests" thread-count="2" >
<test name="test2" junit="false" >
<parameter name="bs" value="*iehta"/>
<classes>
<class name="GridTest2" />
</classes>
</test>
<test name="test3" junit="false">
<parameter name="bs" value="*firefox"/>
<classes>
<class name="GridTest3" />
</classes>
</test>
<test name="test4" junit="false">
<parameter name="bs" value="*firefox"/>
<classes>
<class name="GridTest4" />
</classes>
</test>
</suite>
因为仅定义了两个线程,所以只能同时运行两个测试用例。 尽管有四个远程控件,但集线器将选择RC1运行GridTest2,并选择其余两个远程控件中的任何一个运行GridTest3和GridTest4。 两个测试的并行运行是随机的。 图6显示了集线器的运行状态。
图6. Selenium Grid Hub控制台
如果要一次运行所有这三个测试,只需将thread-count
更改为3。
不同的方法使用相同的浏览器在不同的服务器上并行运行
要在同一浏览器中的不同服务器上并行运行不同的测试用例,请转到Selenium Grid分发目录:
ant launch-hub
在机器9.181.138.186上打开一个窗口,然后输入:
ant -Dhost=9.181.138.186 DhubURL=http://9.181.138.75:4444 launch-remote-control
在计算机9.181.138.184上的窗口中,输入:
ant -Dhost=9.181.138.184 DhubURL=http://9.181.138.75:4444 launch-remote-control
在浏览器中,返回集线器的控制台,网址为http:// localhost:4444 / console。 现在您应该列出三个或四个可用的遥控器。 将清单9中的测试类源代码放在src目录中。
清单9.测试用例Java源代码
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.thoughtworks.selenium.DefaultSelenium;
import com.thoughtworks.selenium.Selenium;
import static com.thoughtworks.selenium.grid.tools.
ThreadSafeSeleniumSessionStorage.closeSeleniumSession;
import static com.thoughtworks.selenium.grid.tools.
ThreadSafeSeleniumSessionStorage.session;
import static com.thoughtworks.selenium.grid.tools.
ThreadSafeSeleniumSessionStorage.startSeleniumSession;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Parameters;
public class GridTest {
String url = "http://9.181.138.186/index.php";
private Selenium selenium;
@BeforeMethod(alwaysRun = true)
protected void startSession() {
startSeleniumSession("localhost", 4444, "*firefox", url);
selenium = session();
selenium.open("/");
selenium.windowMaximize();
}
@AfterMethod(alwaysRun = true)
protected void closeSession() {
closeSeleniumSession();
}
@Test
public void test() throws InterruptedException
{
selenium.click("xpath=//a[contains(text(),\'View Time\')]");
Thread.sleep(10000);
}
@Test
public void test2() throws InterruptedException
{
selenium.click("xpath=//a[contains(text(),\'LA\')]");
Thread.sleep(10000);
}
@Test
public void test3() throws InterruptedException
{
selenium.click("xpath=//a[contains(text(),\'Test Case\')]");
Thread.sleep(10000);
}
}
更改testng.xml文件的内容,如清单10所示。
此源代码与常见的SeleniumRC脚本非常不同。 由于方法应单独运行,因此它将Selenium对象初始化为会话对象,因此Selenium应该在方法之前启动会话,并在方法之后关闭会话。
清单10. TestNG配置文件内容
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="suite1" verbose="1" parallel="methods" thread-count="2">
<test name="test" junit="false">
<classes>
<class name="GridTest" />
</classes>
</test>
</suite>
parallel
属性更改为methods
,这意味着该类中的方法将并行运行。 这些类将按顺序运行。
查看测试结果
查看测试结果非常容易。 转到build.xml文件中定义的目标文件夹,然后转到reports文件夹。 打开index.html,然后单击套件名称链接。 您应该看到结果,如图7所示,这是第三个测试样本的结果。
图7.测试结果
有关更多详细信息,请单击左侧的时间顺序链接。 您可以获取详细信息,如图8所示:
图8.详细的测试结果
结论
在本文中,您学习了如何使用Selenium Grid并行运行Selenium测试。 使用Selenium Grid进行自动化的Web应用程序测试可以节省大量时间并节省资源。 例如,如第二种情况所述,如果一个测试人员拥有100个测试用例并配置10个线程来运行测试用例,则将节省10倍的工作量和时间。 当然,遥控器的数量是有限的。
并行测试还可以使回归测试更加方便。 希望您可以利用本文中学到的知识,并有效地加快Web应用程序的测试速度。
翻译自: https://www.ibm.com/developerworks/web/library/wa-seleniumgrid/index.html