[全网最牛]接口测试一般怎么测?接口测试-mock测试是怎么样的?_insomnia接口测试

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

三、为什么要做接口测试

既然是接口获取和操作资源的方式,而大部分系统和产品中,资源一般都是产品的核心,比如微信核心资源就是通讯录关系链和聊天记录等,因此资源是必测的。

另外接口中大部分的内容是数据,通过数据的对比我们能推测到系统和产品的逻辑,测接口就是测逻辑。

最后接口中的返回相对单纯,不像web页面,html代码中有太多ui的东西,ui最不稳定,变化太快,接口相对稳定一点点,但是里面的干扰信息更少,断言相对容易很多。

四、接口测试用例怎么写

还是3a原则,这个我以前的回答里有。

  1. A: arrange 初始化测试数据,就是造数据,这里的数据有我们输入的数据,也有目标接口所涉及的资源,比如hr系统中的用户信息,我们必须先有几条人员的详细信息才能去测获取人员信息的接口(当然只是正常的流程,我们有时候还需要清掉数据以便测试资源为空的情况);
  2. A: act 调用接口,传入输入数据;
  3. A: assert 断言, 对返回的资源信息进行断言,比如获取用户信息的接口返回了用户信息之后,我们要判断返回的用户是不是我们想要的那个用户,我们获取的是李雷的信息,接口如果返回韩梅梅,那么接口的逻辑就是不对的;

五、有哪些常见的接口

  1. 携程订飞机票,飞机票的信息一般都是通过各大航空公司的接口拿到的;
  2. 淘宝的物流信息,一般淘宝的物流信息都是通过各个物流公司的接口拿到的;
  3. 第三方微博客户端,个人用户的微博等信息都是通过微博的接口拿到的;

六、常见的接口测试工具

  1. postman: 推荐。基本功能免费。最简单的基于http接口的调试和测试工具;
  2. jmeter:后置处理器配合断言基本上可以满足接口测试需求,就是测试报告要做二次开发
  3. 自己撸代码:推荐。配合类似xunit测试框架,基本可以满足一切需求;
  4. soapui: 收费的;
  5. insomnia:强力推荐。postman的弱化版,基本功能免费,重要的是工具代码开源,可以自己改;
  6. paw: 强力推荐。mac上最强,淘宝买个授权好像就百把块钱;

七、​​​​mock

1.mock是什么

两个系统联调,A完成B开发中,无需B开发完,也可以测试A系统,mock数据便是模拟B系统的接口,快速联调
准确的说:mock是python中一个用于支持单元测试的库,主要功能时使用mock对象代替指定的python对象,已达到模拟对象的行为
不需要关心如何实现的过程,只关注结果即可

2.mock环境搭建

python3.x中,集成到unittest中,直接导入

from unittest import mock

3.mock的优点

1.并行工作:无需等待两者都开发完,一方开发好即可测试
2.模拟无法访问的资源
3.系统具有隔离性:构造虚拟的post请求,不污染数据库中的数据
4.提高覆盖率:模拟500,400,301等不同的类型

4.mock的构成

5.mock中的方法
from unittest.mock import Mock
mock_obj = Mock() # 实例化Mock对象
print(dir(mock_obj))
# ['assert_any_call', 'assert_called', 'assert_called_once', 'assert_called_once_with', 'assert_called_with', 'assert_has_calls', 'assert_not_called', 'attach_mock', 'call_args', 'call_args_list', 'call_count', 'called', 'configure_mock', 'method_calls', 'mock_add_spec', 'mock_calls', 'reset_mock', 'return_value', 'side_effect']

6.Mock中的构造方法
from unittest.mock import Mock
print(dir(Mock))
# ['_NonCallableMock__get_return_value', '_NonCallableMock__get_side_effect', '_NonCallableMock__return_value_doc', '_NonCallableMock__set_return_value', '_NonCallableMock__set_side_effect', '__call__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattr__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_call_matcher', '_extract_mock_name', '_format_mock_call_signature', '_format_mock_failure_message', '_get_child_mock', '_mock_add_spec', '_mock_call', '_mock_check_sig', '_mock_return_value', '_mock_side_effect', 'assert_any_call', 'assert_called', 'assert_called_once', 'assert_called_once_with', 'assert_called_with', 'assert_has_calls', 'assert_not_called', 'attach_mock', 'call_args', 'call_args_list', 'call_count', 'called', 'configure_mock', 'mock_add_spec', 'mock_calls', 'reset_mock', 'return_value', 'side_effect']

1.name

name:mock对象的标识

from unittest import mock
mock_obj = Mock(name = 'xxx')
print(f'name标识{mock_obj}')
# name标识<Mock name='xxx' id='4445533296'>

2.return_value(用的最多)

return_value:该参数指定一个值或者对象

from unittest import mock
mock_obj1 = mock.Mock(return_value=100)
print(f'return_value 指定值{mock_obj1()}')
# return_value 指定值100

3.side_effect

side_effect:该参数指向一个可调用对象(一般是函数)
当mock对象被调用时,如果该参数的返回值是默认的DEFAULT,则mock对象返回return_value指定的值;
否则返回side_effect指定的对象的返回值

from unittest import mock
mock_obj2 = mock.Mock(return_value=100, side_effect=None)
print(f'side_effect 默认值为None,输出return_values的值{mock_obj2()}')
# side_effect 默认值为None,输出return_values的值100

mock_obj3 = mock.Mock(return_value=100, side_effect=[200, 300])
print(f'side_effect 指定值{mock_obj3()},return_value的值被覆盖')
# side_effect 指定值200,return_value被覆盖
print(f'side_effect 迭代输出指定值{mock_obj3()}')
# side_effect 迭代输出指定值300

4.spec

spec:mock对象的属性值

from unittest.mock import Mock
class Foo(object):
    age = 20
    def f1(self):
        return 
    def f2(self, name):
        return name
mock_obj = Mock(spec=Foo)
print(mock_obj.age) 
# <Mock name='mock.age' id='4541307032'>
print(mock_obj.name) 
# AttributeError: Mock object has no attribute 'name' 没有name属性

7.mock 断言

1.assert_called_with()

assert_called_with(参数arg):检查函数调用参数是否正确

from unittest.mock import Mock
class Foo(object):
    value = 20
    def f1(self, arg):
        return arg
mock_obj = Mock(spec=Foo)
# f1正确的传参姿势
mock_obj.f1(222)
# mock_obj.f1.assert_called_with()  
# 报错,没有传参
# mock_obj.f1.assert_called_with(11)  
# 报错,应该传222,传了11
# mock_obj.f1.assert_called_with(222)  
# 不报错

2.assert_called_once_with()

assert_called_once_with(参数arg):检查函数调用参数是否正确,但是只调用一次

from unittest.mock import Mock
mock = Mock()
mock()
mock.assert_called_once_with()
# 不会报错
mock()
mock.assert_called_once_with() 
# AssertionError: Expected 'mock' to be called once. Called 2 times.

如果这篇文章对你有帮助,请给小编点个赞!👍这样我才有动力继续更新下去!

今天的小知识学会了么

欢迎在留言区跟我们互动噢~

觉得有所帮助的话点个赞呗

最后是小编自己整理的一些学习资料、测试工具、课件、笔记相关资料点击下方小卡片

小编热衷于收集整理资源,记录踩坑到爬坑的过程。希望能把自己所学,实际工作中使用的技术、学习方法、心得及踩过的一些坑,记录下来。也希望想做软件测试的你一样,通过我的分享可以少走一些弯路,可以形成一套自己的方法,并应用到实际中。

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

…(img-ln1SHsCR-1715898702946)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 21
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值