Pytest接口自动化框架

预研背景

目前系统研发多为前后端分离,当后端接口研发完成后,可以不依赖前端界面通过接口测试提前发现问题并解决。同时由于软件迭代周期不断缩短,开发新功能后又担心影响原有功能,可以通过接口自动化进行原有功能快速回归测试,将更多精力专注于迭代功能测试,这样才能放心地发布产品。由此看来,接口自动化测试可以减轻工作量,提高测试效率和产品质量。市面上的主流接口自动化测试工具或框架很多,需要调研对比各自的特点,挑选出适合项目的工具快速完成自动化测试。

预研目标

体验工具主要特性功能使用及便利性,体验内容包含如下:

l 单接口测试

l 多接口组合测试

l 测试报告

l 测试用例管理

l 日志查看

l 脚本调试

l 持续集成

 

工具/框架介绍

Pytest是一个软件测试框架。它是一款命令行工具,可以直接测试各类程序自动找到测试用例执行,并且汇报测试结果。

主要特性:

1) 易于上手,入门简单

2) 能支持简单的单元测试和复杂的功能测试

3) 测试用例编写简单可读性强,支持参数化

4) 灵活指定用例执行方式、顺序等

5) 丰富的基础库,可以大幅提高用户编写测试用例效率

6) 详细的日志输出

7) 灵活、扩展性好,可以很容易地融入已有的开发测试流程如可运行由unittest和node编写的测试用例

8) 很容易与其他工具集成到一起使用,比如和jenkins持续集成、allure测试报告展示等

 

官网:https://docs.pytest.org/en/latest/index.html

 

工具/框架环境搭建

使用Python3+Pytest+Request+Jenkins+Allure框架来进行接口自动化测试,并实现持续集成,自动生成html测试报告。

1、Python安装

它不依赖与Python版本,Python2(2.6及更高版本)和Python3(3.3及更高版本)都可以安装最新版本的pytest。

 

l 检查本地是否已有python环境:

python --version

 

 

 

l python3安装(若已经安装,此步忽略)

安装可参考:https://blog.csdn.net/weixin_40844416/article/details/80889165

1、requests安装

l 通过命令行安装requests

pip install request

3、Pytest安装

l 通过命令行安装Pytest

    pip install pytest

 

 

l 命令行检查安装版本

pytest --version

 

 

4、Pycharm配置pytest运行程序

Pycharm File->Settings->Tools->Python Integrated Tools,选择需运行pytest项目,Default test runner下拉选择pytest,设置完成后,编写pytest用例即可直接使用pytest运行

 

编写第一个自动化脚本

脚本实现的用户场景:获取Token-》发起一个HTTP请求-》对响应结果进行断言

详细步骤:

1、每个接口都需要用到token,通过conftest.py共享fixture,@pytest.fixture标记返回封装获取token值函数

conftest.py:

1.import pytest  
2.import requests  
3.  
4.authentication_url_path = "/v1/tokens"  
5.  
6.json_login = {  
7.    "authType": "password",  
8.    "params": {  
9.        "username": "zhuxuefei",  
10.        "password": "jixlb2tIrjF5t/bYQTXz4Q=="  
11.    }  
12.}  
13.  
14.def pytest_addoption(parser):  
15.    parser.addoption("--ip", action="store", default="XX.XX.XX.XX", help="please input target VM ip.")  
16.    parser.addoption("--port", action="store", default="api", help="please input target service port.")  
17. 
18. 
19.@pytest.fixture(scope="session")  
20.def ip(request):  
21.    return request.config.getoption("--ip")  
22. 
23. 
24.@pytest.fixture(scope="session")  
25.def port(request):  
26.    return request.config.getoption("--port")  
27. 
28. 
29.@pytest.fixture(scope="session")  
30.def uri(ip,port):  
31.    uri = "http://%s/%s" % (ip, port)  
32.    return uri  
33. 
34. 
35.@pytest.fixture(scope="session")  
36.def auth_token(uri):  
37.    headers = {"User-Agent": "automation",  
38.               "content-type": "application/json;charset=UTF-8"  
39.               }  
40.  
41.    post_response = requests.post(url=uri + authentication_url_path,  
42.                                  json=json_login,  
43.                                  headers=headers)  
44.  
45.    assert post_response.status_code == requests.status_codes.codes.OK  
46.    resp_payload = post_response.json()  
47.    assert resp_payload['status'] == 200  # to be defined.  
48.    auth_token = resp_payload['data']['key']  
49.  
50.    return auth_token  
51.
52.@pytest.fixture(scope="session")  
53.def headers(uri):  
54.    headers = {"User-Agent": "automation",  
55.               "content-type": "application/json;charset=UTF-8"  
56.               }  
57.  
58.    post_response = requests.post(url=uri + authentication_url_path,  
59.                                  json=json_login,  
60.                                  headers=headers)  
61.  
62.    assert post_response.status_code == requests.status_codes.codes.OK  
63.    resp_payload = post_response.json()  
64.    assert resp_payload['status'] == 200  # to be defined.  
65.    auth_token = resp_payload['data']['key']  
66.  
67.    headers = {"User-Agent": "automation",  
68.               "content-type": "application/json;charset=UTF-8",  
69.               "T-AUTH-TOKEN": auth_token}  
70.    return headers  

  

2、将获取token值fixture函数传递给http请求接口

 

3、用例数据写在excel文件中,实现读取测试用例逻辑,将测试用例数据通过@pytest.mark.parametrize()传入测试函数,循环执行测试数据

param_create_vlanpool = read_excel_tuple(excelFile, '创建VLAN池')  

 

4、每次执行assert断言用例结果

 用例名称以test开头,如test_create_vlanpool.py:

1.@pytest.mark.parametrize('name,tag,ResourcePoolName,vlanTagStart,vlanTagEnd', param_create_vlanpool)  
2.def test_create_vlanpool(uri, headers, name, tag, ResourcePoolName, vlanTagStart, vlanTagEnd):  
3.    resourcepoolid = get_resourcepoolid(uri, headers, ResourcePoolName)  
4.    param = {  
5.        'name': name,  # VLAN池名称  
6.        'tag': tag,  
7.        'vlanPoolResourcePoolList': [{'resourcePoolId': resourcepoolid}],  #作用域调用资源池ID  
8.        'vlanTagEnd': vlanTagStart,  # 结束VLAN ID  
9.        'vlanTagStart': vlanTagEnd  # 起始VLAN ID  
10.    }  
11.    create_vlanpool_response = requests.post(  
12.        url=uri + create_vlanpool_url_path,  
13.        headers=headers,  
14.        json=param  
15.    ).json()  
16.    print(create_vlanpool_response)  
17.    code = create_vlanpool_response['status']  
18.    allure.attach("请求响应code", str(create_vlanpool_response['status']))  
19.    allure.attach("请求响应结果", str(create_vlanpool_response))  
20.    my_log().info(create_vlanpool_response)  

  

5、Pycharm的Terminal页面进入该py文件路径下,执行pytest test_create_vlanpool.py或直接右击测试用例Run ‘pytest’ in ‘test_create_vlanpool.py.py’运行用例

 

 

 

编写业务场景接口组合测试脚本

 

测试报告查看

利用Allure框架生成高大上的html报告,allure还支持使用Jenkins持续集成。

l 安装allure-pytest插件,通过allure标签自定义完善测试报告

import allure

@allure.feature(‘XX’)

@allure.story(‘XX’)

@allure.attach(‘XX’)

l 执行pytest test.py --alluredir report/allure_raw生成运行后原始结果

l 安装Allure工具并配置环境变量,确保allure命令可用

allure generate <allure测试结果目录> -o <存放报告的目录> --clean 生成html测试报告

 

 

 

测试用例管理

  • 测试用例编写命名规则

l 测试文件应命名为st_xx.py或xx_test.py

l 测试类命令以Test开头

l 测试函数、测试类方法命令以test开头

 

  • pytest提供标记机制,使用marker对测试函数标记指定运行用例

比如选择部分测试用例作为冒烟测试,可以对它们添加@pytest.mark.smoke装饰,运行时在命令中指定-m smoke就可以

通过@pytest.mark.run(order=X)来标记用例执行顺序

通过@pytest.mark.skip()、@pytest.mark.skipif()来跳过不想执行的测试用例

 

  • 运行测试用例方式

运行pytest时可以指定目录和文件。如果不指定,pytest会搜索当前目录及其子目录中以test_开头或以_test结尾的测试函数。

l 命令方式执行

pytest -v -s xx.py

l Pytest.main主程序执行,参数和命令方式一致

 

 

测试方法优化

在编写第一个自动化脚本中都对应应用

l 使用fixture配置、传递初始化测试数据

l 通过confest.py共享fixture

l @pytest.mark.parametriz()数据参数化允许传递多组数据执行批量测试

 

日志查看

Pycharm执行pytest用例可以在终端界面输出详细日志

 

 

 

脚本调试

 

持续集成

l Jenkins上创建工程,配置接口自动化工程代码库

 

 

l 设置需被执行测试环境及调用主程序执行

 

 

 

 

 

l Jenkins安装Allure插件,设置allure report原始执行结果路径

 

 

l Jenkins自动构建运行用例并生成测试报告

 

 

原文地址:https://www.cnblogs.com/Lina-zhu/p/12874344.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


目录1、前言2、mark的使用(一)注册自定义标记(二)在测试用例上标记(三)执行3、扩展(一)在同一个测试用例上使用多个标记(二)在测试类上使用标记1、前言在自动化测试工作中我们有时候并不需要测试所有的测试用例,比如在冒烟测试阶段,我们只需要测试基本功能是否正常就可以了。在pytest中提供
用例执行状态用例执行完成后,每条用例都有自己的状态,常见的状态有passed:测试通过failed:断言失败error:用例本身写的质量不行,本身代码报错(譬如:fixture不存在,fixture里面有报错)xfail:预期失败,加了 @pytest.mark.xfail()  error的栗子一:参数不存在 defpwd():prin
什么是conftest.py可以理解成一个专门存放fixture的配置文件 实际开发场景多个测试用例文件(test_*.py)的所有用例都需要用登录功能来作为前置操作,那就不能把登录功能写到某个用例文件中去了 如何解决上述场景问题?conftest.py的出现,就是为了解决上述问题,单独管理一些全局的
前言pytest默认执行用例是根据项目下的文件名称按ascii码去收集运行的;文件中的用例是从上往下按顺序执行的。pytest_collection_modifyitems这个函数顾名思义就是收集测试用例、改变用例的执行顺序的。【严格意义上来说,我们在用例设计原则上用例就不要有依赖顺序,这样才能更好
当我们对测试用例进行参数化时,使用@pytest.mark.parametrize的ids参数自定义测试用例的标题,当标题中有中文时,控制台和测试报告中会出现Unicode编码问题,这看起来特别像乱码,我们想让中文正常展示出来,需要用到pytest框架的钩子函数pytest_collection_modifyitems。先看问题:#file_n
前言:什么是元数据?元数据是关于数据的描述,存储着关于数据的信息,为人们更方便地检索信息提供了帮助。pytest框架里面的元数据可以使用pytest-metadata插件实现。文档地址https://pypi.org/project/pytest-metadata/未安装插件pytest-metadata之前执行:环境搭建:使用
前言前面一篇讲了setup、teardown可以实现在执行用例前或结束后加入一些操作,但这种都是针对整个脚本全局生效的如果有以下场景:用例1需要先登录,用例2不需要登录,用例3需要先登录。很显然无法用setup和teardown来实现了fixture可以让我们自定义测试用例的前置条件 
前言:写完一个项目的自动化用例之后,发现有些用例运行较慢,影响整体的用例运行速度,于是领导说找出运行慢的那几个用例优化下。--durations参数可以统计出每个用例运行的时间,对用例的时间做个排序。pytest-h查看命令行参数,关于--durations=N参数的使用方式--durations=N
钩子函数之pytest_addoption介绍:①pytest_addoption钩子函数可以让用户注册一个自定义的命令行参数,以便于用户在测试开始前将数据从外部(如:控制台)传递给程序;【程序根据获取的用户传递的自定义的参数值来做一些事情】②pytest_addoption钩子函数一般和内置fixturepytestcon
[pytest]#命令行参数----空格分隔,可添加多个命令行参数-所有参数均为插件包的参数addopts=-s-reruns1--html=..eporteport.html#测试路径----当前目录下的scripts文件夹-可自定义testpaths=../scripts#搜索文件名----当前目录下的scripts文件夹下,以test_开头,以.py
python通用测试框架大多数人用的是unittest+HTMLTestRunner,这段时间看到了pytest文档,发现这个框架和丰富的plugins很好用,所以来学习下pytest. image.pngpytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点:简单灵活,容易上手支持参数化能够支持简单的单
1、装饰器,放在函数前面,跳过用例 @pytest.mark.skip(reason="nowayofcurrentlytestingthis")importpytestdeftest1():print('操作1')print("-----------------------------------------------")@pytest.mark.skip(reason="nowayofcur
本文实例为大家分享了python下载微信公众号相关文章的具体代码,供大家参考,具体内容如下目的:从零开始学自动化测试公众号中下载“pytest"一系列文档1、搜索微信号文章关键字搜索2、对搜索结果前N页进行解析,获取文章标题和对应URL主要使用的是requests和bs4中的Beautifulsoup
From:https://www.jianshu.com/p/54b0f4016300一.fixture介绍fixture是pytest的一个闪光点,pytest要精通怎么能不学习fixture呢?跟着我一起深入学习fixture吧。其实unittest和nose都支持fixture,但是pytest做得更炫。fixture是pytest特有的功能,它用pytest.fixture标识,定义在函
参数化有两种方式:1、@pytest.mark.parametrize2、利用conftest.py里的pytest_generate_tests 1中的例子如下:@pytest.mark.parametrize("test_input,expected",[("3+5",8),("2+4",6),("6*9",42)])deftest_eval(test_input,expected):
pytest优于其他测试框架的地方:1、简单的测试可以简单的写2、复杂的测试也可以简单的写3、测试的可读性强4、易于上手5、断言失败仅使用原生assert关键字,而不是self.assertEqual()或者self.assertLessThan()6、pytest可以运行有unitest和nose编写的测试用例pytest不依赖pyth
学习python的pytest框架需要的基础知识和学习准备测试从业者学习python应该掌握的内容:首先是变量和数据类型,其次列表、字典以及Json的一些处理,再者就是循环判断以及函数或类这些内容。其中的重点:1.循环判断以及字典这块是重点2.函数和类,类的学习这块要花较多时间去学
前言pytest可以支持自定义标记,自定义标记可以把一个web项目划分多个模块,然后指定模块名称执行。app自动化的时候,如果想android和ios公用一套代码时,也可以使用标记功能,标明哪些是ios用例,哪些是android的,运行代码时候指定mark名称运行就可以mark标记1.以下用例,标记test_send_http(
unittest参考文档: https://docs.python.org/3/library/unittest.htmlunittest笔记TheunittestunittestingframeworkwasoriginallyinspiredbyJUnitandhasasimilarflavorasmajorunittestingframeworksinotherlanguages.Itsupportstestautomation,shar
fixture场景一:参数传入代码如下:运行结果: