点击上方“AI派”,选择“设为星标”
最新分享,第一时间送达!
作者:郑明卓,Python研发工程师,在Python开发与爬虫方面涉猎较广,拥抱新技术。目前负责应用技术调研与开发维护。Now is better than never。
编辑:王老湿
说在开头,这篇文章是来自我们的一位读者朋友创作的内容,他将他自己在Python方面的实践经验总结成一些文章,然后分享给大家。好了,开始我们的分享吧。
大家想想一个场景,假定我们在工作中开发了一个接口,因为接口需要增加一些功能,所以更改了一些代码。那么修改的代码会不会对之前的功能有影响呢?
为了解决这个问题,测试就来了。作为开发人员,也可以编写一些测试代码,因为良好的编写测试习惯,持续地写测试写文档写代码是必备的。
有了测试代码后,更改(重构)代码也更加方便,因为只需要用相同的测试代码即可来对功能做一个检查即可。此外,编写测试还能提升代码的可读性,因为一些测试代码也是功能的描述。
编写功能测试的目的
验证应用的行为和期望一致的测试
确认异常修复的测试(增加测试覆盖率)
测试的分类
单元测试(unit test)# 主要测函数
功能测试(function test)# 主要测某些代码段完整的功能
集成测试(integration test) # 主要在线上环境测试
负载/压力测试 (load test) # 大家比较熟悉
端到端测试 (end-to-end test) # 完整的测试产品
本文主要讲解功能测试实例的编写。
在python中编写功能测试代码
主要分为两部分,客户端测试和服务器端测试。
功能测试组要注意的点:功能测试都不占用网络服务资源,请求都直接模拟网络资源
客户端测试可以用在哪里呢?爬虫调用第三方的接口(OSS, 数据库, AI服务等)
PS: 为了提升代码质量,所有代码都会使用静态注释,你的python version
需要 >= 3.5
如何实现网络资源请求的模拟呢?这时候,我们的 mock 就要出场了。
1. 客户端测试 request_mock
首先,我们编写一个简单的客户端,当作我们用来测试的客户端 client.py
,代码如下:
import typing
from urllib import parse
import requests
MyResponse = typing.Dict[str, typing.List[str]]
class MySpider:
"""拼接返回的id"""
def __init__(self, url="http://example.com") -> None:
self.url: str = url
self.return_base_url: str = "http://shop.com/id/"
def get_data(self):
try:
response: requests.Response = requests.get(self.url)
except requests.exceptions.ConnectionError:
# 链接超时
return self._handle_data()
else:
response.raise_for_status() # 检查请求状态值200
data = response.json()
return self._handle_data(data)
def _handle_data(self, data=None) -> MyResponse:
"""处理请求的数据"""
if data:
return_data: typing.List[str] = []
all_id = data.get("all_id", [])
for goods_id in all_id:
return_data.append(parse.urljoin(self.return_base_url, goods_i