专栏首页凯哥Java单元测试框架系列教程8-TestNg中的Assertion

单元测试框架系列教程8-TestNg中的Assertion

本篇来介绍TestNG中的Assertion,也是断言。前面介绍了@Test注释下大部分的属性的功能和基本使用。这篇介绍,写测试用例中的断言部分。我们知道,一个测试用例的水平高低,主要是看断言的水平。断言能体现出测试的思维和测试角度,所以断言是测试中最难写的部分,自动化测试用例最难的也是在断言。

举例一个接口测试的常见流程

1) 发送接口请求

2) 断言接口响应状态是不是 200 OK

3) 断言接口的响应时间低于某一个值(看情况,不是必选)

4) 断言响应数据是否正确,一般的做法是判断某一个值是否相等或者包含关系

 基本上就是这么一个测试流程,其中4)部分的断言最难写。因为接口请求回来,会得到很多参数返回,一般是json数据,有些公司只能够对其中几个json字符串进行断言比较,有些能够通过两个json文件对比,一个是直接从数据库请求的json数据文件,一个是接口请求得到的json文件。下面,我们来看看TestNG给我们提供了哪些断言操作。TestNG中最常用的一个断言类是Assert.java,里面有多个静态方法,这个类我们习惯叫硬断言。对应的还有一个软断言的类,叫SoftAssert.java,这个类是需要创建实例对象,才能调用相关实例方法进行软断言。

1. Assert类(硬断言)

1) Assert.assertEquals(actual, expected)

TestNG中提供了多个33个assertEquals()方法,主要是匹配不同的数据类型和集合类操作。我们最常用的就是assertEquals(actual, expected)或者assertEquals(actual, expected,“message1”)

举例:

package testng; import org.testng.Assert; import org.testng.annotations.Test; public class AssertionTest {     @Test public void AssertTest(){         Assert.assertEquals(12,12);         Assert.assertEquals("ABc", "ABC", "not equals");     } }

上面可以看出assertEquals(actual, expected,“message1”)中,如果现实结果和期待结果不相等,抛出断言异常并显示message1的内容,上面红圈就是我们填写的message1的内容。自动化测试一般喜欢带上这个message1,这样抛出错误,更能快速读懂错误的原因和错误的具体业务逻辑。

2) assertEqualsNoOrder((actual, expect)

判断两个对象是否相同,忽略排序位置。例如下面的两个字符串数组比较。

举例

package testng; import org.testng.Assert; import org.testng.annotations.Test; public class AssertionTest {     @Test public void AssertTest(){         String[] st1 = {"Anthony", "Tom", "Jhon"};         String[] st2 = {"Jhon", "Anthony", "Tom"};         Assert.assertEqualsNoOrder(st1, st2, "两个字符串数组不相同");     } }

3) assertFalse(布尔条件,“message1”)

这里来一个断言为假的方法,断言一个条件,如果返回是假,则测试通过,如果返回是真,抛出断言异常,打印message1的内容。

举例:

package testng; import org.testng.Assert; import org.testng.annotations.Test; public class AssertionTest {     @Test public void AssertTest(){         String[] st1 = {"Anthony", "Tom", "Jhon"};         String[] st2 = {"Jhon", "Anthony", "Tom"};         Assert.assertFalse(st1==st2, "两个相等");     } }

上面两个字符串数组,如果考虑排序位置,肯定两者不相等。

4) assertNotEquals(actual, expect, “message1”)

提供“不相等”断言方法,也是有6个针对不同数据类型的不相等的断言方法。这里我们介绍两个对象的不相等举例,如果相等,输出message1的内容。

举例:

package testng; import org.testng.Assert; import org.testng.annotations.Test; public class AssertionTest {     @Test public void AssertTest(){         String[] st1 = {"Anthony", "Tom", "Jhon"};         String[] st2 = {"Jhon", "Anthony", "Tom"};         Assert.assertNotEquals(st1, st2, "两者相等");     } }

5) assertNotNull(object, “message1”)

对象非空判断,断言对象不为空,否则,抛出异常,打印message1的内容。

举例:

package testng; import org.testng.Assert; import org.testng.annotations.Test; public class AssertionTest {     @Test public void AssertTest(){         String[] st1 = {"Anthony", "Tom", "Jhon"};         String[] st2 = {"Jhon", "Anthony", "Tom"};         String[] st3 = null;         Assert.assertNotNull(st1,"该对象为空");         Assert.assertNotNull(st3,"该对象为空");     } }

上面运行后,st3会报断言异常。

6) assertSame(actual, expect, “message”)

断言两个对象相同,这里相同和上面的Equals不同,Equals是值比较,而Same是内存地址比较。直接来看下面例子。

package testng; import org.testng.Assert; import org.testng.annotations.Test; public class AssertionTest {     @Test public void AssertTest(){         String[] st1 = {"Anthony", "Tom", "Jhon"};         String[] st2 = {"Jhon", "Anthony", "Tom"};         String[] st3 = st1;         Assert.assertSame(st1, st3, "not same");         Assert.assertSame(st1, st2, "not same");     } }

7) assertNotSame(actual, expect, “message”)

同样的,也有断言两个对象内存地址不相同的断言方法。

举例:

package testng; import org.testng.Assert; import org.testng.annotations.Test; public class AssertionTest {     @Test public void AssertTest(){         String[] st1 = {"Anthony", "Tom", "Jhon"};         String[] st2 = {"Jhon", "Anthony", "Tom"};         String[] st3 = st1;         Assert.assertNotSame(st1, st2, "same");     } }

上面st1和st2肯定内存地址不相同,所以assertNotSame是运行通过,如果把st2改成st3,这个就会抛出异常并打印same这个字符消息,因为st1和st3指向同一个内存位置。

8) assertTrue(条件表达式, “message1”)

提供了断言一个条件为真的方法,如果条件表达式为真,该断言运行通过,如果表达式为假,抛出异常,打印message1的消息。

举例:

package testng; import org.testng.Assert; import org.testng.annotations.Test; public class AssertionTest {     @Test public void AssertTest(){         String[] st1 = {"Anthony", "Tom", "Jhon"};         String[] st2 = {"Jhon", "Anthony", "Tom"};         String[] st3 = st1;         Assert.assertTrue(st1==st3, "两者不相同");     } }

2. SoftAssert(软断言)

在Assert.java这个类中,上面我们已经介绍了大部分的断言方法。这些断言方法都是叫硬断言。硬断言就是,如果运行到折行断言失败,即使该用例,后面还有其他代码行,也不会继续执行下去。有时候我们不希望这种情况出现,SoftAssert就很好地帮我们解决了这个问题。

SoftAssert的特点

1) 如果一个断言失败,会继续执行这个断言下的其他语句或者断言。

2) 也就是一个用例有多个断言,失败了其中一个,不影响其他断言的运行

3) 不要忘记调用assertAll()在该用例的最后一个断言后面。

举例:

package testng; import org.testng.annotations.Test; import org.testng.asserts.SoftAssert; public class AssertTestDemo {     @Test public void testSoftAssert(){         System.out.println("Test start");         SoftAssert assertion = new SoftAssert();         assertion.assertEquals(12, 13,"两者不相等");         System.out.println("Test complete");         System.out.println(3+8);         assertion.assertAll();     } }

运行结果:

通过运行结果截图,我们可以看到在断言12和13相等的这行代码后面还有其他的语句,如果这里采用的是Hard Assert,那么Test complete 和 11是不会输出,也就是代码没有被执行。这个就是SoftAssert的优点,再强调一次,最后一定要调用assertAll()方法。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 紧急预警:wls9_async_response.war组件漏洞的延续

    原文:http://www.enmotech.com/web/detail/1/725/1.html    (打开浏览器,复制链接即可)

    数据和云01
  • java.lang.UnsupportedOperationException解决方法

    在项目中对List进行操作时报错java.lang.UnsupportedOperationException,后来发现操作的List是由数组转换而成的,通过看...

    凯哥Java
  • liteos 异常接管(十五)

    异常接管是操作系统对在运行期间发生异常的情况进行处理的一系列动作,譬如打印异常发生时当前函数调用栈信息、 cpu现场信息、任务的堆栈情况等。

    233333
  • x64汇编第四讲,c / C++中调用x64汇编

    在x86下,我们的C/C++调用汇编可以直接 __asm进行内联. 或者也可以直接静态链接

    IBinary
  • 原生javascript实现extend

    在extend()函数中没有写死参数,是为了更好的扩展性,永远也不知道需要扩展的对象有几个。 而是通过arguments来获取传进来的参数。

    FinGet
  • 紧急预警:wls9_async_response.war组件漏洞的延续

    墨墨导读:2019 年 6 月 19 日,Oracle 官方正式发出通告,weblogic 存在一个最新的高位漏洞 cve-2019-2729。此漏洞来源于 O...

    数据和云
  • 勒索病毒的前因后果

    最近,一种电脑勒索病毒席卷了全球几十个国家。美国、俄罗斯、中国,欧洲国家的Windows电脑受创最重。

    南山南的杨先生
  • Electron问题解决小集合

    再小的个体,也有大大的能量,上一篇从Haskell讲到函数式的精髓:“大事化小,小事化无”,问题总是有的,解决之道,就是从这些小小的集合中,蕴含着。

    icepy
  • Oracle 11gR2 RAC 集群服务启动与关闭总结

    引言:这篇文章主要是介绍了 Oracle RAC 集群服务的启动与关闭顺序,很多初学者不太理解 RAC,对 RAC 知识了解甚少,对其启动与关闭的顺序和原理不...

    JiekeXu之路

扫码关注云+社区

领取腾讯云代金券