接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。

 

一、了解一下HTTP与RPC

  1. HTTP(HyperText Transfer Protocol) 

    说明:超文本传输协议,是互联网上应用最为广泛的一种网络协议。

    优点:就是简单、直接、开发方便,利用现成的http协议进行传输。

    流程图:

    

  2. RPC(Remote Procedure Call)

    说明:远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。

    优点:提升系统可扩展性,传输效率更快,安全性更高。

    流程图:

    

 

二、HTTP接口测试

  常见请求类型: post(增)、get(查)、put(改)、delete(删)等。

  1)get型接口

    格式: 请求数参数写在网址后面,用”?”连接,多个参数之间用”&”连接。如:https://api.douban.com/v2/book/search?q=”,这是一个豆瓣查询图书信息的开发api,q=”,单引号里就是查询的参数,

  如查询《小王子》这本书的信息,则q=’小王子’,使用postman工具来试验一下,如下图:

  

    场景: get型接口用于获取信息,多用于查询数据,如列表查询功能,点击查询按钮就调用一个get接口,然后把信息返回出来。

    特点: 请求数据量小,参数暴露于url地址中,故存在安全隐患。

 

  2)post型接口

    说明: 向指定资源位置提交数据(如提交表单、上传文件)来进行请求,post请求可能会导致新资源的建立

    场景: 如注册、上传、发帖等功能,如用户在豆瓣网站对某本书进行收藏、写笔记、发表评论

    特点: 请求数据量大,安全性高

    如豆瓣的发表评论的开放api,见下图:

     

 

  3)put型接口

    说明:  put请求用于向指定资源位置上传最新内容

    场景:  如用户在豆瓣网站修改对某本书的收藏、修改某篇笔记或修改评论

    如豆瓣的修改评论的开放api,见下图:

     

 

  4)delete型接口

    说明: 请求服务器删除请求里url所标识的资源

    场景: 如用户在豆瓣网站取消对某本书的收藏、删除某篇笔记或删除评论

    如豆瓣的删除评论的开放api,见下图:

    

—– 此部分摘抄自:https://blog.csdn.net/github_36032947/article/details/78222654

  

三、RPC接口测试

  1)RPC接口其应用框架比较多,各有特色,广泛使用的有RMI、Hessian、Dubbo等,这次我们主要介绍一下Dubbo框架。

  Dubbo是一个高性能、轻量级的RPC框架。主要提供三个关键功能,包括基于接口的远程调用、容错和负载平衡、以及自动服务注册和发现。

  2)流程图:

   

  3)测试环境搭建:

  a.  pom.xml引入相关service应用jar依赖(示例:)

    <dependencies>
        <dependency>
            <groupId>com.yutong.unicorn</groupId>
            <artifactId>base-service-core</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>com.google.guava</groupId>
                    <artifactId>guava</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.yutong.rauth</groupId>
            <artifactId>ex-rauth-client</artifactId>
            <version>1.0.4</version>
        </dependency>
        <dependency>  
            <groupId>jdk.tools</groupId>  
            <artifactId>jdk.tools</artifactId>  
            <version>1.8</version>  
            <scope>system</scope>  
            <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>  
        </dependency>
    </dependencies>

 

  b.  dubbo服务spring配置(示例:)

<dubbo:application name="extrauth" ></dubbo:application>
<dubbo:registry id="unicorn-base-service" protocol="zookeeper" address="10.8.7.99:2181" />
<dubbo:monitor protocol="registry" />
<dubbo:reference id="authService" interface="com.yutong.rauthority.client.api.AuthService" timeout="30000" retries="0"/>

 

  c.  基于TESTNG数据驱动编写方法(示例:)

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/spring-context.xml"})
@Configuration
//++++++++++++继承方法++++++++++++ public class BaseTestNGTest extends AbstractTestNGSpringContextTests {  
//++++++++++++数据收集++++++++++++ @DataProvider(name = "testdata") public Object[][] dataprovide()throws IOException{   System.out.println("dataprovide");   // return new Object[][]{{2000020013,2},{2001000138,0},{2001000139,2}};   Object[][] testData =ExcelHandle.readXlsx(excel, "sheet2");   return testData; } //++++++++++++数据传递++++++++++++ @Test(dataProvider="testdata") public void test_case_1(HashMap<String, String> map) throws Exception {   operatorUserId=Integer.valueOf(map.get("userId"));   exceptedvalue=Integer.valueOf(map.get("excepted"));   //++++++++++++实际值++++++++++++   Integer actual_value=billService.getUserEmailNameCount(operatorUserId);    //++++++++++++预期值++++++++++++   Integer excepted_value=get_excepted_value(operatorUserId);    //+++++++++++++验证+++++++++++++   Assert.assertEquals(actual_value,exceptedvalue); } }

 

四、接口测试用例设计

五、测试思路总结

  1)查看接口文档,了解接口功能及其业务逻辑

  2)确定接口调用协议(http、rpc等)

  3)确定请求类型(post、get等)

  4)确定请求地址/调用方法

  5)组装请求报文 ☆☆☆☆☆(参考测试设计)

  6)选用适用工具或编写脚本测试

  7)检查返回码,及其描述

  8)检查返回值,及其对应数据库数据变化

 

 

 

—– 以上仅为个人测试经验,当然接口测试不仅仅如此,更多还需要大家自己去发掘,同时欢迎各路大神指点。

 

版权声明:本文为leozhanggg原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/leozhanggg/p/9930741.html