你必须要掌握的测试利器——TestNG

发表于:2017-7-03 10:20

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:技术进阶之路    来源:简书

#
TestNG
  是时候告别Junit了!
  一、 青出于蓝而胜于蓝
  TestNG是一款脱胎于JUnit和NUnit的测试框架,借鉴了后者的设计思想,在此基础上又引入了新的功能,比如分组测试、依赖测试、多线程测试等。
  TestNG除了支持单元测试外,还可以用来做集成测试、功能测试、端到端测试等等,而junit只是用来单元测试。
  二、 TestNG优于JUnit的设计详解
  1.分组测试
  分组测试可以很方便让你去指定你需要测试的某一批次的测试用例,我们可以使用@Test注解里的groups属性为某个测试方法指定一个或多个group,示例代码如下
  public class TestExample {
   @Test(groups = "group1")
   public void test1(){
       Assert.assertEquals(1+1,2);
   }
   @Test(groups = "group1")
   public void test2(){
       Assert.assertEquals(1+2,3);
   }
   @Test(groups = "group2")
   public void test3(){
       Assert.assertEquals(1+3,4);
   }
  }
  另外我们还需要建立一个testng.xml文件,去指定要运行的分组测试。
 <!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
  <suite name="My test suite">
      <test name="testing">
          <groups>
              <run>
                  <include name="group1"/>
              </run>
          </groups>
          <classes>
              <class name="com.example.Boot.test.TestExample" />
          </classes>
      </test>
  </suite>
  2.参数化测试
  所谓参数化测试就是为测试用例提供参数数据,示例如下:
  @Test(dataProvider = "data")
  public void hello(String name){
      Assert.assertEquals(name,"world");
  }
  @DataProvider(name = "data")
  public Object[][] data(){
      return new Object[][]{{"world"}};
  }
  3.依赖测试
  当两个测试用例之间存在依赖关系,TestNG支持你使用注解l指定依赖关系。
 @Test
  public void insert(){
      System.out.println("insert data");
  }
  @Test(dependsOnMethods = "insert")
  public void query(){
      System.out.println("query data");
  }
  上面的代码,如果query方法依赖的insert方法执行失败了,则query方法则将被跳过。如果insert失败了,还想要执行query方法的话,则可以在@Test中添加
  alwaysRun = true的属性
  需要说明的是这个用法不能用于单元测试,单元测试要求用例之间是隔离的,这也是为什么JUnit没有提供这个功能的原因。在集成测试等场景中需要的话则可以使用。
  4.多线程测试
  并发测试一直是测试的难点,TestNG提供了一套多线程执行测试用例的的方案,给并发测试带来了很大的方便。
 @Test(threadPoolSize = 5,invocationCount = 30,timeOut = 100)
  public void multiThreadTest(){
       Long id = Thread.currentThread().getId();
       System.out.println("thread  id: " + id);
  }
  threadPoolSize 指线程数量,invocationCount表示测试用例调用的次数,timeOut表示超时阀值
  5.按优先级顺序测试
  @Test 提供了一个很有用的priority属性来指定测试用例执行的优先级,数值越低,优先级越高。这个在测试流程的时候很有用!
 public class PriorityTest {
      @Test(priority = 1)
      public void priority1(){
          System.out.println("登录");
      }
      @Test(priority = 2)
      public void priority2(){
          System.out.println("首页");
      }
      @Test(priority = 0)
      public void priority0(){
          System.out.println("注册");
      }
  }
  6.更丰富的注解
  三、拥抱TestNG
  从上面的介绍可以看到,TestNG相比JUnit提供了更全面的功能,更适用于互联网环境下的各个测试场景。而JUnit的定位仅仅是单元测试! 因此建议TestNG 作为 Java 项目的主要单元测试框架!
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号