httprunner3源码解读(2)models.py
源码目录结构
我们首先来看下models.py
的代码结构
我们可以看到这个模块中定义了12个属性和22个模型类,我们依次来看
属性源码分析
import os
from enum import Enum
from typing import Any
from typing import Dict, Text, Union, Callable
from typing import List
from pydantic import BaseModel, Field
from pydantic import HttpUrl
Name = Text
Url = Text
BaseUrl = Union[HttpUrl, Text]
VariablesMapping = Dict[Text, Any]
FunctionsMapping = Dict[Text, Callable]
Headers = Dict[Text, Text]
Cookies = Dict[Text, Text]
Verify = bool
Hooks = List[Union[Text, Dict[Text, Text]]]
Export = List[Text]
Validators = List[Dict]
Env = Dict[Text, Any]
一句话总结:用到了typing
和pydantic
模块,目的是告诉读者我这些属性是什么类型的
模型类源码分析
这里以代码注解的方式讲解
MethodEnum
class MethodEnum(Text, Enum):
"""
枚举请求方法,定义了常用的http请求方法
"""
GET = "GET"
POST = "POST"
PUT = "PUT"
DELETE = "DELETE"
HEAD = "HEAD"
OPTIONS = "OPTIONS"
PATCH = "PATCH
TConfig
class TConfig(BaseModel):
"""
定义配置信息,包含如下:
1.name (str)
2.verify (bool)
3.base_url (http/https开头的str类型)
4.variables (dict)
5.parameters(dict)
6.export (list[str])
7.path (str)
8.weight (int)
"""
name: Name # str类型
verify: Verify = False
base_url: BaseUrl = ""
# Text: prepare variables in debugtalk.py, ${gen_variables()}
variables: Union[VariablesMapping, Text] = {}
parameters: Union[VariablesMapping, Text] = {}
# setup_hooks: Hooks = []
# teardown_hooks: Hooks = []
export: Export = []
path: Text = None
weight: int = 1
TRequest
class TRequest(BaseModel):
"""
requests.Request model
1.method (枚举类型)
2.url (str)
3.params (dict)
4.headers (dict)
5.req_json(dict/list/str)
6.data (dict/str)
7.cookie (dict)
8.timeout (float)
9.allow_redirects (bool)
10.verify (bool)
11.upload (dict)
"""
method: MethodEnum
url: Url
params: Dict[Text, Text] = {}
headers: Headers = {}
req_json: Union[Dict, List, Text] = Field(None, alias="json")
data: Union[Text, Dict[Text, Any]] = None
cookies: Cookies = {}
timeout: float = 120
allow_redirects: bool = True
verify: Verify = False
upload: Dict = {} # used for upload files
TStep
class TStep(BaseModel):
"""
测试步骤,里面包含了request请求
1.name (str)
2.request (TRequest)
3.testcase (str/Callable)
4.variables (dict)
5.setup_hooks (list(dict))
6.teardown_hooks (list(dict))
7.extract (dict)
8.export (list)
9.validators (list(dict))
10.validate_script (list[str])
"""
name: Name
request: Union[TRequest, None] = None
testcase: Union[Text, Callable, None] = None
variables: VariablesMapping = {}
setup_hooks: Hooks = []
teardown_hooks: Hooks = []
# used to extract request's response field
extract: VariablesMapping = {}
# used to export session variables from referenced testcase
export: Export = []
validators: Validators = Field([], alias="validate")
validate_script: List[Text] = []
TestCase
class TestCase(BaseModel):
"""
测试用例,包含了测试步骤和配置信息
"""
config: TConfig
teststeps: List[TStep]
ProjectMeta
class ProjectMeta(BaseModel):
"""
项目结构
1.debugtalk_py (str) debugtakl文件内容
2.debugtalk_path (str) debugtalk文件路径
3.dot_env_path (str) env文件路径
4.functions (dict(Callable/str)) 在debugtalk中定义的函数
5.env (dict) 环境
6.RootDir (str) 根路径(绝对路径),debugtalk位于的路径
"""
debugtalk_py: Text = "" # debugtalk.py file content
debugtalk_path: Text = "" # debugtalk.py file path
dot_env_path: Text = "" # .env file path
functions: FunctionsMapping = {} # functions defined in debugtalk.py
env: Env = {}
RootDir: Text = os.getcwd() # project root directory (ensure absolute), the path debugtalk.py located
TestsMapping
class TestsMapping(BaseModel):
"""
测试映射
1.project_meta
2.testcases 测试用例集,list下有多个用例
"""
project_meta: ProjectMeta
testcases: List[TestCase]
TestCaseTime
class TestCaseTime(BaseModel):
"""
测试用例时间
1.start_at:开始时间默认为0
2.start_at_iso_format:以iso格式启动
3.duration:持续时间
"""
start_at: float = 0
start_at_iso_format: Text = ""
duration: float = 0
TestCaseInOut
class TestCaseInOut(BaseModel):
"""
测试用例的输入输出:
config_vars:配置变量
export_vars:导出变量
"""
config_vars: VariablesMapping = {}
export_vars: Dict = {}
RequestStat
class RequestStat(BaseModel):
"""
请求指标:
content_size:内容大小
response_time_ms:响应时间(ms)
elapsed_ms:逝去的时间(ms)
"""
content_size: float = 0
response_time_ms: float = 0
elapsed_ms: float = 0
AddressData
class AddressData(BaseModel):
"""
客户端与服务器地址数据
client_ip:客户端ip地址
client_port:客户端端口号
server_ip:服务器ip地址
server_port:服务器端口号
"""
client_ip: Text = "N/A"
client_port: int = 0
server_ip: Text = "N/A"
server_port: int = 0
RequestData
class RequestData(BaseModel):
"""
请求数据
method:请求方法,默认为GET
url:url地址
headers:请求头
cookies:cookie信息
body:请求体
"""
method: MethodEnum = MethodEnum.GET
url: Url
headers: Headers = {}
cookies: Cookies = {}
body: Union[Text, bytes, List, Dict, None] = {}
ResponseData
class ResponseData(BaseModel):
"""
响应数据
status_code:状态码
headers:响应头
cookies:cookie信息
encoding:编码格式
content_type:内容类型
body:响应体
"""
status_code: int
headers: Dict
cookies: Cookies
encoding: Union[Text, None] = None
content_type: Text
body: Union[Text, bytes, List, Dict]
ReqRespData
class ReqRespData(BaseModel):
"""
请求响应数据
request:RequestData
response:ResponseData
"""
request: RequestData
response: ResponseData
SessionData
class SessionData(BaseModel):
"""
request session data, including request, response, validators and stat data
"""
success: bool = False
# in most cases, req_resps only contains one request & response
# while when 30X redirect occurs, req_resps will contain multiple request & response
req_resps: List[ReqRespData] = []
stat: RequestStat = RequestStat()
address: AddressData = AddressData()
validators: Dict = {}
StepData
class StepData(BaseModel):
"""
teststep data, each step maybe corresponding to one request or one testcase
测试步骤数据,每个步骤可能对应一个请求或一个测试用例
"""
success: bool = False
name: Text = "" # teststep name
data: Union[SessionData, List['StepData']] = None
export_vars: VariablesMapping = {}
TestCaseSummary
class TestCaseSummary(BaseModel):
"""
测试用例结果
name:测试用例名字
success:测试用例成功的状态
case_id:测试用例的id
time:测试用例的时间
in_out:测试用例的导入导出数据
log:测试用例的日志
step_datas:测试步骤的数据
"""
name: Text
success: bool
case_id: Text
time: TestCaseTime
in_out: TestCaseInOut = {}
log: Text = ""
step_datas: List[StepData] = []
PlatformInfo
class PlatformInfo(BaseModel):
"""
平台信息
httprunner_version:httprunner版本号
python_version:python版本
platform:平台
"""
httprunner_version: Text
python_version: Text
platform: Text
TestCaseRef
class TestCaseRef(BaseModel):
"""
包含testcase
"""
name: Text
base_url: Text = ""
testcase: Text
variables: VariablesMapping = {}
TestSuite
class TestSuite(BaseModel):
"""
测试套件
TestSuite包含TestCaseRef
TestCaseRef包含testcase
"""
config: TConfig
testcases: List[TestCaseRef]
Stat
class Stat(BaseModel):
"""
统计信息
total:总数
success:成功的用例数
fail:失败的用例数
"""
total: int = 0
success: int = 0
fail: int = 0
TestSuiteSummary
class TestSuiteSummary(BaseModel):
"""
测试套件结果
success:成功的状态
stat:统计信息
time:测试用例花费的时间
platform:平台信息
testcases:测试用例集
"""
success: bool = False
stat: Stat = Stat()
time: TestCaseTime = TestCaseTime()
platform: PlatformInfo
testcases: List[TestCaseSummary]
httprunner3源码解读(2)models.py的更多相关文章
- httprunner3源码解读(4)parser.py
源码结构目录 可以看到此模块定义了4个属性和12个函数,我们依次来讲解 属性源码分析 # 匹配http://或https:// absolute_http_url_regexp = re.compil ...
- httprunner3源码解读(3)client.py
源码目录结构 ApiResponse 这个类没啥好说的 class ApiResponse(Response): """ 继承了requests模块中的Response类 ...
- httprunner3源码解读(1)简单介绍源码模块内容
前言 最近想着搭建一个API测试平台,基础的注册登录功能已经完成,就差测试框架的选型,最后还是选择了httprunner,github上已经有很多开源的httprunner测试平台,但是看了下都是基于 ...
- pyspider源码解读--调度器scheduler.py
pyspider源码解读--调度器scheduler.py scheduler.py首先从pyspider的根目录下找到/pyspider/scheduler/scheduler.py其中定义了四个类 ...
- DRF(1) - REST、DRF(View源码解读、APIView源码解读)
一.REST 1.什么是编程? 数据结构和算法的结合. 2.什么是REST? 首先回顾我们曾经做过的图书管理系统,我们是这样设计url的,如下: /books/ /get_all_books/ 访问所 ...
- REST、DRF(View源码解读、APIView源码解读)
一 . REST 前言 1 . 编程 : 数据结构和算法的结合 .小程序如简单的计算器,我们输入初始数据,经过计算,得到最终的数据,这个过程中,初始数据和结果数据都是数据,而计算 ...
- Restful 1 -- REST、DRF(View源码解读、APIView源码解读)及框架实现
一.REST 1.什么是编程? 数据结构和算法的结合 2.什么是REST? - url用来唯一定位资源,http请求方式来区分用户行为 首先回顾我们曾经做过的图书管理系统,我们是这样设计url的,如下 ...
- Bert系列(三)——源码解读之Pre-train
https://www.jianshu.com/p/22e462f01d8c pre-train是迁移学习的基础,虽然Google已经发布了各种预训练好的模型,而且因为资源消耗巨大,自己再预训练也不现 ...
- 如何判断一个Http Message的结束——python源码解读
HTTP/1.1 默认的连接方式是长连接,不能通过简单的TCP连接关闭判断HttpMessage的结束. 以下是几种判断HttpMessage结束的方式: 1. HTTP协议约定status ...
随机推荐
- Nginx系列(1)- Nginx简介
公司产品出现瓶颈 公司项目刚上线的时候,并发量小,用户使用少,所以在低并发的情况下,一个jar包启动应用就够了,然后内部tomcat返回内容给用户 但是慢慢的,使用平台的用户越来越多,并发量慢慢增大了 ...
- 鸿蒙内核源码分析(重定位篇) | 与国际接轨的对外部发言人 | 百篇博客分析OpenHarmony源码 | v55.01
百篇博客系列篇.本篇为: v55.xx 鸿蒙内核源码分析(重定位篇) | 与国际接轨的对外部发言人 | 51.c.h.o 加载运行相关篇为: v51.xx 鸿蒙内核源码分析(ELF格式篇) | 应用程 ...
- 03 依赖注入--01控制反转、IoC模式
控制反转Inversion of Control DI和IoC几乎都是成对出现的,我们在理解依赖注入之前首先要弄明白什么是IoC,也就是控制反转,体现的就是控制权的转移,即控制权原来在A中,现在需要B ...
- 深入浅出WPF-06.Binding(绑定)01
Binding(绑定) 先上图,再解释 针对这个图,我们先来说说什么是Binding. Binding就是一个桥梁,建立在数据和UI之间的桥梁.既然是数据驱动,那么我们就把数据称之为"源&q ...
- 解决安装mysql 到start service出现未响应问题
mysql下载地址 链接: https://pan.baidu.com/s/1vYpsNkVjUHqOKPQl9Y9A9A 提取码: wngn 安装可以参考 今天下载了MySql5.5,没想到的是前面 ...
- vue常见的三种组件通讯—props,$refs,this.$emit
一.父组件--->子组件 props 1.特点:props是用于父组件向子组件传递数据信息(props是单向绑定的,即只能父组件向子组件传递,不能反向 2.用法:父组件中使用子组件时,绑定要传递 ...
- Filter防火墙
实验简介 实验属于防火墙系列 实验目的 了解个人防火墙的基本工作原理: 掌握Filter防火墙的配置. 实验环境 一台安装了win7操作系统的主机. 预备知识 防火墙 防火墙(Firewall)是一项 ...
- (googlechrome)未知错误导致安装失败,如果googlechrome....
https://jingyan.baidu.com/article/ea24bc39ffb699da63b33147.html#5827690-tsina-1-63512-fe183374908e7 ...
- Java(28)集合三Map
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228436.html 博客主页:https://www.cnblogs.com/testero ...
- 面试题 08.12. N皇后
题目 设计一种算法,打印 N 皇后在 N × N 棋盘上的各种摆法,其中每个皇后都不同行.不同列,也不在对角线上.这里的"对角线"指的是所有的对角线,不只是平分整个棋盘的那两条对角 ...