百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Pytest单元测试框架:简单好用的参数化以及多种运行模式

ccwgpt 2024-10-09 08:37 22 浏览 0 评论

单元测试框架,大家较为熟悉的有 Unittest、Nose(unittest 的扩展)。Pytest 倒是名不见经传,但是自从用了之后,就爱不释手,就像它自己描述的一样:simple powerful testing with Python。简单好用的参数化以及多种运行模式,让测试脚本简单清晰,调试运行更加方便。

一、参数化

比如我们在做自动化测试,当传入不同的参数时,期望返回的status code为200。如果用 Unittest做这块参数化比较复杂,而 pytest 会简单很多。在pytest中有pytest.mark.parametrize装饰器,轻松解决问题。我们就拿sogo的搜索作为例子。

用例说明:

步骤一、打开搜狗搜索(http://www.sogou.com/)

步骤二、输入tesla后点放大镜搜索

期望:返回正常

如果用接口来做的话,就相当于在query参数后面传tesla即可,验证状态码为200

如果用接口来做的话,就相当于在query参数后面传tesla即可,验证状态码为200

Import requests

Session = requests.session()

url = 'https://www.sogou.com/web?'

para = {'query': 'tesla'}

r = session.get(url, params=para, verify=False, allow_redirects=False)

assert r.status_code == 200

事实上,如果仅仅传一个搜索词就认为这个接口正常,那么很可能就出大篓子。所以我们可能需要传n个搜索词做验证。也就是说,para中的query后面的内容我们需要传多个不同的搜索词。比如说我们想搜索VR,BITCOIN等多个词的话,需要怎么做呢?

这个时候就是使用pytest中有pytest.mark.parametrize装饰器,如下代码第8行,通过在方法外面加一个装饰器就可以了。

Import pytest

Import requests

Session = requests.session()

url = https://www.sogou.com/web?'

search= ['tesla','VR','BITCOIN']

@pytest.mark.parametrize('test_input',search)

def test_status_code(test_input):

para = {'query':test_input}

r= session.get(url,params=para, verify=False, allow_redirects=False)

assert r.status_code == 200

此时有可能有同学提出疑问,对于多个参数我们用for循环也是可以做的,为何要用这个方法。原因是用pytest的参数化,传入的一个参数就是一个case,上面的例子我们传入了三个参数,那么形成的就是三个cases,哪个参数传入导致出错了,我们一目了然。那么要怎么做呢?我们在cmd里面运行脚本,假设脚本文件名为test_sogo_search.py,位置放在C盘下:

C:\>pytest test_sogo_search.py --html=./result/Report.html

在pytest的报告中你看到的是这样的

通过这样的报告,就能很清晰的知道哪个搜索词的验证结果是正确,哪个搜索词验证的结果是错误的。比起用for循环来说,是要清晰很多了。另外还有运行的时长,也是能给到额外的信息。

二、运行模式

Pytest的多种运行模式,让测试和调试变得更加得心应手,下面介绍5种用的比较多的模式。在介绍之前需要提醒一句,运行pytest时会找test开头的文件以及以test开头的方法或者class,不然就会提示找不到可以运行的case了。

1、运行后产生结果报告(htmlReport)

运行模式:

pytest test_case.py --html=./result/test_caseReport.html

效果:

当运行出错时,在report里能直观的看到错误原因,上图中,预期希望的status_code是302,但是实际是 200,所以就报错了。看着报告定位问题就变的非常容易。且测试结果不用整理,直接提交报告即可。

2、运行指定的Case

代码块(test_case.py)

class TestClassOne(object):

def test_one(self):

x = "this"

assert 'h' in x


def test_two(self):

x = "hello"

assert hasattr(x, 'check')

class TestClassTwo(object):

def test_one(self):

x = "this"

assert 'h' in x


def test_two(self):

x = "hello"

assert hasattr(x, 'check')

运行模式:

模式 1:$ pytest test_case.py

模式 2:$ pytest test_case.py::TestClassTwo

模式 3:$ pytest test_case.py::TestClassTwo::test_one

说明:

模式 1:直接执行整个test_case文件中在所有case

模式 2:运行test_case文件中TestClassTwo这个class下的两个cases

模式 3:运行test_case文件中TestClassTwo这个class下的test_one

效果:

当我们写了较多的cases时,如果每次调式都要运行一遍,无疑是很浪费时间的,通过这样的简单方式我们就可以方便的指定任何一个case来运行了。

注意:

定义class时,需要以T开头,不然pytest是不会去运行该class的。

3、多进程运行cases

pip install pytest-xdist

运行模式:

$ pytest tes_case.py -n NUM

效果:

当case达到一定量的时候,运行时间会变的很长,如果想缩短脚本运行的时间,那就可以用它来做。NUM填写你想并发的进程数。速度嗖嗖嗖~不信你试试!

4、重试运行cases

pip install pytest-rerunfailures

运行模式:

$pytest tes_case.py --reruns NUM

效果:

在做接口测试时,有时候会遇到 503 或者短时的网络波动,导致case会运行失败,而其实并非是我们想要的结果,此时可以通过重新运行case的方式,再次执行。重试多少次,跟你填写的NUM有关。

5、显示print内容

运行模式:

$pytest tes_case.py -s

效果:

在运行测试脚本时,为了调试或者想打印一些内容,我们会在代码中加一些print内容,但是在运行pytest时,这些内容不会被显示出来。如果带上-s的运行模式,就可以看到print的内容会显示出来。

另外Pytest的多种运行模式是可以叠加执行的,比如说,你想同时运行 4个进程又想打印出print的内容,可以用$pytest test_case.py -s -n 4

三、总结

pytest的安装简单,学习资料丰富,框架切换成本低,有兴趣就一起来学习pytest吧!

最后:

1)关注+私信回复:“测试”,可以免费领取一份10G软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Mysql数据库、抓包工具、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试等。

2)关注+私信回复:"入群" 就可以邀请你进入软件测试群学习交流~~

相关推荐

谷歌正在为Play商店进行Material Design改造

谷歌最近一直忙于在其应用程序中完成MaterialDesign风格的改造,而Play商店似乎是接下来的一个。9to5Google网站报道,有用户在Play商店的最新版本中发现了新界面,暗示该应用和网...

企业网站免费搭建,定制化建站CMS系统

科腾软件企业网站CMS管理系统已完成开发工作,首次开源(全部源码)发布。开发工具:VisualStudioEnterprise2022数据库:SQLite(零配置,跨平台,嵌入式)开发...

您需要的 11 个免费 Chrome 扩展程序

来源:SEO_SEM营销顾问大师Chrome扩展程序是SEO的无名英雄,他们在幕后默默工作,使您的策略脱颖而出并提高您的努力效率。从竞争对手研究到审核您的网站,速度比您说“元描述”还快,这些小工具发...

户外便携设备抗干扰困境如何破局?CMS-160925-078S-67给出答案

  在户外复杂的电磁环境中,便携式设备中的扬声器需具备出色抗干扰能力,CUID的CMS-160925-078S-67在这方面表现突出。  从其结构设计来看,矩形框架虽主要为适配紧凑空...

一个基于NetCore开发的前后端分离CMS系统

今天给大家推荐一个开源的前后端分离架构的CMS建站系统。项目简介这是一个基于.Net3构建的简单、跨平台、模块化建站系统。系统业务简单、代码清晰、层级分明、全新架构便于二次扩展开发。支持多种数据库,...

本地Docker部署ZFile网盘打造个人云存储

前言本文主要介绍如何在LinuxUbuntu系统使用Docker本地部署ZFile文件管理系统,并结合cpolar内网穿透工具实现远程访问本地服务器上的ZFile传输与备份文件,轻松搭建个人网盘,无...

pcfcms企业建站系统 免费+开源的企业内容管理系统

项目介绍pcfcms是基于TP6.0框架为核心开发的免费+开源的企业内容管理系统,专注企业建站用户需求提供海量各行业模板,降低中小企业网站建设、网络营销成本,致力于打造用户舒适的建站体验。演示站...

【推荐】一个高颜值且功能强大的 Vue3 后台管理系统框架

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍SnowAdmin是一款基于Vue3、TypeScript、Vite5、Pinia、Arco-Desi...

java开源cms管理系统框架PublicCMS后台管理系统

一款使用Java语言开发的CMS,提供文章发布,图片展示,文件下载,用户权限、站点模块,内容管理、分类等功能。可免费用于商业用途maven工程数据库脚本在工程中database文件夹下代码结构:效果...

一定要大量读书:当我问Deepseek,它给出的高效阅读方法厉害了!

一年一度的世界读书日,总该写点什么。于是,我去问Deepseek给我推荐人生破局必读的10本书,结果它给了我回复,竟然10本推荐的书籍里,我都曾经浏览过,同时还给出破局关键。而说浏览过,不是读过,是因...

《搜神札记》:不应磨灭的惊奇(小说《搜神记》)

□黄勃志怪传说的书写一直是文人墨客的后花园,晚近尤盛,从张岱到袁枚到纪昀,收集那些或阴森或吊诡的行状故事,遂成一类,到民国年间,周作人挟此遗传,捋袖子拿希腊神话动刀,乃兄鲁迅不甘其后,《故事新编》虎...

《如何构建金字塔》之第三章总结(构建金字塔结构的方法有)

“没有什么比一套好理论更有用了。”——库尔特.勒温这篇读后感依然引用了这句库尔特.勒温名言,这句话也是我读芭芭拉.明托这本书的初衷。今天就“如何构建金字塔”,我来谈谈我的读后心得。我热爱写作,但是写...

《助人技术》第一章助人引论内容框架

第一章内容基本呈现如何成为助人者(心理咨询师)以及一些相关基础知识,对于进入这个行业有兴趣以及希望通过心理咨询寻求帮助但存有疑虑的当事人,都值得一读。心理咨询的三个阶段(不是说严格的三个阶段,而是广义...

AI助手重构读后感写作流程:从提纲到完整性思考的转换

大家好!你有没有遇到过读完一本书,想要写读后感,却不知道从何下手的情况呢?今天我们要来探讨一下如何利用稿见AI助手来重构读后感写作流程,从提纲到完整性思考的转换。让我们一起来看看这个全新而又实用的方法...

图解用思维导图做读书笔记技巧(图解用思维导图做读书笔记技巧视频)

做阅读笔记非常有利于读后进行有效的深入思考,而思维导图这一强大的工具其最大的特点就是架构清晰,在阅读过程中对文章的分析、总结、分类起着很大的辅助作用。思维导图读书笔记步骤:1、阅读大纲。首先要快速浏览...

取消回复欢迎 发表评论: