关于TestNG,也是一边学一边总结,对于TestNG和Junit的比较其实也没有什么意义,都是一种测试框架,都是为了应用而生的东西,没有必要说谁好谁不好了。用的熟练用的好就是真的好啊。
下面简单的总结了些关于TestNG的基本使用方法,如果说的不明白或者有错误的地方,还望大家不要手下留情了。尽情拍砖,使劲的拍。。。。
首先我们得了解一下关于TestNG的几种注释方法(都是从官网上翻译的,有问题迫切希望大家指正),了解以后往下走会越来越顺的。
@BeforeSuite(执行集合之前执行的方法,它的优点我觉得应该体现在运行配置文件的时候,同时添加多个class,然后让有关的class同时运行进行测试)
@AfterSuite(执行完所有的测试集合以后运行的方法)
@BeforeClass(当前所在类的测试带@Test注释的方法运行之前运行一次)
@AfterClass (当前所在类的测试全部运行完以后运行一次)
@BeforeTest (带有@Test注释的方法运行之前都会运行一次beforeTest中的方法)
@AfterTest (带有@Test注释的方法运行之后都会运行一次afterTest中的方法)
@BeforeMethond(在每个测试的方法之前运行一次)
@AfterMethond(在每个测试的方法运行之后运行一侧)
@BeforeGroups(结合在配置文件中使用,每个组运行之前运行一次)
@AfterGroups(结合在配置文件中使用,每个组运行之后运行一次)
@Test(表明这是一个测试用例的方法)
上面个都是一些最基本的注释方法,接下来可以看到稍微复杂点的注释,就是关于参数化和监控之类的注释:
@Listeners(相当于监控类,主要监控suite method 之类的相关动作,它主要是实现ISuiteListener,ITestListener,IInvokedMethodListener这三个对象,然后重写他们的相关方法)
@DataProvider(数据提供,以数组的形式来提供数据,实现数据的参数化)
@Parameters (结合配置文件来提供数据,实现数据的参数化)
我门在学习TestNG时,其实TestNG最大的优点我觉得应该体现在它的Suite XML文件上,如果我们想同时运行几个测试类,这个时候我们不需要像JUnit那样在类里面定义Suite类了,TestNG将Suite从类里面分离出来了,它是直接写在一个XML文件中的。
为了更好的理解上面几种注释方法,下面直接在Suite XML配置文件中定义来对他们进行了解,我觉得这样理解起来或许会更快一点。
首先我们看看Suite XML文件的基本格式:
<!-- suite name 自己定义,没有任何限制 --> <suite name="xxx"> <!-- test name 也是自己定义的,名称不做任何限制 --> <test name="xxx"> <!-- classes name 也是自己定义的,名称不做任何限制 --> <classes name="xxx"> <!-- 可以添加多个class,然后同时运行这几个测试类--> <class name="packageName.className1"/> <class name="packageName.classNam2"/> </classes> </test> </suite>
Group的使用(结合下面的代码可以看出,当运行suiteXML文件的时候只有在组里面的测试用例才能被执行,在运行这个测试之前就会调用@BeforeGroups中的方法,运行完这个测试之后就会运行@AfterGroups这个方法)
@Test(groups={"test1"}) public void testMethond6(){ System.out.println("testMethond6"); } @Test (groups={"test2"}) public void testMethond7(){ System.out.println("tsetMethond7"); }
Suite XML 文件:
<suite name="xxx"> <test name="xxx"> <gropus name="xxx"> <run> <include name="test1" /> </run> </groups> <classes name="xxx> <class name="className"> </class> </classes> </test> </suite>
当我们运行上面的Suite XML文件的时候,只有被定义为test1的Group,方法“testMethond6”才会被执行,通过Group的控制,我们可以自定义一个测试类中需要运行的方法。
关于DataProvider的使用(通过下面的代码展现):
定义好DataProvider,然后将数据以数组的形式写到数组里面,在测试方法中直接调用DataProvider中定义好的数据:
@DataProvider(name="data1") public static Object[][] getData(){ return new Object[][] {{"user1","password1"},{"user2","password2"},{"user3","password3"}}; } @Test(dataProvider="data1") public void testMethond8(String userName, String password){ System.out.println("The UserName is:"+userName); System.out.println("The Password is:"+password); }
关于参数化(Parameters)的使用,在suiteXML文件中定义好数据,然后直接通过value-key对应的方式得到相关的数据。
@Test @Parameters({"username","password"}) public void testMethond9(String userName, String password){ System.out.println("The UserName is:"+userName); System.out.println("The Password is:"+password); }
Suite XML:
<suite name="testNG2"> <paremeter name="username", value="liangtao1"></paremeter> <paremeter name="password",value="password1"></paremeter> <paremeter name="username", value="liangtao2"></paremeter> <paremeter name="password",value="password2"></paremeter> <test name="testNG2"> <classes> <class name="study.testNG.TestListener"></class> </classes> </test> </suite>