一、介绍

pytest是一个非常成熟的Python测试框架,能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests);pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等。

二、安装

安装命令:pip install pytest 
        验证安装:pytest --version

安装测试报告模板:pip install pytest-html
        安装失败后重新执行模板: pip install pytest-rerunfailures

三、pytest约束规则

1、文件名要满足test_*.py格式或*_test.py格式。
        2、测试类以Test开头,并且不能带有 init 方法(注意:定义class时,需要以T开头,不然pytest是不会去运行该class的,正是由于有Test开头做标识,不需要init方法启动(个人理解))
        3、类中,方法以test开头,可以包含一个或多个test_开头的函数。 在执行pytest命令时,会自动从当前目录及子目录中寻找符合上述约束的测试函数来执行。
        4、批量执行,脚本名以 test 开头。

四、编写脚本

import pytest# 被测试函数
def add(a, b):return a + bclass TestCase:# 测试脚本def test_add(self):assert 3 == add(1, 2)if __name__ == '__main__':pytest.main()

通过断言,检验定义的方法 add 输出的结果是否符合预期

五、运行

方式:输入命令:pytest  参数 命令 脚本

collected 2 items :表示加载到两个测试用例;

六、常用参数

1、-v 输出详细的信息
        2、-s 输出测试函数或测试方法print内容
        3、-k 如: -k “add” 执行所有测试用例名中含有“add”的用例

4、-m按分类执行测试点; 如 -m a  则对标记为a 的用例进行测试,不标记为a 的用例不会被执行;
        5、-x  执行中有fail失败的用例,立刻停止
        6、--maxfail  执行失败的最大次数,如果设定最大失败的次数是2, 那么如果两个用例执行失败, 后面的会停止执行;如 pytest --maxfail =2 
        7、–tb=line 错误信息在一行展示

七、参数化

例如进行接口测试时,测试登录功能,上传图片功能等;可能只是字符串长度不一样、字符种类不一样,文件大小不一样,或是否为空等,但是执行的用例是一样的,这样为了方便,不用重复写;可以使用参数化,把不同的参数,传到同一个用例里。

@pytest.mark.parametrize('a',[1,2,3,4,5])
def test(a):print(a)if __name__ == '__main__':pytest.main()

八、前置后置

模块级:该方法表示只能类外面执行用例过程中,作用范围为当前模块,当前模块执行前后都运行一次前置和后置;无论有多少个用例,模块级的前置和后置都只跑一遍。
        setup_module(),前置,模块执行前运行一次;
        teardown_module(),后置,模块执行后运行一次;

函数级:该方法表示在类外面执行用例过程中,作用范围为当前面模块中的每一个测试函数,模块中的每个用例执行前后分别运行一次。
        setup_function(),前置,每个用例执行前运行一次
        teardown_function,后置,每个执行后运行一次;

类级别:作用范围为当前类中的每一个测试用例,当前类执行前后分别运行一次。只执行1次测试前置和测试后置
        setup_class(),前置,类中执行前运行一次
        teardown_class,后置,类中执行后运行一次;

方法级:作用范围为类中的每个测试方法,每次执行测试用例前,测试前置和测试后置都会执行一次。
        setup_method()或setup();前置,每个用例执行前运行一次
        teardown_method()或teardown();后置,每个执行后运行一次;

import pytestdef setup_module():print("\n模块前置!")def teardown_module():print("模块后置!")def setup_function():print("函数前置!")def teardown_function():print("函数后置!")@pytest.mark.parametrize('a',[1,2,3,4,5])
def testModule(a):print(a)@pytest.mark.parametrize('a',[6,7])
def testAdd(a):print(a)class Testcase:def setup_class(self):print("类前置")def teardown_class(self):print("类后置")def setup_method(self):print("方法前置!")def teardown_method(self):print("方法后置!")@pytest.mark.parametrize('a', [8, 9])def test(self,a):print(a)if __name__ == '__main__':pytest.main()

九、测试实例

一、验证登录的 测试用例

import pytest
import requests#创建session对象,用于实现会话保持
req = requests.session()#登录 接口
#提前在模块前置把要测试登录接口的数据录入到data里,如用户名过长、非法字符、过短,及密码、预期结果等;data的每组数据为用户名、密码、预期结果
#通过参数化,就可以对所有用例运行一遍,把返回结果与预期结果比对;
#@pytest.mark.parametrize('data',data)
def test_login(data)url = 'http://192.168.0.1:8080/login'data ={'username':data[0],'pwd':data[1]}r = requests.post(url,data)assert data[2] == r.textprint(r.text)if __name__ == '__main__':#运行,并保存报告pytest.main(['-v',-f'--html={report_path}/{t}.html',case_path])

二、 验证 template.wps.com 的搜索接口:
        把测试用例写好放到:E:/automationtest/searchParameter.xls ,为了方便处理,Excel表格每列一个参数;参数部分如图:

代码:

import xlrd
import pytest
import requests#获取工作薄文件对象
wb = xlrd.open_workbook("E:/automationtest/searchParameter.xls")
#返回Excel文件中所有的sheet对象,通过对象调用 name 返回sheet名称
sheets = wb.sheets()#sheet名获取指定的表
sheet = wb.sheet_by_name("Sheet1")#用list 保存从xls表读取出来的数据,这些都是要做接口测试的参数;
list=[]
for index in range(1,sheet.nrows):list.append(sheet.row_values(index,7,14))index = index + 1for index in list:print(index)#第n行,第m列的元素
#   value = sheet.cell(n,m).value#取出所有参数,做参数化;
'''
#不能用下面这种方式做;否则就是所有参数的全组合;
#这种类型的参数化是所有的组合;不是4列;
@pytest.mark.parametrize("platf", platf)
@pytest.mark.parametrize("excludePayTemplate", excludePayTemplate)
@pytest.mark.parametrize("is_excluded", is_excluded)
@pytest.mark.parametrize("excluded_member_discount", excluded_member_discount)
@pytest.mark.parametrize("keyword", keyword)
@pytest.mark.parametrize("start", start)
@pytest.mark.parametrize("count", count)
'''
@pytest.mark.parametrize("list", list)
def testSearch(list):url = "https://template.wps.com/server/pf/template"param = {'platf': list[0],'excludePayTemplate':list[1],'is_excluded':list[2],'excluded_member_discount':list[3],'keyword':list[4],'start':list[5],'count':list[6]}response = requests.get(url=url,params=param)
#输出响应码和响应信息;也可以把预期结果当做一个参数传进来做断言判断print(response.status_code,'  ',response.text,'\n')if __name__ == "__main__":pytest.main(["-s", "testSearch.py"])

项目结构:
                    
        case:保存每个接口的测试脚本;
        common:保存公共模块,如数据库操作、CVS文件读取等
        data:保存每个接口的测试用例
        report:用于保存测试报告
 
        
十、fixture     

介绍:

前面提到前置、后置;编写用例时候需要用到用例的前置和用例的后置,可以用setup_class和teardown_class等帮助我们完成,但是不够完善而且灵活性不够强。例如:一个calss中有3条用例,其中2条需要登录,1条不需要登录,这个时候如果在用setup和teardown来做就有点不方便。fixture可以用做测试 用例的前置和后置操作,且fixture命令规范没有setup、teardown的格式。可以随意命名。控制fixture的前置和后置操作是通过yield关键字进行区分,代码在yield前面的属于前置操作,代码在yield后面的属于后置操作。且fixture不要求前后置同时存在,可以只存在前置或只存在后置。fixture如果有后置内容,无论遇到什么问题,都会进行执行后置的代码。

使用:

   用 @pytest.fixture()  装饰器声明一个函数是 fixture,如果测试函数的参数列表中包含 fixture 名,那么 pytest 就会检测到,并在运行测试函数之前运行它,fixture 可以返回数据给测试函数。
        
        参数列表:
        @pytest.fixture(scope="function", params=None, autouse=False, ids=None, name=None)
         scope 可选参数,默认为 function ,可选值为 function、class、module、session,范围依次增加。session的作用域是整个测试会话,即开始执行pytest到结束测试。
        autouse:默认:False,需要用例手动调用该fixture;如果是True,所有作用域内的测试用例都会自动调用该fixture
        name:默认:装饰器的名称,同一模块的fixture相互调用建议写个不同的name

import pytest@pytest.fixture
def login():print("先登录")yieldprint("退出登录 ")def test_s1(login):print("测试用例 1:登录后的其它操作!")def test_s2():  # 不传 loginprint("测试用例 2:不需要登录,")if __name__ == '__main__':pytest.main()

十一、HTML报告生成

一种是Pytest的 pytest-html插件,另一种是 allure-pytest插件;

使用pytest-html生成html测试报告:
        安装pytest-html插件:pip install pytest-html
        运行命令: --html=reportname.html,其中 reportname为要生成报告的名称。
        如:针对 test.py 生成报告,在 terminal 输入:pytest --html=report.html test.py

pytest测试框架快速搭建相关推荐

  1. Python编程必不可少的pytest测试框架

    进行编程测试重要的是为了更高效的完成功能的实现. pytest是基于unittest实现的第三方测试框架,比 unittest 更加的简洁.高效,并且可以完美兼容 unittest 的测试代码,无需对 ...

  2. 使用ThinkPHP框架快速搭建网站【转】

    原文地址:http://blog.csdn.net/ruby97/article/details/7574851 使用ThinkPHP框架快速搭建网站 这一周一直忙于做实验室的网站,基本功能算是完成了 ...

  3. Pytest测试框架(二):pytest 的setup/teardown方法

    系列文章目录 Pytest测试框架(一):pytest安装及用例执行 Pytest测试框架(二):pytest 的setup/teardown方法 Pytest测试框架(三):pytest fixtu ...

  4. dg建立linux分区,Linux平台 Oracle 11g DG测试环境快速搭建参考

    Linux平台 Oracle 11g DG测试环境快速搭建参考 环境现状: 两台虚拟主机A和B: 1. A机器已安装ASM存储的Oracle 11g 实例 参考: 2. B机器已安装系统,配置以及目录 ...

  5. Pytest 测试框架——数据驱动

    引言 前面已经和大家介绍过 Unittest 测试框架的数据驱动框架 DDT,以及其实现原理.今天和大家分享的是 Pytest 测试框架的数据驱动,Pytest 测试框架的数据驱动是由 pytest ...

  6. Pytest测试框架(五):pytest + allure生成测试报告

    系列文章目录 Pytest测试框架(一):pytest安装及用例执行 Pytest测试框架(二):pytest 的setup/teardown方法 Pytest测试框架(三):pytest fixtu ...

  7. 基于Hexo框架快速搭建个人博客--文章一键发布(五)

    基于Hexo框架快速搭建个人博客--文章一键发布 一.文章对比 二.发布到Github 三.一键发布 四.总结 博客链接: 会思想的苇草i 文章链接: 基于Hexo框架快速搭建个人博客–搭建(一) 基 ...

  8. 5 分钟快速上手 pytest 测试框架

    本文将会把关于 Pytest 的内容分上下两篇,上篇主要涉及关于 pytest 概念以及功能组件知识的介绍,下篇主要以一个 Web 项目来将 Pytest 运用实践中. 为什么要做单元测试 相信很多 ...

  9. maven中ssm框架快速搭建

    有不少朋友在maven中因为pom文件依赖的事导致报错 今天我这个快速搭建ssm框架,确保在jdk7或者jdk8的环境,tomcat没什么要求.但如果要用jdk8的话,最好用run as中的serve ...

最新文章

  1. sql已经完成,生成表
  2. 1884: 三个家庭(思维题)
  3. Ping pong【树状数组】
  4. linux 用dg分区,[bug报告] 兼容性问题,mbr硬盘使用分区扩容后linux系统不认分区...
  5. java 学到什么实习_我的外展实习从今天开始! 到目前为止,这是我已经完成并学到的东西。...
  6. 真正能成大事的人,往往有一个“共同特征”
  7. fstab损坏无法开机的修复
  8. android通过Canvas和Paint截取无锯齿圆形图片
  9. 华三 h3c Ftp、Telnet配置
  10. 2022年中级通信工程师的考试资料,考试延期快快点刷题
  11. 在线翻译、词典、离线工具大全
  12. LINUX下打包jar
  13. 深入浅出的理解频谱泄露
  14. 学习《华为基本法》(8):人力资源管理准则
  15. crmeb 一号通使用方法
  16. AutoJs学习-获取QQ群消息
  17. phyton 100题(更新中)
  18. Matlab代码书写规范
  19. 带上传文件功能的写CSDN博客并发表
  20. twrp Xposed zip包脚本定制全解析

热门文章

  1. bootstrap表头如何展示不动_bootstrap-table实现表头固定以及列固定的方法示例
  2. android解析解析数据格式文件,android 解析nmea原始数据
  3. android usb打印机a4,打印机随身带 全球最小A4打印机试用
  4. CAD看图软件也可以简单绘图吗?
  5. 10 分钟实现 Spring Boot 发生邮件功能
  6. python学习——CMD中快速执行python文件
  7. 相比4G,5G有那些优势满足工业4.0的技术需求
  8. C语言中如何计算结构体的字节大小
  9. camera sensor简单曝光原理
  10. Lazada 客户端ERP管理软件