• 2
  • 8
分享
  • ​9个小案例,教你学会接口测试(基础篇)
  • 恬恬圈 2019-10-31 13:42:23 字数 7654 阅读 4477 收藏 8

有很多小伙伴想要基础版本,从0到1,今天它来了~用十个特别简单的案例,让你清晰的从0到1接触到接口测试。最好自己动手去写一遍,光看是不行的。从刚开始特别简单的案例,到最后略有难度的接口小案例,让你快速清晰的学习接口!对于接口测试,很多同学可能会说接口真的有测试的必要吗?我只把功能测试好了不就ok了吗?

答案当然是否定的,接口测试的重要性如下:


微信图片_20191031131027.png

那么接口提测的标准是什么呢?首先对于接口文档的要求如下:

接口类型

  • 输入参数

  • 每个参数名;

  • 每个参数类型;

  • 每个参数业务含义;

  • 每个是否可空;

  • 每个字段长度(可选,一般需要提供,有严格要求的字段需特别注明);

接口通用基本要求:

  • 返回json字段信息,不可出现 关键字类型,如  object,interface,public,java等各类语言代码中关键字类型

  • 涉及金额等信息时应采取加密方式,后端需进行校验,防止通过接口拦截造成损失

  • HTTPS方式传输

  • 请求方式,一般获取数据是get,提交表单是post

  • 信息存取可采取对称加密和非对称加密的结合(可选,也可选一种)

  • 接口进行手机号正则验证,字符串和上传文件图片等提前规划大小限制

  • 检查数据正确性,每个接口从数据存取数据等是否正确,是否在正确的数据库表取数据等

  • 为空等验证一定要做,正确状态码和错误状态码一定全部记录下来,状态码代表的意思等

以上是小白自己总结和平常工作整理的,如有不对请大家指正,希望和大家一起学习进步,共同成长,谢谢。

接下来用几个特别简单的案例,来接触学习接口测试之旅吧。

如果你是第一次接触开发语言也不要紧,多写多思考,没有人天生就会写代码,都是慢慢学习出来的,在这里python环境如何搭建等就不在累述了,网上能搜到很多如何安装资料。

建议如下:

  • 使用最新的python版本进行学习

  • 代码一定要多写多练多思考

学习心得,两个点第一点,多去思考,第二点多敲。

环境:python3.7版本
系统:w7
工具:PyCharm


1.第一个案例(发送一个get请求)

# coding=utf-8
import requests
# 请求的链接
url = 'http://suggest.taobao.com/sug?code=utf-8&q=裤子&callback=cb 用例'
# 发送get请求
r = requests.get(url)
# 请求的状态码 200代表成功
status = r.status_codeprint(status)
# 请求的内容
j = r.json()
print(j)

输出结果如下:

微信图片_20191031131427.png


2.第二个案例(发送一个post请求)

# 请求的链接
url = 'http://suggest.taobao.com/sug'
# post请求以字典格式传入
data = {'code': 'utf-8', 'q': '裤子', 'callback': 'cb 用例'}
# 发送post请求
r = requests.post(url, data)
# 请求的状态码 200代表成功
status = r.status_code
print(status)
# 请求的内容
print(r.content)

输出结果如下:

2.png

(接口只返回了一个b,这里只需要明白遇到post接口怎么去请求就好了~)


3.第三个案例(进行接口状态码断言)

# coding=utf-8
import requests
# 请求的链接
url = 'http://suggest.taobao.com/sug?code=utf-8&q=裤子&callback=cb 用例'
# 发送请求
r = requests.post(url)
# 请求的状态码 200代表成功
status = r.status_code
# 进行接口的状态码断言,等于200则认为通过,不是200不通过
if status == 200:
    print('用例测试通过')
else:
    print('测试不通过')
print(status)
# 请求的内容
j = r.json()
print(j)

输出结果如下:

1.png


4.第四个案例(进行接口内容断言-正常情况)

# coding=utf-8
import requests
# 请求的链接
url = 'http://suggest.taobao.com/sug?code=utf-8&q=裤子&callback=cb 用例'
# 发送请求
r = requests.post(url)
# 请求的状态码 200代表成功
status = r.status_code
# 进行接口的状态码断言,等于200则认为通过,不是200不通过
if status == 200:
    print('用例测试通过')
else:
    print('测试不通过')
print(status)
# 请求的内容
j = r.json()
# 判断接口返回内容里面,有没有 裤子女夏 内容
if '裤子女夏' in str(j):
    print('存在此数据')
else:
    print('不存在此数据')
print(j)

输出结果如下:

2.png


5.第五个案例(进行接口内容断言-异常情况)

在这里修改了上面的 裤子女夏 修改为 裤子女夏1

# coding=utf-8
import requests
# 请求的链接
url = 'http://suggest.taobao.com/sug?code=utf-8&q=裤子&callback=cb 用例'
# 发送请求
r = requests.post(url)
# 请求的状态码 200代表成功
status = r.status_code
# 进行接口的状态码断言,等于200则认为通过,不是200不通过
if status == 200:
    print('状态码校验过')
else:
    print('状态码校验不通过')
print(status)
# 请求的内容
j = r.json()
# 判断接口返回内容里面,有没有 裤子女夏 内容
# 裤子女夏  增加了一个1
if '裤子女夏1' in str(j):
    print('存在此数据')
else:
    print('不存在此数据')
print(j)

输出结果如下:

1.png


6.第六个案例(接口的小封装-接口和逻辑代码分开控制-~)

增加config.py主要存放接口

# coding=utf-8
# baseurl 一般接口都是分测试接口和正式接口的,只需要修改ip即可
baseurl = 'http://suggest.taobao.com'
# 假装是登录接口 baseurl=于楼上
url_login = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'
# 假装是注冊接口
url_register = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'
# 假装是首页接口
url_home = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'

增加testapi.py

# coding=utf-8
import requests
# 引入config配置接口的文件
import config
# 发送请求 使用config.来调用想要的接口 调用首页接口
r = requests.get(config.url_home)
# 请求的状态码 200代表成功
status = r.status_code
# 进行接口的状态码断言,等于200则认为通过,不是200不通过
if status == 200:
    print('状态码校验过')
else:
    print('状态码校验不通过')
print(status)
# 请求的内容
j = r.json()
# 判断接口返回内容里面,有没有 裤子女夏 内容
# 裤子女夏  增加了一个1
if '裤子女夏1' in str(j):
    print('存在此数据')
else:
    print('不存在此数据')
print(j)

输出结果如下:

2.png

用心的同学已经发现了,这样的话每次接口变了链接等,只需要修改config文件即可 不用去逻辑代码里面去找了。


7.第七个案例(接口的小封装-接口和逻辑代码分开控制-~)

不知道有没有同学发现,如果是post接口的话,参数还是需要在逻辑代码单独写吗?接下来咱们解决这个事情~~,参数也进行分离化。

config.py进行修改如下

# coding=utf-8
# baseurl 一般接口都是分测试接口和正式接口的,只需要修改ip即可
baseurl = 'http://suggest.taobao.com'
# 假装是登录接口
url_login = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'
# 假装是注冊接口 假装是post请求 拼接成字典格式,通过吗,通过key value的形式获取
# 注册接口是key  链接是value
url_register = {'注册接口': baseurl + '/sug', 'parmras': {'code': 'utf-8', 'q': '裤子', 'callback': 'cb 用例'}}
# 假装是首页接口
url_home = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'

testapi.py 修改如下:

# coding=utf-8
import requests
# 引入config配置接口的文件
import config
# 发送post请求,通过config文件获取接口url 和接口的参数 ,如果参数更改了,咱们就修改config文件就可以了
r = requests.post(config.url_register['注册接口'], config.url_register['parmras'])
# 请求的状态码 200代表成功
status = r.status_code
# 进行接口的状态码断言,等于200则认为通过,不是200不通过
if status == 200:
    print('状态码校验过')
else:
    print('状态码校验不通过')
# 输出状态码
print(status)
# 因为展示测试的接口没有json,所以只能输出content啦~
print(r.content)

输出结果:

1.png


8.第八个案例(接口的小封装-执行多个接口~)

这次只需要修改testapi.py即可,代码如下:

# coding=utf-8
import requests
# 引入config配置接口的文件
import config
# 测试注册接口的函数
def test_register():
    # 发送post请求,通过config文件获取接口url 和接口的参数 ,如果参数更改了,咱们就修改config文件就可以了
    r = requests.post(config.url_register['注册接口'], config.url_register['parmras'])
    # 请求的状态码 200代表成功
    status = r.status_code
    # 进行接口的状态码断言,等于200则认为通过,不是200不通过
    if status == 200:
        print('状态码校验过')
    else:
        print('状态码校验不通过')
    # 输出状态码
    print(status)
    # 因为展示测试的接口没有json,所以只能输出content啦~
    print(r.content)
# 测试登录接口的函数
def test_login():
    # 因为发送的get请求,参数是跟在接口的后面的,所以不用通过字典的形式获取
    r = requests.post(config.url_login)
    # 请求的状态码 200代表成功
    status = r.status_code
    # 进行接口的状态码断言,等于200则认为通过,不是200不通过
    if status == 200:
        print('状态码校验过')
    else:
        print('状态码校验不通过')
    # 输出状态码
    print(status)
    # 因为展示测试的接口没有json,所以只能输出content啦~
    print(r.json())
    # 预期结果 在接口返回结果后,查看接口里面有没有此值,也就是传说的断言了
    expected = '裤子男夏季'
    # 将接口返回的信息转为字符串类型,in 是判断接口的返回值里面 存不存在 预期结果的值,存在就通过 不存在就不通过
    if expected in str(r.json()):
        print('断言通过')
    else:
        print('断言不通过')
# 调用执行测试接口
test_register()
print('执行了 测试注册接口的函数')
# 调用执行登录接口
test_login()
print('执行了 测试登录接口的函数')

总结:本次使用函数体的小知识点,和调用函数的小知识,如果感觉到自己不会学习赶紧去补充下自己的知识吧~输出结果如下:

1.png


9.第九个案例(接口的小封装-增加)

本次引用unittest测试框架,进行断言

testapi.py修改如下

# coding=gbk
import requests
# 引入config配置接口的文件
import config
# 增加单元测试框架
import unittest
from applet import HMLRunner
"""
注意事项:unittest这个框架只支持test开头的函数体才会去执行哦
"""
# 创建一个类型,执行用例的类,继承unittest的testcase类
class Testcase(unittest.TestCase):
    # 测试注册接口的函数
    def test_register(self):
        # 发送post请求,通过config文件获取接口url 和接口的参数 ,如果参数更改了,咱们就修改config文件就可以了
        r = requests.post(config.url_register['注册接口'], config.url_register['parmras'])
        # 请求的状态码 200代表成功
        status = r.status_code
        # 使用unittest的断言
        self.assertEqual(200, r.status_code)
        # 输出状态码
        print(status)
        # 因为展示测试的接口没有json,所以只能输出content啦~
        print(r.content)
        print(r.text)
    # 测试登录接口的函数
    def test_login(self):
        # 因为发送的get请求,参数是跟在接口的后面的,所以不用通过字典的形式获取
        r = requests.post(config.url_login)
        # 请求的状态码 200代表成功
        status = r.status_code
        # 使用unittest的断言
        self.assertEqual(200, r.status_code)
        # 输出状态码
        print(status)
        print(r.json())
        # 预期结果 在接口返回结果后,查看接口里面有没有此值,也就是传说的断言了
        expected = '裤子男夏季'
        # 获取接口的返回信息
        j = r.json()
        # 输出接口的返回信息
        print(j)
        # 进行断言操作和接口的返回值,expected是预期结果是咱们提前知道的内容想去判断接口里面有没有此值
        # j['result'][1][1]是接口返回的一个,因为接口第一次是字典,所以通过key去取,里面嵌套是数组格式~
        self.assertEqual(expected, j['result'][1][0])
        print(r.text)
if __name__ == '__main__':
    import time
    # 定义测试用例的目录为当前目录
    test_dir = './'
    # 加载测试用例,根据文件路径 执行test开头的py文件
    discover = unittest.defaultTestLoader.discover(test_dir, pattern='test*.py')
    # 按照一定的格式获取当前的时间
    now = time.strftime("%Y-%m-%d %H-%M-%S")
    # 定义报告存放路径 目前是存在运行的当前目录
    filename = now + 'test_result.html'
    # 打开file文件流
    fp = open(filename, "wb")
    # 定义测试报告
    runner = HMLRunner.HTMLTestRunner(stream=fp,
                                      title=u"测试报告(史无前例)",
                                      description=u"测试用例执行情况")
    # 运行测试
    runner.run(discover)
    # 关闭报告文件
    fp.close()

执行结果如下:

6.png

看到 Ran 2 tests in 0.212s

意思是执行了两个用例,用时0.212秒


本文为51Testing经授权转载,转载文章所包含的文字来源于作者:寻鱼的猫。如因内容或版权等问题,请联系51Testing进行删除。原文链接:https://www.jianshu.com/p/eac7a9d2327f

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 1、AOP相关术语Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring 只支持方法类型的连接点。(业务层接口中所有的方法)Pointcut(切入点):所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义(被增强的方法)所有的切入点都是连接点。Advice(通知/增强):所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知,通知的类型:前置通知,后置通知,异常通知,最终通知,环绕通知。Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下, Introduction 可以在运行期为类动...
            0 0 968
            分享
          • 1、引言我们今天来看看Locust如何自定义客户端测试系统的 ,由于基础内容,在第一章节,已经介绍完。所以本章内容,就是实例展示!!2、实例展示2.1 定义Locust以HTTP为主要目标构建。但是,通过编写触发request_success 和request_failure事件的自定义客户端,可以轻松扩展对任何基于请求/响应的系统进行负载测试。2.2 客户端代码展示我们使用User类XmlRpcUser的示例,来看看XmlRpcUser如何发送请求。老规矩,上代码# -*- coding:utf-8 -*- # @Time  &nb...
            1 1 14201
            分享
          •   前言  我在做51Testing讲堂以及和参加讲堂的同学们在微信群里互动的时候,有个同学提出最好能在安全工具当中集成扫描功能,这个建议勾起了我的兴趣,下面大家将会看到的扫描器,就这么出炉了。  扫描器的设计思想是:灵活、易扩展、易修改。  灵活的意思就是可单独执行专项漏洞的扫描,也可以批量执行集成的所有漏洞探测模块;易扩展的意思就是,新的漏洞检测模块可清晰简单的集成进扫描器;易修改,对各个漏洞扫描模块可根据特殊情况修改探测逻辑。  不管是安全,或者是渗透测试,我们的假想敌都是不法的黑客分子,就个人能力的角度来看,对漏洞的理解及漏洞利用场景的熟悉程度,决定了我们匹配哪一级别的骇客。  当然,...
            11 11 2160
            分享
          • 读者提问:『性能测试准备测试数据,我是从数据库中把数据提取出来,放在 TXT 中,是否需要直接从数据库中访问数据,这两者得到的性能测试结果差异大吗,应该以哪个为准呢 ?』阿常回答:数据量较小的情况,数据放在 TXT 中或是从数据库中读取,区别不大。数据量较大的情况,从 TXT 读取内存消耗会很大,会影响性能,从而影响我们最终对服务器性能的判断了。另外,数据放在 TXT 中可能会存在数据格式转换的问题,直接读取数据库反而方便一点。阿常碎碎念:总结以上,数据量小两种方式皆可,数据量大建议读取数据库。看完今天的分享对你是不是有所启发呢,有任何想法都欢迎大家后台私信阿常,一起探讨交流
            0 0 655
            分享
          • 源自于一本讲性能测试书的思考?书中内容:性能测试是一门富有挑战的、有深度的、综合性的学科。那我想怎能只局限于说性能测试,我倒认为所有的测试类型都是一门富有挑战、有深度的、综合性的学科,只要你想做到顶尖都没有那么容易,而我们正在做的的UI自动化测试也是如此。很多性能测试初学者总觉得性能测试就是写个脚本,弄几台机器测一测,出个报告就行了。通常关注"并发多少""响应时间多少""能跑通吗"这些问题。认为并发越大,响应时间越快,那性能一定就越好。性能测试不仅仅是录制脚本或编写程序,基本的性能理论、性能执行的原则还是要了解的。同样的脚本,不同的人...
            0 0 811
            分享
      • 51testing软件测试圈微信