Metadata-Version: 2.1
Name: HttpTesting
Version: 1.1.47
Summary: HttpTesting
Home-page: https://github.com/HttpTesting/HttpTesting
Author: 天枢
Author-email: lengyaohui@163.com
License: Apache 2.0
Platform: UNKNOWN
Classifier: Development Status :: 3 - Alpha
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Requires-Python: >=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4
Description-Content-Type: text/markdown
Requires-Dist: pytest
Requires-Dist: PyYAML (==5.1.1)
Requires-Dist: requests
Requires-Dist: requests-toolbelt
Requires-Dist: pytest-html
Requires-Dist: pytest-xdist
Requires-Dist: pytest-rerunfailures
Requires-Dist: pytest-repeat

﻿# HttpTesting

![PyPI](https://img.shields.io/pypi/v/Httptesting)
![PyPI - License](https://img.shields.io/pypi/l/HttpTesting)
![PyPI - Python Version](https://img.shields.io/pypi/pyversions/HttpTesting)
![PyPI - Wheel](https://img.shields.io/pypi/wheel/HttpTesting)
![PyPI - Status](https://img.shields.io/pypi/status/HttpTesting)


HttpTesting 是HTTP(S) 协议测试框架，通过YAML来编写测试用例；支持通过pip直接从PyPi安装，支持命令行运行代码，不固定结构，通过命令生成脚手架。

## 版本信息

|序号|版本号|描述|
|:---|:---|:---| 
|1|v1.0|使用unittest框架|
|2|v1.1|使用pytest框架|




## 快速开始

### python虚拟环境virtualenv使用

- 安装虚拟环境: pip install virtualenv

- 创建虚拟环境: virtualenv  demo_env

- 命令行模式切换到虚拟环境Script目录: /../scripts/

- 激活虚拟环境: activate.bat 

### HttpTesting安装


#### pip在线安装

- pip install HttpTesting==1.0.26

#### 下载whl文件进行安装

- pip install HttpTesting-1.0.40-py3-none-any.whl 


#### 更新HttpTesting包

已安装HttpTesting包,通过pip命令进行更新

- pip list  查看HttpTesting安装包版本信息

- pip install --upgrade HttpTesting

- pip install --upgrade HttpTesting==1.0.26



### amt 或 AMT命令

|序号|命令参数|描述|
|:---|:---|:---|  
|1|amt -config set|此命令用来设置config.yaml基本配置|
|2|amt -file template.yaml|执行YAML用例，支持绝对或相对路径|
|3|amt -dir testcase|批量执行testcase目录下的YAML用例，支持绝对路径或相对路径|
|4|amt -startproject demo|生成脚手架demo目录,以及用例模版|
|5|amt -har httphar.har|根据抓包工具导出的http har文件，生成测试用例YAML|
|6|amt -convert demo.yaml|转换数据为HttpTesting测试用例|


#### 基本配置

- URL设置

- 钉钉机器人设置

- 测试报告设置

- EMAIL邮箱设置


#### 用例执行

- YAML执行: amt -file template.yaml

- YAML批量执行: amt -dir testcase



####  脚手架生成

- 脚手架功能,是生成一个测试用例模版.



#### HAR

har命令来解析, Charles抓包工具导出的http .har请求文件, 自动生成HttpTesting用例格式.





## 用例编写


### 用例模型

>TESTCASE{

>>'case1':['description',{},{}],  #场景模式每个{}一个接口

>>'case2':['description',{}],     #单接口模式

>}


### YAML用例格式  

### 场景模式
	TESTCASE:
		#Case1由两个请求组成的场景
		Case1:
			-
				Desc: xxxx业务场景(登录->编辑)
			-
				Desc: 登录接口
				Url: /login/login
				Method: GET
				Headers:
					content-type: "application/json"
					cache-control: "no-cache"
				Data:
					name: "test"
					pass: "test123"
				OutPara: 
					"H_token": result.data
					"content_type": header.content-type
					"name": Data.name 
					"pass": Data.pass
				Assert:
					- eq: [result.status, 'success']
			-
				Desc: 编辑接口
				Url: /user/edit
				Method: GET
				Headers:
					content-type: "${content_type}$"   
					cache-control: "no-cache"
					token: "$H_token$"
				Data:
					name: "${name}$"
					pass: "${pass}$"
				OutPara: 
					"$H_token$": result.data
				Assert:
					- ai: ['success', result.status]
					- eq: ['result.status', '修改成功']

### 多CASE模式

	TESTCASE:
		#同一接口,不同参数,扩充为多个CASE
		Case1:
			-
				Desc: 登录接口-正常登录功能
			-
				Desc: 登录接口
				Url: /login/login
				Method: GET
				Headers:
					content-type: "application/json"
					cache-control: "no-cache"
				Data:
					name: "test"
					pass: "test123"
				OutPara: 
					"H_cookie": cookie.SESSION
				Assert:
					- eq: [result.status, 'success']
		Case2:
			-
				Desc: 登录接口-错误密码
			-
				Desc: 登录接口
				Url: /login/login
				Method: GET
				Headers:
					content-type: "application/json"
					cache-control: "no-cache"
				Data:
					name: "test"
					pass: "test123"
				OutPara:
					"H_cookie": cookie.SESSION 
				Assert:
					- eq: [result.status, 'error']


### 参数说明

- "${H_token}$": 为参数变量,可以头信息里与Data数据里进行使用
- "%{md5('aaaa')}%": 为函数原型,具体支持函数下方表格可见.

### 自定义变量

变量作用域为当前CASE.


### 示例1(自定义变量)

	TESTCASE: 
		Case1:
			- 
				Desc: 接口详细描述
				USER_VAR:
					token:  xxxxxxxx
			-
				Url: /xxxx/xxxx
				Method: POST
				Headers: 
					token: ${token}$
				Data:
				OutPara:
				Assert: []

### 示例2(自定义变量)

	TEST_CASE:
		Case1:
		-   
			Desc: 扫码校验券(支持检测微信券二维码码、微信会员h5券二维码、条码)
			USER_VAR:
				version: 1.0
				data: 
					req:
						sid: '1380598237'
						wxcode: "164073966187485312752286" #209736174428
					appid: dp0Rm4wNl6A7q6w1QzcZQstr
					sig: 9c8c96b38d759abe6633c124a5d37225
					v: "${version}$"
					ts: 1564643536

		-   Desc: 扫码校验券
			Url: /pos/checkcoupon
			Method: POST
			Headers:
				content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
				cache-control: no-cache
			Data: ${data}$
			OutPara: 
			Assert:
			-   eq: [result.errcode, 0]


- 以上通过USER_VAR字典对象来定义变量, key为变量名, value为变量值; 使用方法: ${token}$

- 无需定义变量, USER_VAR字段在用例中,可以省略.

#### OutPara字段变量使用

OutPara字段用来做公共变量,供其它接口使用,默认为""; 

-  示例: "H_token": result.data 是请求结果，返回的嵌套级别,使用方法: ${H_token}$
-  OutPara为dict类型,可以做多个公共变量.


#### Assert断言

Assert字段默认为[].

|序号|断言方法|断言描述|
|:---|:---|:---|
|1|eq: [a, b]|判断 a与b相等,否则fail|
|2|nq: [a, b]|判断 a与b不相等,否则fail|
|3|al: [a, b]|判断 a is b 相当于id(a) == id(b),否则fail|
|4|at: [a, b]|判断 a is not b 相当于id(a) != id(b)|
|5|ai: [a, b]|判断 a in b ,否则fail|
|6|ani: [a, b]|判断 a in not b,否则fail|
|7|ais: [a, b]|判断 isinstance(a, b) True|
|8|anis: [a, b]|判断 isinstance(a, b) False|
|9|ln: [a]|判断 a is None,否则fail|
|10|lnn: [a]|判断 a is not none|
|11|bt: [a]|判断 a 为True|
|12|bf: [a]|判断 a 为False|


#### 内置函数及扩展

使用原型(带参数与不带参数)

- "%{md5('aaaa')}%" 或 "%{timestamp()}%"



|函数名|参数|说明|
|:---|:---|:---|
|md5|txt字符串|生成md5字符串示例: cbfbf4ea6d7c8032584dcf0defa10276|
|timestamp|-|秒级时间戳示例: 1563183829|
|uuid1|-|生成唯一id,uuid1示例:ebcd6df8a77611e99bb588b111064583|
|datetimestr|-|生成日期时间串,示例:2019-07-16 10:50:16|
|mstimestamp|-|毫秒级时间戳,20位|
|sleep_time|-|线程睡眠,0.5为500毫秒，1为1秒|
|rnd_list|[]|随机从列表中选择值|

- 其它后续添加

### 自定义函数扩展功能说明
- 在执行用例root目录，新建extfunc.py文件
- 按模型自定义函数
- 类名 Extend不可更改
- @staticmethod函数必须定义为静态
- 函数各数不做限制

### 自定义函数扩展功能模型
	class Extend:
		@staticmethod
		def func1():
			return 'ext func'

		@staticmethod
		def func2(args):
			return args

- 使用示例1："%{func1()}%" 
- 使用示例2: "%{func1('aaaa')}%" 



## 常用对象(通常做参数变量时使用)
- res: 请求Response对象
- result: res.json 或 res.text
- cookie: res.cookie 响应cookie字典对象;  当做为参数时如果cookie.SESSION这样的写法代表取cookie中的SESSION对象. 如果只写cookie,会解析成"SESSION=xxxxxxx; NAME=xxxxxx"
- headers: res.headers 响应头字典对象
- header: header.content-type 请求头对象


## 用例执行
- 1、生成脚手架
- 2、编写脚手架中testcase下YAML模版用例
- 3、切换到testcase目录
- 4、amt -dir testcase 自动运行testcase下YAML用例
- 5、自动生成测试报告Html


##  框架基本配置
- 1、通过命令打开框架config.yaml
- 2、amt -config set
- 3、修改基本配置，并保存


### 配置功能对比
|序号|功能|V1.0|V1.1|配置参数|
|--|--|--|--|--|
|1|并发执行|-|√|ENABLE_EXECUTION:False EXECUTION_NUM: 4|
|2|失败重新执行|√|√|ENABLE_RERUN: False  RERUN_NUM:  2|
|3|重复执行|-|√|ENABLE_REPEAT: False REPEAT_NUM: 2
|4|钉钉消息|√|√|ENABLE_DDING:  False |
|5|发送报告邮件|√|√|EMAIL_ENABLE: False|
|6|控制台输出|-|√|ENABLE_EXEC_MODE: False|
|7|自定义函数扩展|√|√|用例执行root目录增加extfunc.py|


## 代码打包与上传PyPi



### 通过setuptools工具进行框架打包,需要编写setup.py



- 打包：python3 setup.py bdist_wheel



- 上传PyP: twine upload dist/*



