zoukankan      html  css  js  c++  java
  • testNG小试牛刀

        testNG是一个测试框架,其灵感来自JUnit和NUnit的,但引入了一些新的功能,使其功能更强大,使用更方便。

        testNG是一个开源自动化测试框架;testNG表示下一代。 testNG是类似于JUnit(特别是JUnit 4),但它不是一个JUnit扩展。它的灵感来源于JUnit。它的目的是优于JUnit的,尤其是当测试集成的类。 testNG的创造者是Cedric Beust(塞德里克·博伊斯特)

        testNG消除了大部分的旧框架的限制,使开发人员能够编写更加灵活和强大的测试。 因为它在很大程度上借鉴了Java注解annotation(JDK5.0引入的)来定义的测试,它也可以告诉你如何使用这个新功能在真实的Java语言生产环境中。

    testNG的特点:

    • 注解

    • testNG使用Java和面向对象的功能

    • 支持综合类测试(例如,默认情况下,没有必要创建一个新的测试每个测试方法的类的实例)

    • 独立的编译时间测试代码运行时配置/数据信息

    • 灵活的运行时配置

    • 主要介绍“测试组”。当编译测试,只要问testNG运行所有的“前端”的测试,或“快”,“慢”,“数据库”等

    • 支持依赖测试方法,并行测试,负载测试,局部故障

    • 灵活的插件API

    • 支持多线程测试

     

      testNG.xml文件记录了一些非常简单的术语。xml是一个以XML记录所有测试的文件口这个文件能够很容易地在一个文件中描述所有测试套件和它们的参数,可以将它签人到代码库中,或通过电子邮件发送给其他组员。也可以很容易地提取测试的子集,或分成几种运行时配置。这个文件并不是运行testNG所必须的。

      一个suite(套件)由一个或多个测试组成。

      一个test(测试)由一个或多个类组成。

      一个class(类)由一个或多个方法组成。

    testNG相对于junit的一些优点:

      1. testNG是一个设计用来简化广泛的测试需求的测试框架,从单元测试到集成测试这个是testNG设计的出发点,不仅仅是单元测试,而且可以用于集成测试。设计目标的不同,对比junit的只适合用于单元测试,testNG无疑走的更远。可以用于集成测试,这个特性是我选择testNG的最重要的原因。

      2. 测试的过程的三个典型步骤,注意和junit(4.0)相比,多了一个将测试信息添加到testng.xml文件或者build.xml测试信息尤其是测试数据不再写死在测试代码中,好处就是修改测试数据时不需要修改代码/编译了,从而有助于将测试人员引入单元测试/集成测试。

      3. 基本概念,相比junit的TestCase/TestSuite,TestNG有suite/test/test method三个级别,即将test/test method明确区分开了。

    基本使用:

      1、异常处理

         testNG可以简单方便的检测异常的发生,通过@ExpectedExceptions标注预期捕获的异常,当确实发生预期的异常,testNG认为测试通过。也可以指定标注多个异常。

    @Test (expectedExceptions={Exception.class,Exception2.class})

    使用这个来支持异常的测试有两个优点:

    • 使我们的意图变得非常清楚,只要看下@test就知道将会发生什么

    • 消除了try、catch、fail空语句给代码带来的干扰,让代码注重于业务逻辑。

    像一次抛出多个异常,我们还是没有办法决定具体是那个异常没有抛出,这样就会想到分开测试单个异常。如:

    测试类中的每个方法只关注一个非常具体的任务,这符合软件过程原则,单一职责原则。

    2、失败处理
         当testNG运行的case有失败的时候,会在test-output目录下生成一个testng-failed.xml文件,这对于批量执行测试定位问题很有帮助,testng可以单独执行这些失败的测试。

    有以下测试文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public class testngTest {
     
        @Test
        public void depend(){
     
        }
     
        @Test(dependsOnMethods = "depend")
        public void f(){
            throw new RuntimeException();
        }
     
        @Test
        public void failed(){
            throw new RuntimeException();
        }
    }

    产生的testng-failed.xml:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
    <suite guice-stage="DEVELOPMENT" name="Failed suite [Default suite]">
      <test name="Default test(failed)">
        <classes>
          <class name="com.wt.others.testngTest">
            <methods>
              <include name="failed"/>
              <include name="depend"/>
              <include name="f"/>
            </methods>
          </class<!-- com.wt.others.testngTest -->
        </classes>
      </test<!-- Default test(failed) -->
    </suite<!-- Failed suite [Default suite] -->

    说明这failed和f方法都失败了,由于f方法依赖了depend的方法,所以depend方法也被列出来。不仅包含失败的方法,也包含它所依赖的方法。

    那么修改之后,只需要运行这个文件就能够很容易的调试失败的测试方法。

    3、使用参数

      testNG传参数的两种方式(xml文件,@DataProvider)

    • 使用testng.xml设置参数

       参数在xml文件中可以在suite级别定义,也可以在test级别定义;testNG会尝试先在包含当前类的test标签中寻找参数,如果没找到则在上层的suite标签中查找。即在test标签中相同的参数对当前类当前方法的优先级比较高。 testNG支持这种传参方式的类型如下:String、 int/Integer、boolean/Boolean、 byte/Byte、 char/Character、 double/Double、 float/Float、 long/Long、 short/Short。对于非上述类型TestNG无法通过这种方式进行传参,可以通过@DataProvider方式传参

    •  DataProvider方式传参

           只提供了一个字符串属性:名称,供测试方法作为传递参数的annotation使用两种DataProvider,一种是返回一个二维数组对象,如上面的例子;另外一种DataProvider是返回一个Iterator,DataProvider可以向测试方法传递任意类型任意数目的参数,利用DataProvider提供不同的参数集合对一个测试方法进行多次调用。

    4、Annotation

      快速预览,这些可以在官方的文档上找到更详细的资料。

      @BeforeSuite:        被注释的方法将在所有测试运行前运行
      @AfterSuite:        被注释的方法将在所有测试运行后运行
      @BeforeTest:        被注释的方法将在测试运行前运行
      @AfterTest:        被注释的方法将在测试运行后运行
      @BeforeGroups:        被配置的方法将在列表中的gourp前运行。这个方法保证在第一个属于这些组的测试方法调用前立即执行。
      @AfterGroups:        被配置的方法将在列表中的gourp后运行。这个方法保证在最后一个属于这些组的测试方法调用后立即执行。
      @BeforeClass:        被注释的方法将在当前类的第一个测试方法调用前运行。
      @AfterClass:        被注释的方法将在当前类的所有测试方法调用后运行。
      @BeforeMethod:        被注释的方法将在每一个测试方法调用前运行。
      @AfterMethod:        被注释的方法将在每一个测试方法调用后运行。

    5、分组

      testNG的annotation有分组的功能,这些分组的名称和编号完全由我们自己来决定。@Test(groups={"fast","database"})定义了分组之后可以在排除或者运行某个组。testNG容许执行复杂的测试方法分组。不仅可以申明方法属于组,而且可以指定分组包含其他分组。然后TestNG可以被调用,并被要求包含某些分组和排除其他的分组。这将提供怎样划分测试的最大弹性,并且如果想运行两个不同的测试装置不需要重新编译。

    6、依赖

      有些时候,需要测试方法按照一个特定的顺序被调用。这非常有用,比如:
         *在运行更多测试方法前确认特定数量的测试方法调用完成并且成功
        *初始化测试并希望这个初始化方法也作为测试方法(被标记为@Before/After的方法将不作为最终报告的一部分)

      为了做到这点,需要使用@Test注解的dependsOnMethods属性或者dependsOnGroups属性。

      这里有两种依赖:
         * 强依赖。在运行你的测试方法前所有依赖方法必须运行并且成功。哪怕有一个依赖方法失败,测试方法都不会被调用,在报告中将被标记为SKIP。
         * 软依赖。测试方法在依赖方法运行后总是会被运行,即使某些依赖方法失败。对于只想确认测试方法是按照特定顺序运行,而测试方法并不真正依赖其他方法是否成功的情况下非常有用。软依赖通过在@Test注解中增加"alwaysRun=true"来实现。

      除了上面基本的使用之外还有,testNG在并发测试、异步测试和多线程测试方面的应用等等。

     

      关于testng的使用可以参考官方文档:http://testng.org/doc/documentation-main.html

      这是看了《java测试新技术--testng》这本书的一点记录,虽没有全部理解,但是对于很多部分还是了解理解了。知道有这么个东西。

  • 相关阅读:
    opencv ImportError: libSM.so.6: cannot open shared object file: No such file or directory
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcd
    Linux卸载并更新显卡驱动
    人脸识别
    dav转mp4
    python调用c++接口,参数为opencv读取数据
    Linux下内存泄漏工具valgrind
    模型轻量化
    自动驾驶车搭建
    TSN(Temporal Segment Networks)
  • 原文地址:https://www.cnblogs.com/silence-hust/p/4219869.html
Copyright © 2011-2022 走看看