RESTful接口测试——接口测试方法论(15)

发表于:2022-8-24 09:42

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

 作者:陈磊    来源:51Testing软件测试网原创

  5.1.2  RESTful接口测试
  RESTful风格的接口与测试工程师有什么关系呢?要想真正理解RESTful风格的接口与测试工程师的关系,就必须先弄清楚RESTful风格的接口有什么优点。如果您用螺丝、钉子和板材等一系列原材料组装过家具,那么肯定看到过各种千奇百怪的螺丝,比如一字螺丝、十字螺丝、三角螺丝、六角螺丝等。为了加固这些各式各样的螺丝,您需要准备各式各样的螺丝刀。因此,您的工具箱会被不同规格和大小的螺丝刀填满。不知道您是不是和作者一样,面对塞满螺丝刀的、乱七八糟的工具箱,心里也会非常烦躁。后来,作者在商场看到一款螺丝刀,它虽然只有一个刀柄,但提供了包含各种形状和大小的一整套螺丝刀刀头。这样在使用时,只需要根据螺丝的规格,选择相同形状的螺丝刀刀头就可以了。与此同时,将它们放在工具箱里又显得十分整齐。如果后面需要使用其他特殊形状的螺丝刀,那么只需要购买与刀柄连接口一样的螺丝刀刀头就可以了,而不用再买一款螺丝刀。
  如果您理解了上述场景,那么应该也能够很好地理解RESTful风格的接口。REST指的是一组架构约束条件和设计原则,其本质是为了让访问者依据URI就可以找到资源,然后通过简单的输入和输出完成与服务的交互。
  REST所约束的每一个URI都是独一无二的资源,可通过HTTP方法进行资源操作,实现表现层的状态转移。这就像螺丝刀刀头一样,待解决的问题就像螺丝,每一个接口只面向一种特定的资源,而不用管其他接口的处理方式,这样您就能够一目了然地知道该用哪种螺丝刀刀头固定哪种螺丝了,从而降低接口开发的复杂度。
  软件开发人员只需要遵循RESTful规范并按照一定的内部定义开发外部接口,就能形成像螺丝刀刀头一样轻便的接口并对外提供服务。现在的很多项目中,无论是服务器端和服务器端的调用,还是前端和服务器端的调用,通常会采用RESTful风格来设计接口。
  对于测试工程师来说,RESTful风格的接口使用的仍是之前的访问模式,它们同样是HTTP接口,并且同样可以使用我们之前封装的框架来完成接口测试任务。但是,RESTful接口测试与前面讲过的HTTP接口测试是有一些区别的,因而我们需要对现有的框架做一些修改,以便更好地支持RESTful接口测试。
  现在,您明白了RESTful接口测试和HTTP接口测试有很大的关系,那么RESTful接口测试和HTTP接口测试又有什么区别呢?两个关键点——数据交换的承载方式和操作方式需要特别关注。
  下面我们先讲讲数据交换的承载方式。RESTful风格的接口主要以JSON(JavaScript Object Notation)格式进行数据交换。回顾前面一直作为SUT(被测系统)使用的Battle系统,您一定在Battle系统的Readme.md文件中看到过请求正文和响应正文中有关数据部分的一些定义,那就是JSON。虽然Battle系统并不算严格使用RESTful接口,但是在数据交换的承载方式上,Battle系统模仿了RESTful风格。
  下面我们再讲讲数据交换的操作方式。在Battle系统中,我们仅仅使用了HTTP的GET和POST两种基本操作;但在RESTful风格的接口中, HTTP的4种基本操作都会被用到,比如,GET操作用来获取资源,POST操作用来新建或更新资源,PUT操作用来更新资源,DELETE操作用来删除资源等。
  在弄清楚RESTful风格的接口和普通的HTTP接口的区别后,大家需要想一想自己的框架需要添加什么内容才能支持RESTful风格的接口。内容的添加方法有两种——借助外力或自行封装。在这里,对于第一个RESTful风格的接口来说,数据交换的承载方式是JSON,Battle系统使用的数据格式也是JSON,虽然全部操作都是参数拼凑的过程,但这足以满足需求。
  这时,如果还需要拼凑更多复杂的数据,就需要使用JSON字符串并进行对象实体的转换。JSON是一种轻量级的数据交换格式,不仅相对简捷,而且可以清晰地描述数据的结构和类型。JSON格式的数据既能让人轻松地阅读,又方便机器解析和网络传输。在HTTP中,如果要传输JSON格式的数据,那么MIME类型必须是“application/json”)。对象实体的转换也就是对象实体的序列化和反序列化。在接口测试过程中,我们很多时候遇到的入参以及返回的参数是JSON格式的,但JSON格式的字符串在代码中并不是以字符串的方式进行处理的,而需要转换成一些特有的对象以完成一些内部操作,这个过程就称为序列化和反序列化。那么,序列化和反序列化到底是什么意思呢?下面我们用生活中的一个小例子进行解释。
  假设您在商场里看中一款衣柜,但这款衣柜很大,为了方便运输,需要将其拆成可以重组的零件,等送到家里后再重新组装。您和商家商量后,决定由商家将这款衣柜拆成可以重组的零件并送到您家里,然后由您自己重新组装。商家把衣柜拆成各个零件并打包的过程就是“序列化”,在代码中相当于把一些对象转换成JSON等格式的字符串;而由您使用这些零件重新组装衣柜的过程就是“反序列化”,在代码中相当于把JSON等格式的字符串转换成对象。
  序列化:将对象转换为便于传输的格式。
  反序列化:将序列化的数据恢复为对象。
  在Python中,序列化是指将Python对象转换成JSON格式的字符串,反序列化则是指将JSON字符串转换回Python对象。Python为此提供了JSON库,在通过JSON库进行序列化后,列表或字典就会转换成字符串类型;在进行反序列化后,JSON字符串则会转换成列表或字典。下面介绍如何使用JSON库进行序列化和反序列化,我们以在CSDN网站上搜索性能关键字后返回的JSON字符串为例(可以看到头信息中包含“application/json”),如代码清单5-1所示。
代码清单5-1
  运行结果如下。
  为了让框架快速完成序列化和反序列化操作,建议在代码中导入JSON库。现在,我们已经可以借助开源库来解决数据交换的问题了。但是,RESTful接口和普通的HTTP接口相比还有一个明显的区别,那就是RESTful接口规定了HTTP的每一个方法都必须做固定的事情,而我们原有框架中的Common类只支持GET和POST方法。因此,我们还需要在Common类中添加对DELETE和PUT方法的支持,如代码清单5-2所示。
代码清单5-2
  从上述代码可以看出,为了实现HTTP的PUT和DELETE方法,我们自行封装了put()和delete()函数。其实,为了实现RESTful风格的接口测试,只需要封装HTTP对应的方法就可以了,这样您的框架就能完美地支持RESTful风格的接口了。完成以上操作后,Common类便既可以完成HTTP接口测试,也可以完成RESTful接口测试。
查看接口测试方法论》全部连载章节
版权声明:51Testing软件测试网获得作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号