Skip to content
On this page

network模块是基于requests的API二次封装并且更加简介,可用性强。

network提供如下类来完成网络协议的相关操作:

说明
RequestBase用于集成单元测试框架时使用的http请求操作(不建议单独使用,需要配合sveltest的单元测试框架使用)
HttpRequestHand用于独立使用,无需要集成单元测试框架,类似于直接使用requests,不过该类目前还没有RequestBase一样完善后续版本将会慢慢完善。
HttpResponseHeaders对网络请求的响应headers进行操作,一般无需单独使用RequestBaseHttpRequestHand中已经做了处理。
HttpRequestHeaders对网络请求的请求headers进行操作,一般无需单独使用RequestBaseHttpRequestHand中已经做了处理。

HTTP自动化测试

sveltest中为大家单独提供了HTTP自动化测试类HttpTestCase该类继承至sveltestTestCase类与network中的RequestBase类。因此在定义自动化测试时你可以直接self进行访问父类方法。

get请求

使用get()方法可有进行发送get请求

python
def get(self, router: Optional[str],#路由地址
        data: Optional[Dict]=None,#请求参数
        proxies:Optional[Dict]=None,#http/https代理
        verify:Optional[bool]=False, # 对SSL证书认证
        env_control:Optional[bool]=True,#是否启用环境管理器,默认使用
        allow_redirects:Optional[bool]=False,#重定向
        timeout:Optional[Union[int,float]]=None,#请求超时
        cookies:Optional[Dict]=None,#cookies
        headers:Optional[Union[Dict,bool]]=False,#headers
        is_backend:Optional[bool]=False,#是否为后台地址
        cert:Optional[Union[str,Tuple[str,str]]]=None # 客户端的证书
        ):

**env_control:**参数如果为True,那么router参数不能有服务器的host只能有url后面的路由地址

实例:

python
# env_control 为false时
self.get(router="http://127.0.0.1:8666/api/v1/index", env_control=False,)
# # env_control 为true时
self.get(router="api/v1/index")

小知识:

url一般由如下相关内容组成

img

因此如果在自动化测试时开启env_control后,只要你配置了环境管理相关配置sveltest会自动给你动态变更host,这样其实就是对环境进行了动态管理。

**is_backend:**如果你开启了env_control那么你在环境配置的适合应该会配置前端地址和后端地址二个配置,通过该参数来决定本次请求的是哪个端的host。

headers:sveltest有内置的认证器,默认会携带一些相关的请求headers,你也可以自行添加相关请求headers

示例:

python
import os


#DEBUG模式调试时建议加上这条需要在脚本顶部所有import之前,这样你配置的相关框架配置sveltest才会重新加载
#调试完后建议移除
os.environ.setdefault('SVELTEST_TEST_SETTINGS_MODULE','slt.settings')


from sveltest.case import  HttpTestCase
from sveltest import main


class SveltTestCase(HttpTestCase):

    def setUp(self):
        print("用例执行前")

    def tearDown(self):

        print("用例执行后")

    def test_case(self):
        """第一测试用例demo"""
        cd = self.get(router="http://127.0.0.1:8666/api/v1/index", env_control=False,)
        # request_headers 获取请求headers
        print(cd.request_headers)



if __name__ == '__main__':
    main(debug=True,verbosity=3,toast=False)
python

================================ 用例开始执行 =================================
test_api.py    test_case (__main__.SveltTestCase)   PASS
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 调试输出 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
test_api.py.test_case【output】:
 用例执行前
{'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 
(KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36', 'Accept-Encoding': 'gzip, 
deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'token': 'eyJ0eXAiOi
JKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNjY3NDcwMDUx
LCJqdGkiOiI4ZjBmNTg0M2E2MTc0YWUxYTE1MjBkMjNiMDYyMjY1ZCIsInVzZXJfaWQiOiJkeldmbkh
yQWFJRlV5RmJMSENSZiJ9.DxR-BbgL6nEJAWL_N3IN_VCwyaRm4Ac1nIgzg9cgDZU'}
用例执行后


******************************** 测试结果汇总 *********************************
     执行结果     
┌────────┬───────┐
│ status │ count │
├────────┼───────┤
│ PASS   │ 1
│ FAIL   │ 0
│ SKIP   │ 0
│ ERROR  │ 0
│ COUNT  │ 1
└────────┴───────┘
================= 总共运行了 1 条测试用例  总共运行了 0.031s ==================

在调试输出这一段就是sveltest在请求时自动给你加的,token字段就是自己定义好的认证器,因此我们在请求有相关需要登录的接口时无需自己去传入headers了。

python
{'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 
(KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36', 'Accept-Encoding': 'gzip, 
deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'token': 'eyJ0eXAiOi
JKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNjY3NDcwMDUx
LCJqdGkiOiI4ZjBmNTg0M2E2MTc0YWUxYTE1MjBkMjNiMDYyMjY1ZCIsInVzZXJfaWQiOiJkeldmbkh
yQWFJRlV5RmJMSENSZiJ9.DxR-BbgL6nEJAWL_N3IN_VCwyaRm4Ac1nIgzg9cgDZU'}

post请求

使用post()方法可有进行发送post请求,相关参数与get()一样

示例:

python
import os

os.environ.setdefault('SVELTEST_TEST_SETTINGS_MODULE', 'slt.settings')

from sveltest.case import HttpTestCase
from sveltest import main


class SveltTestCase(HttpTestCase):

    def setUp(self):
        print("用例执行前")

    def tearDown(self):
        print("用例执行后")

    def test_case(self):
        """第一测试用例demo"""
        cd = self.post(router="http://127.0.0.1:8666/api/v1/login", data={
            "username": "13453001",
            "password": "123456"
        }, env_control=False, )

        print(cd.request_headers)
        # json 获取响应的json数据
        print(cd.json)


if __name__ == '__main__':
    main(debug=True, verbosity=3, toast=False)
python
================================ 用例开始执行 =================================
test_api.py    test_case (__main__.SveltTestCase)   PASS
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 调试输出 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
test_api.py.test_case【output】:
 用例执行前
{'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 
(KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36', 'Accept-Encoding': 'gzip, 
deflate, br', 'accept': 'application/json', 'Connection': 'keep-alive', 
'Content-Type': 'application/json', 'token': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1N
iJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNjY3NDcwNDgzLCJqdGkiOiI5OGMzY2YxZmR
iMGM0ZDExOGQ1OGQwN2JlNTA1NjI3YiIsInVzZXJfaWQiOiJkeldmbkhyQWFJRlV5RmJMSENSZiJ9.B
6v1tOazSIKyHn9hzLWHv_DqR5-BR11uG1p-aKif47A', 'Content-Length': '46'}
{'token': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiw
iZXhwIjoxNjY3NDcwNDg0LCJqdGkiOiJmZTIyNDhmZDNhMzM0ZWNkYjNkM2IxZmIxZDQxNTQ3OSIsIn
VzZXJfaWQiOiJkeldmbkhyQWFJRlV5RmJMSENSZiJ9.DebkEwJB2KyUdTKNwPMm5xxwSTPKEZ5ngdTq
sDGFupA', 'id': 'dzWfnHrAaIFUyFbLHCRf', 'userInfo': {'username': '13453001', 
'nickname': '测试测试', 'phone': '', 'email': '', 'isSuperuser': False, 
'isStaff': True}}
用例执行后


******************************** 测试结果汇总 *********************************
     执行结果     
┌────────┬───────┐
│ status │ count │
├────────┼───────┤
│ PASS   │ 1
│ FAIL   │ 0
│ SKIP   │ 0
│ ERROR  │ 0
│ COUNT  │ 1
└────────┴───────┘
================= 总共运行了 1 条测试用例  总共运行了 0.019s ==================

更多方法及属性

方法说明示例
put()与post()参数一样,用于发送put请求
patch()与post()参数一样,用于发送patch请求
delete()与get()参数一样,用于发送delete请求
code_ok()检查状态码是否为200self.code_ok()
request_url获取请求urlself.request_url
url获取响应urlself.url
content获取响应字节数据self.content
text获取响应文本数据self.text
json获取响应json数据
encoding_()进行响应编码
save_image()响应的内容是图片时进行下载def save_image(self,content:Optional[bytes],fp:Optional[open]) content 响应的二进制内容 fp:open对象示例:self.save_image(content,open("img.png","rb"))
request_header进行对请求header操作下面有如下属性:content_type:获取Content-Type数据connection:获取Connection信息content_length:获取Content-Length
request_headers获取请求headers返回字典类型数据
history查看请求历史记录
status_code响应状态码

更多方法将陆续更新,教程文档编写也需要时间请耐心等待。

img

HttpRequestHand

下载二进制文件

图片文件

python
r = RequestBase()
r.save_image(r.get("https://sveltest-team.github.io/docs/logo.png", 
                   env_control=False).encoding_().content,fp=open("test.png","wb"))

响应头部

python
r = RequestBase()
data = r.get("https://sveltest-team.github.io/docs/logo.png", data={}, env_control=False).encoding_()
print(data.headers)

>>> {'Connection': 'keep-alive', 'Content-Length': '15989', 'Server': 'GitHub.com', 'Content-Type': 'image/png', 'permissions-policy': 'interest-cohort=()', 'Last-Modified': 'Mon, 17 Oct 2022 14:01:23 GMT', 'Access-Control-Allow-Origin': '*', 'Strict-Transport-Security': 'max-age=31556952', 'ETag': '"634d6033-3e75"', 'expires': 'Fri, 21 Oct 2022 03:13:19 GMT', 'Cache-Control': 'max-age=600', 'x-proxy-cache': 'MISS', 'X-GitHub-Request-Id': '080D:4144:3844F:3F699:63520BF7', 'Accept-Ranges': 'bytes', 'Date': 'Fri, 21 Oct 2022 03:03:19 GMT', 'Via': '1.1 varnish', 'Age': '0', 'X-Served-By': 'cache-tyo11962-TYO', 'X-Cache': 'MISS', 'X-Cache-Hits': '0', 'X-Timer': 'S1666321399.054640,VS0,VE176', 'Vary': 'Accept-Encoding', 'X-Fastly-Request-ID': '5fad839230579e6d2ed3415f451b69bcd073787f'}

访问指定的key

python
data.headers['Content-Type']
>>> 'application/json'

重定向

python
allow_redirects

超时

python
timeout