使用Selenium Grid增强Web应用程序的测试

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 Hub,Selenium Hub链接到两个单独的Selenium RC,每个RCs链接到自己的浏览器,浏览器链接到Web应用程序

测试人员可以在不更改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的整个过程。

  1. 在命令行中运行ant(target name) [build file name]
  2. Ant读取build.xml文件以获取项目参数,导入文件,类路径定义,目标定义等。
  3. Ant将Java源代码编译为TestNG类。
  4. Ant专注于要运行的目标并获取目标配置。
  5. 阅读TestNG配置文件以获取参数,测试类名称等。
  6. 按照TestNG配置文件中的配置运行TestNG类。

样本测试用例

本文重点介绍如何使用与TestNG和Ant集成的Selenium Grid并行运行测试,因此我们将使用基于PHP页面的简单应用程序。 测试用例旨在仅单击页面上的选项卡。 图2显示了示例应用程序网页。

图2.应用程序网页的一部分
应用程序网页的屏幕截图,其中包含以下选项卡:测试用例,查看时间,运行脚本,长期运行,LA,s-Cat,Jmeter

清单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和target以及文件build.xml和testing.xml

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控制台
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控制台
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控制台
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值