进一步去看测试结果,首先找到项目所在的文件夹,发现有一个test-output的文件夹:
在其下的Suite文件夹下打开“Test.html”:
之后就可以看到测试结果了(红色的为失败,绿色的为通过):
当有多个classes需要测试的情况,这里拿两个classes举例,新创建一个class名为NewTest2,将上面NewTest类的代码复制粘贴进NewTest2类中,如下:
package forTestNg; import java.util.logging.Level; import java.util.logging.Logger; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import userInfo.UserInfo; public class NewTest2 { public WebDriver webDriver; UserInfo usrInfo = new UserInfo(); @Test public void testA() throws InterruptedException { waitForLinkText(webDriver, "登录"); webDriver.findElement(By.linkText("登录")).click(); waitForId(webDriver, "input1"); webDriver.findElement(By.id("input1")).sendKeys(usrInfo.usrName); webDriver.findElement(By.id("input2")).sendKeys(usrInfo.pwd); webDriver.findElement(By.id("signin")).click(); System.out.println("Login successfully."); } @Test public void testB() throws InterruptedException { waitForLinkText(webDriver, "登录"); webDriver.findElement(By.linkText("登录")).click(); waitForId(webDriver, "input1"); webDriver.findElement(By.id("input1")).sendKeys(usrInfo.usrName); webDriver.findElement(By.id("input2")).sendKeys(usrInfo.pwd); webDriver.findElement(By.id("signin")).click(); System.out.println("Login successfully."); } @BeforeMethod public void beforeMethod() { System.out.println("Before method."); webDriver = new FirefoxDriver(); String url = "http://cnblogs.com"; webDriver.get(url); System.out.println("Navigate successfully."); } @AfterMethod public void afterMethod() { System.out.println("After method."); webDriver.quit(); System.out.println("Quit successfully."); } private static void waitForId(WebDriver webDriver, String id) throws InterruptedException { try { Thread.sleep(1000); webDriver.findElement(By.id(id)); } catch (Exception e) { Logger log = Logger.getLogger("lavasoft"); log.setLevel(Level.INFO); log.info(e.toString()); } } private static void waitForLinkText(WebDriver webDriver, String linkText) throws InterruptedException { try { Thread.sleep(1000); webDriver.findElement(By.linkText(linkText)); } catch (Exception e) { Logger log = Logger.getLogger("lavasoft"); log.setLevel(Level.INFO); log.info(e.toString()); } } }
然后将xml文件进行修改,如下,修改了test的名字,将Test改为了Test1,并新加了Test2:
<?xml version="1.0" encoding="UTF-8"?> <suite name="Suite" parallel="false"> <test name="Test1" preserve-order="true"> <classes> <class name="forTestNg.NewTest" /> <methods> <include name="testB" /> <include name="testA" /> </methods> </classes> </test> <!-- Test --> <test name="Test2" preserve-order="true"> <classes> <class name="forTestNg.NewTest2" /> <methods> <include name="testA" /> <include name="testB" /> </methods> </classes> </test> <!-- Test --> </suite> <!-- Suite -->
可以看出,在xmlTest.xml文件中新增了一个名为Test2的test,class的名字为forTestNg.NewTest2,里面的方法执行顺序为先testA后testB,和Test1中类的方法执行顺序正好相反。然后右键点击xmlTest.xml文件,选择Run As->TestNG Suite。之后测试就会自动按照先执行Test1再执行Test2的顺序进行了。Test1中先testB后testA,Test2中先testA后testB。从Console可以看出运行结果:
也可以从Results of running suite中查看测试的执行顺序和结果:
在项目的test-output\Suite文件夹下可以看到各个test的测试结果,每个test都对应有一个html格式的测试结果report:
忽略测试——被指定忽略的test方法在自动化执行测试的过程中将不被执行,即——被忽略,我们只需要修改想要忽略的test方法的Annotation信息。这里拿NewTest1和NewTest2这两个类中的testB方法举例,我们想要在执行过程中忽略执行方法testB,只需要将两个类中testB的Annotation信息修改如下:
@Test(enabled = false) public void testB() throws InterruptedException { waitForLinkText(webDriver, "登录"); webDriver.findElement(By.linkText("登录")).click(); waitForId(webDriver, "input1"); webDriver.findElement(By.id("input1")).sendKeys(usrInfo.usrName); webDriver.findElement(By.id("input2")).sendKeys(usrInfo.pwd); webDriver.findElement(By.id("signin")).click(); System.out.println("Login successfully."); }
这里,“@Test(enabled = false)”的意思就是让testB方法在执行过程中被忽略执行,也就是不执行的意思。再执行xmlTest.xml文件,我们可以从测试结果看出,这两个被指定忽略的方法并没有在本次测试中执行(两个类中都只执行了testA方法):
组测试——顾名思义,就是将测试分组,测试是针对方法的测试,那么分组也是针对方法的分组。我们需要做的还是修改待测方法的Annotation与xmlTest.xml文件的内容。在NewTest类中修改待测方法的Annotation如下:
@Test(groups = {"loginTest"}) public void testA() throws InterruptedException { waitForLinkText(webDriver, "登录"); webDriver.findElement(By.linkText("登录")).click(); waitForId(webDriver, "input1"); webDriver.findElement(By.id("input1")).sendKeys(usrInfo.usrName); webDriver.findElement(By.id("input2")).sendKeys(usrInfo.pwd); webDriver.findElement(By.id("signin")).click(); System.out.println("Login successfully."); } @Test(groups = {"loginErrorTest"}) public void testB() throws InterruptedException { waitForLinkText(webDriver, "登录"); webDriver.findElement(By.linkText("登录")).click(); waitForId(webDriver, "input1"); webDriver.findElement(By.id("input1")).sendKeys(usrInfo.usrName); webDriver.findElement(By.id("input2")).sendKeys(usrInfo.pwd); webDriver.findElement(By.id("signin")).click(); System.out.println("Login successfully."); }
在NewTest2类中修改待测方法的Annotation如下:
@Test(groups = { "loginTest" }) public void testA() throws InterruptedException { waitForLinkText(webDriver, "登录"); webDriver.findElement(By.linkText("登录")).click(); waitForId(webDriver, "input1"); webDriver.findElement(By.id("input1")).sendKeys(usrInfo.usrName); webDriver.findElement(By.id("input2")).sendKeys(usrInfo.pwd); webDriver.findElement(By.id("signin")).click(); System.out.println("Login successfully."); } public void testB() throws InterruptedException { waitForLinkText(webDriver, "登录"); webDriver.findElement(By.linkText("登录")).click(); waitForId(webDriver, "input1"); webDriver.findElement(By.id("input1")).sendKeys(usrInfo.usrName); webDriver.findElement(By.id("input2")).sendKeys(usrInfo.pwd); webDriver.findElement(By.id("signin")).click(); System.out.println("Login successfully."); }
将NewTest和NewTest2这两个类中的BeforeMethod方法和AfterMethod方法也一同加进组里,否则会抛空指针异常:
@BeforeMethod(groups = { "loginTest", "loginErrorTest" }) public void beforeMethod() { System.out.println("Before method."); webDriver = new FirefoxDriver(); String url = "http://cnblogs.com"; webDriver.get(url); System.out.println("Navigate successfully."); } @AfterMethod(groups = { "loginTest", "loginErrorTest" }) public void afterMethod() { System.out.println("After method."); webDriver.quit(); System.out.println("Quit successfully."); }
对于组方法中调用的其他方法,我们不需要做处理(不需要把组方法中调用的方法也加进组)。
然后我们对xmlTest.xml文件进行修改,只保留一个test,将两个class都放进去。在test中增加groups,指定执行属于loginTest组的方法。修改如下:
<?xml version="1.0" encoding="UTF-8"?> <suite name="Suite" parallel="false"> <test name="Test" preserve-order="true"> <groups> <run> <include name="loginTest" /> </run> </groups> <classes> <class name="forTestNg.NewTest" /> <class name="forTestNg.NewTest2" /> </classes> </test> <!-- Test --> </suite> <!-- Suite -->
之后我们再执行xmlTest.xml文件,结果如下:
我们可以看出,只有组方法(testA)才被执行了,不在组中的方法均没有被执行(组方法中调用的方法除外)。
同Ant的结合使用——首先下载一个Ant,解压缩zip文件,这里我将解压后的apache-ant-1.9.6文件夹放在“D:\”目录下:
之后要配置环境变量,仍然是:
1、创建一个环境变量叫ANT_HOME,值为路径“D:\apache-ant-1.9.6”;
2、修改Path变量,追加值“%ANT_HOME%\bin”;
3、修改CLASSPATH变量,追加值“%ANT_HOME%\lib”。
然后在Eclipse中项目上点击右键,选择Export:
然后选择General下的Ant Buildfiles->Next->Finish:
之后我们可以看到在项目的目录下,自动创建出了一个叫build.xml的文件:
上述是告诉你怎么用Eclipse自动生成build.xml文件,然并卵,我们还是需要把如下的代码替换上去:
<project name="TestNGTest" default="test" basedir="."> <!-- Define <testng> task --> <taskdef name="testng" classname="org.testng.TestNGAntTask"> <classpath> <pathelement location="libs/testng-6.9.9.jar" /> </classpath> </taskdef> <property name="testdir" location="src/forTestNg" /> <property name="srcdir" location="src" /> <property name="libdir" location="libs" /> <property name="full-compile" value="true" /> <path id="classpath.base" /> <path id="classpath.test"> <fileset dir="${libdir}"> <include name="**/*.jar" /> </fileset> <pathelement location="${testdir}" /> <pathelement location="${srcdir}" /> <path refid="classpath.base" /> </path> <target name="clean"> <delete verbose="${full-compile}"> <fileset dir="${testdir}" includes="**/*.class" /> </delete> </target> <target name="compile" depends="clean"> <javac srcdir="${srcdir}" destdir="${testdir}" verbose="${full-compile}"> <classpath refid="classpath.test" /> </javac> </target> <target name="test" depends="compile"> <testng outputdir="${testdir}" classpathref="classpath.test"> <xmlfileset dir="${srcdir}" includes="xmlTest.xml" /> </testng> </target> </project>
这里要非常注意:
1)修改taskdef中的location为testng jar包在项目中的相对路径,这里为“libs/testng-6.9.9.jar”;
2)修改property的值,这里修改了两处,一处是testdir的location,填写的是待测包的路径“src/forTestNg”。另一处是libdir的location,填写的是放jar包的路径“libs”;
3)最后一个target中xmlfileset的includes的值,我们要修改为“xmlTest.xml”,这是我们的TestNG xml文件的名字。
都改好后就可以在PowerShell中利用Ant来进行自动化测试了:
1)首先要cd到项目所在的路径下:
2)然后输入ant,执行测试:
但是我们注意到测试结果是失败的:
仔细看,可以发现是因为linkText的value乱码导致的,这是Ant编译时的中文乱码问题,需在build.xml文件中调用javac的地方加入encoding的参数值,解决方法如下:
<target name="compile" depends="clean"> <javac encoding="utf-8" srcdir="${srcdir}" destdir="${testdir}" verbose="${full-compile}"> <classpath refid="classpath.test" /> </javac> </target>
我们把compile这个target中的javac标签赋予了一个encoding参数,并赋值为“uft-8”,意即中文编码模式。这样就OK了,我们再输入ant,敲回车,执行测试:
测试全部通过啦~这就是使用Ant与TestNG一起来执行自动化测试的方法。
相关阅读:TestNG测试框架在基于Selenium进行的web自动化测试中的应用(上篇)
网易云新用户大礼包:https://www.163yun.com/gift
本文来自天外归云的博客园,经作者蓝天祐授权发布。