postman+newman+git/svn+jenkins
jmeter+ant+git/svn+jenkins
1、敏捷开发,接口一般数量很大,团队实现接口测试,版本控制。
2、功能太死板,有些接口无法完全实现(复杂的加密接口,签名接口等)
3、接口项目中有多中不同协议的接口。
4、排错,定位接口问题不方便,结合抓包实现。
5、没有办法生成美观的报告。
6、多接口串联,数据库验证,日志监控。
7、有些公司要做web自动化+接口自动化。
requests第三方库,主要用于发送http请求,做接口自动化。
pip install requests 安装requests库
pip list 查看
requests请求的底层实现其实就是urllib3,唯一的一个非转基因的Python http库。
请求:
#发送get请求
requests.get()
#发送post请求
requests.post()
#发送delete请求
requests.delete()
#发送put请求
requests.put()
#最核心的方法
requests.request()
响应:
rep = requests.request()
#返回字符串的数据
print(rep.text)
#返回字节格式的数据
print(rep.content)
#返回字典格式的数据
print(rep.json())
#状态码
print(rep.status_code)
#返回状态信息
print(rep.reason)
#返回cookie信息
print(rep.cookies)
#返回编码格式
print(rep.encoding)
#返回响应头信息
print(rep.headers)
请求方式:get/post/delete/put
请求参数类型:键值对,json格式,文件格式。
线性脚本:no
注意:
get请求通过params传递参数
post通过json或者data传递参数
文件上传通过files传
data
数据报文:dict字典类型,那么默认情况下请求头:applilcation/x-www-from-urlencoded,表示以from表单的方式传参,格式:a=1&b=2&c=3
数据报文:str类型,那么默认情况下:text/plain(如果是字典格式需要转换成str格式传参)
json
数据报文:不管是dict还是str类型,默认都是application/json,格式:{‘a’:1,‘b’:2}
json.dumps(data) 序列化 把字典格式的数据转换成str格式。
json.loads(data)反序列化 把str格式转换成字典格式。
总结:
data只能传简单的键值对的dict或者str格式。json一般只能传dict格式(简单和嵌套都可以)
1、判断接口是否正常,返回的code正不正常
import requests
#请求数据的准备
u = 'http://112.30.157.14:端口/xxx'
h = {'Content-Type':'application/json'}
d = {'username':'xxx','password':'xxx'}
#模拟请求下发,并接收响应
res = requests.post(url=u,headers=h,json=d).json()
#解析响应结果,判断本次接口请求是否成功
print(res)
'''
#判断http的状态码
assert res.status_code == 200
#判断接口的状态码
assert res['code'] == 200
2、某个字段的值,比如status=success
#判断status是不是等于success
assert res.json()['status'] == 'success'
3、返回json体的结构是否正常
首先进行安装,pip install jsonschema
from jsonschema import validate
result = {
'code': 200,
'message': '成功',
'status': 'success',
'data': {'username': '鲁尔', 'roleName': '管理员', 'token': 'eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiLpsoHlsJQiLCJmaXJlZmx5IjoiY3l1bW80IiwiZXhwIjoxNjMwNDM3OTU1LCJpYXQiOjE2MzA0MDE5NTV9._fgcCZpZwTfiTdeZ6ozDIZ6Aa9cKWTIxjDUz2TkSfULoHJxDASzvqVLlXhZM989e8avbv8Mlhmf2wRDuR7yaaw', 'userId': 110, 'randomKey': None, 'roleId': '25', 'sysUserId': '1058', 'code': '341000', 'phone': '13738021214'},
'hint': None
}
#校验数据格式设定
my_schema = {
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "test demo",
"description": "validate result information",
"type": "object",
"properties": {
"code": {
"description": "error code",
"type": "integer"
},
"message":
{
"description": "message",
"type": "string"
},
"status":
{
"description": "status",
"type": "string"
},
"data":
{
"description": "data",
"type": "object",
}
},
"required": [
"code","message", "status", "data"
]
}
# validate校验, 跟assert断言一个意思
r=validate(instance=result, schema=my_schema)
print(r)
4、判断数据与数据库是否一致
import MySQLdb
# 打开数据库连接
db = MySQLdb.connect("IP地址", "账号", "密码", "要查的库名", charset='utf8' )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# 使用execute方法执行SQL语句
cursor.execute("SELECT VERSION()")
# 使用 fetchone() 方法获取一条数据
data = cursor.fetchone()
print "Database version : %s " % data
# 关闭数据库连接
db.close()
邮件发送:smtp,简单邮件传输协议,是一种提供可靠且有效电子邮件传输的协议。
原理:代理通过smtp协议将信息发送到邮箱服务器上,邮箱服务器再通过pop3协议转发到收件人的邮件服务器上。
将Python的解释器当做一个代理,首先需要连接到邮箱服务器,将邮件发过去。由于不同公司的邮箱服务器地址不尽相同,连接时需要选择邮箱对应的服务器地址,这里列出了一些常用的地址如下:
1、什么是单元测试框架?
单元测试是指在软件开发中,针对软件的最小单位(函数、方法)进行正确性的检查测试。
2、单元测试框架
Java:junit和testng
Python:unittest和pytest
3、单元测试框架主要做什么?
测试发现:从多个文件里面去找到我们的测试用例
测试执行:按照一定的顺序和规则去执行,并生成结果
测试判断:通过断言去判断预期结果和实际结果的差异
测试报告:统计测试进度、耗时、通过率、生成测试报告
1、什么是自动化测试框架?
由一个或多个自动化测试基础模块、自动化测试管理模块、自动化测试统计模块等组成的工具集合。
2、作用?
提高测试效率,降低维护成本
减少人工干预,提高测试的准确性,增加代码的重用性。
核心思想是让不懂代码的人也能通过这个框架去实现自动化测试。
3、pytest单元测试框架和自动化测试框架的关系
单元测试框架:只是自动化测试框架中的组成部分之一
pom设计模式:只是自动化测试框架中的组成部分之一
数据驱动
关键字驱动
全局配置文件的封装
日志监控
selenium,requests二次封装
断言
报告邮件
更多。。
ps:批量安装pytest插件,在项目里面新建一个.txt格式的文件,里面放上pytest插件的名称,然后用命令行执行,pip install -r 加文件名 查看是否安装成功:pytest --version
1、pytest是一个非常成熟的Python单元测试框架,比unittest更加灵活,容易上手
2、pytest可以和selenium,requests、appium结合实现web自动化,接口自动化,APP自动化
3、pytest可以实现测试用例的跳过以及reruns失败用例重跑。
4、pytest可以和allure生成非常美观的测试报告。
5、pytest可以和Jenkins持续集成。
6、pytest有很多非常强大的插件,并且这些插件能够实现很多应用的操作。
pytest、pytest-html(生成HTML格式的自动化测试报告)pytest-xdist(测试用例分布式执行,多CPU分发)pytest-ordering(用于改变测试用例的执行顺序)pytest-rerunfailures(用例失败后重跑)allure-pytest(生成美观的测试报告)
1、模块名必须以test_开头或者以_test结尾
2、测试类必须以Test开头,并且不能有init方法
3、测试方法必须以test开头
1、主函数模式
运行所有:pytest.main()
指定模块:pytest.main([‘-vs’,‘‘xxx.py])
指定目录:pytest.main([’-vs’],‘…/interface_testcase’)
通过nodeid指定用例运行:nodeid由模块名,分隔符,类名,方法名,函数名组成。
pytest.main([‘-vs’],‘./interface_testcase/test_interface.py::test_04_func’)
pytest.main([‘-vs’],‘./interface_testcase/test_interface.py::TestInterface::test_03_zhiliao’)
2、命令行模式
运行所有:pytest
指定模块:pytest -vs test_login.py
指定目录:pytest -vs …/interface_testcase
指定目录:pytest -vs …/interface_testcase/test_interface.py::test_04_func
pytest运行Python文件,可以在命令行直接输入pytest +指定目录,或者pytest+指定目录+指定的文件名
pytest运行只会打印成功的个数,不会把结果打印出来,如果想要结果也展示出来,在后面加个-s
3、通过读取pytest.ini配置文件运行
pytest.ini这个文件是pytest单元测试框架的核心配置文件
位置:一般放在项目的根目录
编码:必须是ANSI,可以使用nodepad++修改编码格式
作用:改变pytest默认的行为
运行规则:不管是主函数的模式运行,命令行的模式运行,都会去读取这个配置文件
[pytest]
addopts = -vs 命令行的参数,用空格分割
testpaths = …/testcase 测试用例的路径
python_files = aaa_login*.py 模块名的规则
python_classes=Aaa* 类名的规则
python_functions = test 方法名的规则
参数详解:
-s:表示输出调试信息,包括print打印的信息
-v:显示更详细的信息
-vs:这两个参数一起用
-n:支持多线程或者分布式运行测试用例
如:pytest -vs ./testcase/test_login.py -n=2
–reruns NUM:失败用例重跑
-x:表示只要一个用例报错,那么测试停止
–maxfail=2 出现两个用例失败就停止
-k:根据测试用例的部分字符串指定测试用例
如:pytest -vs ./testcase -k ‘ao’
unittest:ascll的大小来绝对的执行的顺序
pytest:默认从上到下
改变默认的执行顺序:使用mark标记
@pytest.mark.run(order=1)
smoke:冒烟用例,分布在各个模块里面
1、setup/teardown,setup_class/teardown_class
为什么需要这些功能?
比如:web自动化执行用例之前,千万需要打开浏览器吗,用例执行后需要关闭浏览器?
class TestLogin:
def setup_class(self):
print('在每个类执行前的初始化工作,比如创建日志对象,创建数据库的连接')
def setup(self):
print('\n在执行测试用例之前初始化的代码')
def test_08_huahua(self):
print('测试花花')
def test_06_weiwei(self):
print('测试微微')
def test_05_xiaoming(self):
print('测试小明')
def test_02_honhon(self):
print('测试红红')
def teardown(self):
print('\n在执行测试用例之后扫尾的代码')
def teardown_class(self):
print('在每个类执行后的扫尾的工作,比如,销毁日志对象,销毁数据库的连接')
注意:和unittest不一样,全是小写。
@pytest.fixture(scope=‘’,params=‘’,autouse=‘’,ids=‘’,name=‘’)
1、scope表示的是被@pytest.fixture标记的方法的作用域。function(默认),class,module,package/session
如果生效范围:scope=“session”,那么,在该目录下的所有的测试用例只会执行一次
如果生效范围:scope=“module”那么,在该目录下的每个py文件会执行一次
如果生效范围:scope=“class”那么,在该目录下的每个类会执行一次
如果生效范围:scope=“function”那么,在该目录下的每个测试函数会执行一次
yield是一个关键字,要写在fixture标记的固件中(yield又相当于teardown)
2、params:参数化(支持列表,元组,字典列表,字典元组)
import pytest
@pytest.fixture(scope='function',params=['李小龙','甄子丹'])
def my_fixture(request):
return request.param
class TestLogin:
def test_08_huahua(self):
print('\n测试花花')
def test_06_weiwei(self,my_fixture):
print('\n测试微微')
print('---------'+str(my_fixture))
def test_05_xiaoming(self):
print('\n测试小明')
def test_02_honhon(self):
print('\n测试红红')
params=[‘李小龙’,‘甄子丹’]),这里的params是参数名,有s
request.param,这里是
3、autouse=Ture:自动执行,默认False
4、ids:当使用params参数化时,给每一个值设置一个变量名,意义不大。
5、name:给表示的是被@pytest.fixture标记的方法取一个别名。
当取了别名之后,那么原来的名称就用不了了
1、conftest.py文件是单独存放的一个夹具配置文件,名称是不能更改
2、用处可以在不同的py文件中使用同一个fixture函数
3、conftest.py需要和运行的用例放到同一层,并且不需要做任何的import导入的操作
总结:
setup/teardown,setup_class/teardown_class 它是作用于所有用例或者所有的类
@pytest.fixture() 它的作用是既可以部分也可以全部前后置
conftest.py和@pytest.fixture() 结合使用 作用于全局的前后置
conftest的使用场景
1、每个接口需共用到的token
2、每个接口需共用到的测试用例数据
3、每个接口需共用到的配置信息
生成报告前要先安装tomcat,把服务起起来,tomcat路径下/bin/startup.bat双击运行。黑窗口不要关闭。
在浏览器地址栏中输入:http://localhost:8080
执行发送邮件的入口会在项目路径下生成一个report路径,tomcat-root下面则会生成两个路径,一个是上上次的报告,一个是上次的报告。
allure报告生成的路径,可以在allure路径下进入cmd,输入allure serve allure-results,完毕后自动打开网页。
1、下载、解压、配置path路径
验证:allure --version
dos可以验证但是pycharm验证失败 重启pycharm就好了
2、生成json格式的临时报告
–alluredir …/temp
3、生成allure报告
os.system('allure generate ../temp -o ../report --clean')
allure generate#命令 固定的
../temp #临时的json报告的格式
-o #输出
../report --clean#生成的allure报告的路径 清空原来的报告
@pytest.mark.parametrize()基本用法
@pytest.mark.parametrize(args_name,args_value)
args_name:参数名
args_value:参数值(列表,元组,字典列表,字典元组),有多少个值用例就会执行多少次
#第一种方式
import pytest
class TestApi:
@pytest.mark.parametrize('argss', ['baili', 'xingyao', 'uoou'])
def test_01(self,argss):
print('args')
if __name__ == '__main__':
pytest.main()
#第二种方式
import pytest
class TestApi:
@pytest.mark.parametrize('name,age', [['百里','18'],['微微','22']])
def test_01(self,name,age):
print(name,age)
if __name__ == '__main__':
pytest.main()
1、用于全局的配置文件 ini、yaml
2、用于写测试用例(接口测试用例)
yaml简介:
yaml是一种数据格式,支持注释,换行,多行字符串,裸字符串(整形,字符串)
语法规则:
1、区分大小写
2、使用缩进来表示层级,不能使用tab键去缩进,只能用空格(和Python一样)
3、缩进没有数量的,只要前面对齐的就行
4、注释是#
数据组成:
1、Map对象,键值对 键:(空格)值
多行的写法
myjh:
name: baili
age: 18
一行的写法
myjh: {name: baili,age: 18}
2、数组(list),用一组横线来表示
-
msly:
- name:百里
-age:29
-
msjy:
-name:xiaoying
-age:20
-
msly:[{name:百里},{age:18}]