51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1762|回复: 0
打印 上一主题 下一主题

testNG框架从入门到精通

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-4-10 15:18:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TestNG介绍

TestNG是Java中的一个测试框架, 类似于JUnit 和NUnit,   功能都差不多, 只是功能更加强大,使用也更方便

Java中已经有一个JUnit的测试框架了。  TestNG比JUnit功能强大的多。  测试人员一般用TestNG来写自动化
测试。  开发人员一般用JUnit写单元测试。

官方网站: http://testng.org/doc/index.html



在Eclipse中安装TestNG

打开Eclipse   Help ->Install New Software ,   然后Add   "http://beust.com/eclipse"



TestNG最简单的测试

下面是TestNG的最简单的一个例子

  1. package TankLearn2.Learn;

  2. import org.junit.AfterClass;
  3. import org.junit.BeforeClass;
  4. import org.testng.annotations.Test;

  5. public class TestNGLearn1 {

  6.     @BeforeClass
  7.     public void beforeClass() {
  8.         System.out.println("this is before class");
  9.     }

  10.     @Test
  11.     public void TestNgLearn() {
  12.         System.out.println("this is TestNG test case");
  13.     }

  14.     @AfterClass
  15.     public void afterClass() {
  16.         System.out.println("this is after class");
  17.     }
  18. }
复制代码


TestNG的基本注解



注解        描述
@BeforeSuite        注解的方法将只运行一次,运行所有测试前此套件中。
@AfterSuite        注解的方法将只运行一次此套件中的所有测试都运行之后。
@BeforeClass        注解的方法将只运行一次先行先试在当前类中的方法调用。
@AfterClass        注解的方法将只运行一次后已经运行在当前类中的所有测试方法。
@BeforeTest        注解的方法将被运行之前的任何测试方法属于内部类的 <test>标签的运行。
@AfterTest        注解的方法将被运行后,所有的测试方法,属于内部类的<test>标签的运行。
@BeforeGroups        组的列表,这种配置方法将之前运行。此方法是保证在运行属于任何这些组第一个测试方法,
该方法被调用。
@AfterGroups        组的名单,这种配置方法后,将运行。此方法是保证运行后不久,最后的测试方法,该方法属于
任何这些组被调用。
@BeforeMethod        注解的方法将每个测试方法之前运行。
@AfterMethod        被注释的方法将被运行后,每个测试方法。
@DataProvider       
标志着一个方法,提供数据的一个测试方法。注解的方法必须返回一个Object[] [],其中每个对象[]的测试方
法的参数列表中可以分配。
该@Test 方法,希望从这个DataProvider的接收数据,需要使用一个dataProvider名称等于这个注解的名字。
@Factory        作为一个工厂,返回TestNG的测试类的对象将被用于标记的方法。该方法必须返回Object[]。
@Listeners        定义一个测试类的监听器。
@Parameters        介绍如何将参数传递给@Test方法。
@Test        标记一个类或方法作为测试的一部分。


TestNG中如何执行测试

第一种直接执行:右键要执行的方法,  点Run As ->TestNG Test






  1. 第二种:  通过testng.xml文件来执行. 把要执行的case, 放入testng.xml文件中。 右键点击testng.xml,   点Run As

  2. testng.xml

  3. <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
  4. <suite name="Suite1">
  5.     <test name="test12">
  6.         <classes>
  7.             <class name="TankLearn2.Learn.TestNGLearn1" />
  8.         </classes>
  9.     </test>
  10. </suite>


  11. TestNG按顺序执行Case

  12. 在testng.xml中,可以控制测试用例按顺序执行。  当preserve-order="true"是,可以保证节点下面的方法是按顺序执行的

  13. <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" ><suite name="Suite1">
  14.     <test name="test12" preserve-order="true">
  15.         <classes>
  16.             <class name="TankLearn2.Learn.TestNGLearn1">
  17.                 <methods>
  18.                     <include name="TestNgLearn3" />
  19.                     <include name="TestNgLearn1" />
  20.                     <include name="TestNgLearn2" />
  21.                 </methods>
  22.             </class>
  23.         </classes>
  24.     </test></suite>






  25. TestNG异常测试

  26. 测试中,有时候我们期望某些代码抛出异常。

  27. TestNG通过@Test(expectedExceptions)  来判断期待的异常, 并且判断Error Message

  28. package TankLearn2.Learn;

  29. import org.testng.annotations.Test;

  30. public class ExceptionTest {
  31.    
  32.     @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp="NullPoint")
  33.     public void testException(){
  34.         throw new IllegalArgumentException("NullPoint");
  35.     }
  36. }


  37. TestNG组测试

  38. TestNG中可以把测试用例分组,这样可以按组来执行测试用例比如:

  39. package TankLearn2.Learn;

  40. import org.testng.annotations.Test;

  41. public class GroupTest {
  42.    
  43.     @Test(groups = {"systemtest"})
  44.     public void testLogin(){
  45.         System.out.println("this is test login");
  46.     }
  47.    
  48.     @Test(groups = {"functiontest"})
  49.     public void testOpenPage(){
  50.         System.out.println("this is test Open Page");
  51.     }
  52. }


  53. 然后在testng.xml中 按组执行测试用例

  54. <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" ><suite name="Suite1">
  55.     <test name="test1">
  56.         <groups>
  57.         <run>
  58.         <include name="functiontest" />
  59.         </run>
  60.     </groups>
  61.     </test></suite>
复制代码


TestNG参数化测试

软件测试中,经常需要测试大量的数据集。 测试代码的逻辑完全一样,只是测试的参数不一样。  这样我们就
需要一种 “传递测试参数的机制”。 避免写重复的测试代码

TestNG提供了2种传递参数的方式。

第一种: testng.xml 方式使代码和测试数据分离,方便维护

第二种:@DataProvider能够提供比较复杂的参数。 (也叫data-driven testing)




  1. 方法一: 通过testng.xml 传递参数给测试代码

  2. package TankLearn2.Learn;

  3. import org.testng.annotations.Parameters;
  4. import org.testng.annotations.Test;

  5. public class ParameterizedTest1 {
  6.    
  7.     @Test
  8.     @Parameters("test1")
  9.     public void ParaTest(String test1){
  10.         System.out.println("This is " + test1);
  11.     }
  12. }
  13. testng.xml

  14. <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" ><suite name="Suite1">
  15.         <parameter name="test1" value="Tank" />
  16.         <parameter name="test1" value="Xiao" />
  17.     <test name="test12">
  18.         <classes>
  19.             <class name="TankLearn2.Learn.ParameterizedTest1" />
  20.         </classes>
  21.     </test></suite>


  22. 方式二:   通过DataProvider传递参数

  23. package TankLearn2.Learn;

  24. import org.testng.annotations.DataProvider;
  25. import org.testng.annotations.Test;

  26. public class DataProviderLearn {
  27.    
  28.     @DataProvider(name="user")
  29.     public Object[][] Users(){
  30.         return new Object[][]{
  31.                 {"root","passowrd"},
  32.                 {"cnblogs.com", "tankxiao"},
  33.                 {"tank","xiao"}
  34.         };
  35.     }
  36.    
  37.     @Test(dataProvider="user")
  38.     public void verifyUser(String userName, String password){
  39.         System.out.println("Username: "+ userName + " Password: "+ password);
  40.     }
  41. }


  42. TestNG忽略测试

  43. 有时候测试用例还没准备好, 可以给测试用例加上@Test(enable = false),  来禁用此测试用例

  44. package TankLearn2.Learn;

  45. import org.testng.annotations.Test;

  46. public class TesgNGIgnore {
  47.    
  48.     @Test(enabled = false)
  49.     public void testIgnore(){
  50.         System.out.println("This test case will ignore");
  51.     }
  52. }
复制代码


TestNG 依赖测试

有时候,我们需要按顺序来调用测试用例,  那么测试用例之间就存在依赖关系。 TestNG支持测试用例之间的依赖

  1. package TankLearn2.Learn;

  2. import org.testng.annotations.Test;

  3. public class DependsTest {
  4.    
  5.     @Test
  6.     public void setupEnv(){
  7.         System.out.println("this is setup Env");
  8.     }
  9.    
  10.     @Test(dependsOnMethods = {"setupEnv"})
  11.     public void testMessage(){
  12.         System.out.println("this is test message");
  13.     }
  14. }
复制代码


TestNG测试结果报告

测试报告是测试非常重要的部分.  

TestNG默认情况下,会生产两种类型的测试报告HTML的和XML的。 测试报告位于 "test-output" 目录下.



当然我们也可以设置测试报告的内容级别.

verbose="2" 标识的就是记录的日志级别,共有0-10的级别,其中0表示无,10表示最详细

  1. <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" ><suite name="Suite1">
  2.     <test name="test12" verbose="2">
  3.         <classes>
  4.             <class name="TankLearn2.Learn.TestNGLearn1" />
  5.         </classes>
  6.     </test></suite>
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-9-20 21:26 , Processed in 0.063424 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表