Python+request+Pytest+Allure+Jenkins接口自动化学习,持续更新中

一、工具类实现接口自动化

postman+newman+git/svn+jenkins
jmeter+ant+git/svn+jenkins

二、既然我们有这些接口测试工具,为什么用脚本做接口自动化?

1、敏捷开发,接口一般数量很大,团队实现接口测试,版本控制。
2、功能太死板,有些接口无法完全实现(复杂的加密接口,签名接口等)
3、接口项目中有多中不同协议的接口。
4、排错,定位接口问题不方便,结合抓包实现。
5、没有办法生成美观的报告。
6、多接口串联,数据库验证,日志监控。
7、有些公司要做web自动化+接口自动化。

三、Python+requests模块

requests第三方库,主要用于发送http请求,做接口自动化。
pip install requests 安装requests库
pip list 查看
requests请求的底层实现其实就是urllib3,唯一的一个非转基因的Python http库。

四、requests全局观

请求:

#发送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的解释器当做一个代理,首先需要连接到邮箱服务器,将邮件发过去。由于不同公司的邮箱服务器地址不尽相同,连接时需要选择邮箱对应的服务器地址,这里列出了一些常用的地址如下:

在这里插入图片描述

pytest单元测试框架

1、什么是单元测试框架?
单元测试是指在软件开发中,针对软件的最小单位(函数、方法)进行正确性的检查测试。
2、单元测试框架
Java:junit和testng
Python:unittest和pytest
3、单元测试框架主要做什么?
测试发现:从多个文件里面去找到我们的测试用例
测试执行:按照一定的顺序和规则去执行,并生成结果
测试判断:通过断言去判断预期结果和实际结果的差异
测试报告:统计测试进度、耗时、通过率、生成测试报告

单元测试框架和自动化测试框架有什么关系?

1、什么是自动化测试框架?
由一个或多个自动化测试基础模块、自动化测试管理模块、自动化测试统计模块等组成的工具集合。
2、作用?
提高测试效率,降低维护成本
减少人工干预,提高测试的准确性,增加代码的重用性。
核心思想是让不懂代码的人也能通过这个框架去实现自动化测试。
3、pytest单元测试框架和自动化测试框架的关系
单元测试框架:只是自动化测试框架中的组成部分之一
pom设计模式:只是自动化测试框架中的组成部分之一
数据驱动
关键字驱动
全局配置文件的封装
日志监控
selenium,requests二次封装
断言
报告邮件
更多。。

pytest简介

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(生成美观的测试报告)

使用pytest,默认的测试用例的规则以及基础应用

1、模块名必须以test_开头或者以_test结尾
2、测试类必须以Test开头,并且不能有init方法
3、测试方法必须以test开头

pytest测试用例执行方式

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’

pytest执行测试用例的顺序是怎么样的?

unittest:ascll的大小来绝对的执行的顺序
pytest:默认从上到下
改变默认的执行顺序:使用mark标记

@pytest.mark.run(order=1)

如何分组执行(冒烟,分模块执行,分接口和web执行)

smoke:冒烟用例,分布在各个模块里面

pytest框架实现一些前后置(固件,夹具)的处理,常用三种

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不一样,全是小写。

使用fixture装饰器来实现部分用例的前后置

@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标记的方法取一个别名。
当取了别名之后,那么原来的名称就用不了了

通过conftest.py和@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、每个接口需共用到的配置信息

pytest结合allure-pytest插件生成allure测试报告

生成报告前要先安装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()

yaml文件实现接口自动化

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}]
  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Python是一种广泛使用的编程语言,因其易学易用、灵活性和可扩展性而备受欢迎。requestsPython的一个库,它提供了一种简单且易于使用的方式来发送HTTP请求。pytestPython的另一个库,它提供了一种用于编写和运行测试的框架。allure是一个测试报告生成工具,可以为测试结果提供美观和易读的报告。 在接口自动化测试,可以使用Pythonrequests库来发送HTTP请求,并使用pytest框架来编写和运行测试。可以使用Excel来存储测试数据、预期结果和实际结果。使用allure工具可以生成美观的测试报告。 以下是使用Python requestspytestallure进行接口自动化测试的一般步骤: 1. 安装Pythonrequestspytestallure 2. 创建一个Excel文件,输入测试数据、预期结果和实际结果 3. 创建一个pytest测试文件,并使用requests库发送HTTP请求,比较预期结果和实际结果 4. 在pytest测试文件添加allure装饰器,以便生成测试报告 5. 运行pytest测试文件并生成allure测试报告 例如,以下是一个使用Python requestspytestallure进行接口自动化测试的示例代码: ```python import requests import pytest import allure import openpyxl @allure.title("测试接口") @pytest.mark.parametrize("test_input, expected", [(1, "success"), (2, "fail")]) def test_api(test_input, expected): # 从Excel文件获取测试数据和预期结果 wb = openpyxl.load_workbook("testdata.xlsx") sheet = wb.active test_data = sheet.cell(row=test_input, column=1).value expected_result = sheet.cell(row=test_input, column=2).value # 发送HTTP请求 response = requests.get("http://example.com/api", params=test_data) actual_result = response.text # 比较预期结果和实际结果 assert actual_result == expected_result, f"预期结果:{expected_result},实际结果:{actual_result}" # 添加allure描述 allure.attach("请求参数", str(test_data)) allure.attach("预期结果", str(expected_result)) allure.attach("实际结果", str(actual_result)) ``` 在上面的代码,使用了pytest的parametrize装饰器来传递测试数据和预期结果。使用openpyxl库从Excel文件获取测试数据和预期结果。使用requests库发送HTTP请求并比较预期结果和实际结果。使用allure的装饰器来添加测试描述。最后,运行pytest测试文件并生成allure测试报告。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小龚的测试之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值