如何使用Pytest进行自动化测试
为什么需要自动化测试
自动化测试有很多优点,但这里有3个主要的点
- 可重用性:不需要总是编写新的脚本,除非必要,即使是新的操作系统版本也不需要编写脚本。
- 可靠性:人容易出错,机器不太可能。当运行不能跳过的重复步骤/测试时,速度会更快。
- 全天运行:您可以在任何时间或远程启动测试。夜间运行正在测试你的软件,即使是在你睡着的时候。
成熟的、功能齐全的Python测试工具——pytest
目前有多种可用的测试框架和工具。这些框架的风格也各不相同,比如数据驱动、关键字驱动、混合、BDD等等。您可以选择最适合您的要求。
Python和pytest在这场竞争中占据了巨大的份额。Python及其相关工具之所以被大量使用,可能是因为与其他语言相比,没有或很少编程经验的人更能负担得起它们。
pytest框架使得编写小型测试变得很容易,但是可以扩展到支持应用程序和库的复杂功能测试。
Pytest的一些主要特性:
- 自动发现测试模块和功能
- 有效的CLI来更好地控制您想要运行或跳过的内容
- 大型第三方插件生态系统
- 固定装置-不同的类型,不同的范围
- 与传统的单元测试框架一起工作
自动和可配置的测试发现
在默认情况下,pytest期望在名称以test_开头或以_test.py结尾的python模块中找到测试。在默认情况下,它期望测试函数名以test_ 开头。但是,可以通过在pytest的一个配置文件中添加您自己的配置来修改这个测试发现协议。
# content of pytest.ini
# Example 1: have pytest look for "check" instead of "test"
# can also be defined in tox.ini or setup.cfg file, although the section
# name in setup.cfg files should be "tool:pytest"
[pytest]
python_files = check_*.py
python_classes = Check
python_functions = *_check
让我们看一下非常基本的测试函数。
class CheckClass(object):
def one_check(self):
x = "this"
assert 'h' in x def two_check(self):
x = "hello"
assert hasattr(x, 'check')
你注意到什么了吗?没有花哨的assertEqual或assertDictEqual等,只是简单明了的断言。对于比较两个对象的简单操作,不需要导入这些断言函数。assert是python已经提供的功能,因此无需重新发明。
固定装置会起作用的
查看测试功能,测试钱包软件的基本操作,比如,
// test_wallet.py
from wallet import Walletdef test_default_initial_amount():
wallet = Wallet()
assert wallet.balance == 0
wallet.close()def test_setting_initial_amount():
wallet = Wallet(initial_amount=100)
assert wallet.balance == 100
wallet.close()def test_wallet_add_cash():
wallet = Wallet(initial_amount=10)
wallet.add_cash(amount=90)
assert wallet.balance == 100
wallet.close()def test_wallet_spend_cash():
wallet = Wallet(initial_amount=20)
wallet.spend_cash(amount=10)
assert wallet.balance == 10
wallet.close()
嗯,有意思!你注意到了吗,很多样板文件。另一件值得注意的事情是,测试除了测试功能之外还做了一些其他的事情,例如实例化钱包并关闭它——Wallet .close()
现在让我们看看如何使用pytest fixture去除样板
import pytest
from _pytest.fixtures import SubRequest
from wallet import Wallet#==================== fixtures
@pytest.fixture
def wallet(request: SubRequest):
param = getattr(request, ‘param’, None)
if param:
prepared_wallet = Wallet(initial_amount=param[0])
else:
prepared_wallet = Wallet()
yield prepared_wallet
prepared_wallet.close()#==================== testsdef test_default_initial_amount(wallet):
assert wallet.balance == 0@pytest.mark.parametrize(‘wallet’, [(100,)], indirect=True)
def test_setting_initial_amount(wallet):
assert wallet.balance == 100@pytest.mark.parametrize(‘wallet’, [(10,)], indirect=True)
def test_wallet_add_cash(wallet):
wallet.add_cash(amount=90)
assert wallet.balance == 100@pytest.mark.parametrize(‘wallet’, [(20,)], indirect=True)
def test_wallet_spend_cash(wallet):
wallet.spend_cash(amount=10)
assert wallet.balance == 10
整洁!不是吗。测试函数非常微妙,只做它们想做的事情。夹具钱包负责设置和拆卸、实例化和关闭钱包。它不仅有助于编写可重用的代码,还增加了数据分离的本质。如果仔细看,钱包数量是一块测试逻辑之外提供的测试数据,而不是硬编码在测试函数内部。
@pytest.mark.parametrize(‘wallet’, [(10,)], indirect=True)
在更可控的环境中,您可以在存储库中有一个测试数据文件,例如test-data.ini,以及读取该文件的包装器,并且您的测试函数可以调用包装器的另一个接口来读取测试数据。
但是,建议将您的fixture作为conftest.py文件的一部分。这是pytest中的一个特殊文件,它允许测试发现全局fixture。
但是,有一个针对许多不同数据集执行的测试用例!
不用担心,pytest有一个很酷的特性来参数化您的fixture。让我们用一个例子来看看它。
假设您的产品公开CLI接口以在本地管理它。此外,您的产品在启动时设置了许多默认参数,您需要验证所有这些参数的默认值。
我们可以考虑为每个设置编写一个测试用例,但是使用pytest就容易得多了
@pytest.mark.parametrize(“setting_name, setting_value”, [(‘qdb_mem_usage’, ‘low’),
(‘report_crashes’, ‘yes’),
(‘stop_download_on_hang’, ‘no’),
(‘stop_download_on_disconnect’, ‘no’),
(‘reduce_connections_on_congestion’, ‘no’),
(‘global.max_web_users’, ‘1024’),
(‘global.max_downloads’, ‘5’),
(‘use_kernel_congestion_detection’, ‘no’),
(‘log_type’, ‘normal’),
(‘no_signature_check’, ‘no’),
(‘disable_xmlrpc’, ‘no’),
(‘disable_ntp’, ‘yes’),
(‘ssl_mode’, ‘tls_1_2’),])def test_settings_defaults(self, setting_name, setting_value):
assert product_shell.run_command(setting_name) == \
self.”The current value for \’{0}\’ is \’{1}\’.”.format(setting_name, setting_value), \
‘The {} default should be {}’.format(preference_name, preference_value)
很酷,不是吗!,你只写了13个测试用例(每个不同setting_value),在未来如果你添加一个新的设置到你的产品,你需要做的就是,再添加一个tuple上面。
它是如何与selenium和API测试的UI测试集成的
嗯,你的产品可以有多种界面。CLI -就像我们上面讨论的。类似地,GUI和API。在部署软件之前,对所有软件进行测试是很重要的。在多个组件相互依赖和耦合的企业软件中,某个部分的更改可能会影响其他部分。
记住,pytest只是一个促进“测试”的框架,而不是特定类型的测试。因此,您可以使用selenium构建GUI测试,或者使用Python的请求库构建API测试,然后使用pytest运行它。
例如,在高层次上,这可能是您的测试存储库结构。
正如您在上面看到的,这可以很好地分离组件。
- apiobjects:为调用API端点创建包装器的好地方。您可以使用BaseAPIObject和派生类来满足您的需求。
- helper:编写您的helper方法
- 库文件,它可以被不同的组件使用,例如你的fixture在conftest, pageobjects等。
- pageobjects:
pageobjects设计模式可用于创建不同GUI页面的类。我们在站得住使用Webium,它是Python的一个页面对象模式实现库。 - 套件:您可以在这里编写pylint代码验证套件,这将有助于您对代码质量有信心。
- 测试:可以根据测试的风格对测试目录进行分类。它使管理和研究您的测试变得容易。
这只是供参考,存储库的结构和依赖关系可以按照您的需要进行布局。
我有足够的测试用例,想并行运行它们
您的测试套件中可能有大量的测试用例,并且有时您可能想并行地运行测试用例,以减少总体测试执行时间。
Pytest提供了一个很棒的并行运行测试的插件,名为Pytest -xdist,它用一些独特的执行模式扩展了Pytest。使用pip安装此插件
pip install pytest-xdist
让我们通过一个示例来快速研究它。
我有一个自动化测试存储库CloudApp,用于使用selenium进行GUI测试。此外,它还随着新的测试用例不断增长,现在已经有了数百个测试。我想做的是并行运行它们,并减少测试执行时间。
在终端中,只需在项目根文件夹/ tests文件夹中键入pytest。这将执行所有测试。
pytest -s -v -n=2
并行运行测试的pytest-xdist
这还可以帮助您在多个浏览器上并行运行测试。
报告
Pytest内置支持创建结果文件,可由Jenkins、Bamboo或其他持续集成服务器读取,使用如下调用:
pytest test/file/path — junitxml=path
这可以生成很好的XML风格的输出,可以由许多CI系统解析器解释。
结论
Pytest的受欢迎程度逐年上升。此外,它还拥有广泛的社区支持,这让您可以访问很多扩展,比如pytest-django,它可以帮助您为Django web应用程序集成编写测试。记住,pytest支持运行unittest测试用例,所以如果您正在使用unittest, pytest是值得考虑的。
如果你
①从事功能测试,想进阶自动化测试
②在测试界混了1、2年,依然不会敲代码
③面试大厂却屡屡碰壁
我邀你进群吧!来吧~~测试员,313782132(Q群里有技术大牛一起交流分享,学习资源的价值取决于你的行动,莫做“收藏家”)获取更多大厂技术、面试资料
如果对python自动化测试、web自动化、接口自动化、移动端自动化、面试经验交流等等感兴趣的测试人,可以关注微信公众号:【伤心的辣条】,获取软件测试工程师大厂面试资料!
最后:
凡事要趁早,特别是技术行业,一定要提升技术功底,丰富自动化项目实战经验,这对于你未来几年职业规划,以及测试技术掌握的深度非常有帮助。
如何使用Pytest进行自动化测试的更多相关文章
- 基于Pytest豆瓣自动化测试【1】
-- Pytest基础使用教程[1] 引言 Pytest 是一个非常实用的自动化测试框架,目前来说资料也是非常多了.最近某友人在学习 Python的一些测试技术,帮其网上搜了下教程:发现大多数文章多是 ...
- Pytest UI自动化测试实战实例
前言 明天就放假了,4天小长假,是不是很开心!也许很多人要回老家帮家里种地,干农活.其实能陪陪家里人,帮忙干点农活还是挺开心的,希望大家有个愉快的假期!废话不多说哈,今天再来说说pytest吧,经过几 ...
- python pytest测试框架介绍五---日志实时输出
同样的,在使用pytest进行自动化测试时,需要将实时日志打印出来,而不是跑完后才在报告中出结果. 不过,好在pytest在3.3版本开始,就支持这一功能了,而不用再像nose一样,再去装第三方插件. ...
- Selenium学习笔记(1) - 自动化测试体系与原理
技术体系 基于代码的测试(Code-Based Testing) 基于协议的测试(Protocol-Based Testing) 基于界面的测试(GUI-Based Testing) 工作原理 基于代 ...
- 【Pytest01】全网最全最新的Pytest框架快速入门
一.Pytest简介pytest是一个非常成熟的全功能的Python测试框架,主要有一下几个特点:1.简单灵活,容易上手,支持参数化2.能够支持简单的单元测试和复杂的功能测试,还可以用来做seleni ...
- python3: 自动化测试框架pytest
最近在学习web自动化,所以在这里总结一下pytest框架. 其实pytest 和 unittest 都是自动化测试框架,但是pytest更好用一些,有以下几个优点:1)可以根据标签执行用例:2)?? ...
- 【转】自动化测试框架: pytest&allure ,提高自动化健壮性和稳定性
序 在之前,我写过一个系列“从零开始搭建一个简单的ui自动化测试框架(pytest+selenium+allure)”,在这个系列里,主要介绍了如何从零开始去搭建一个可用的自动化工程框架,但是还缺乏了 ...
- 浅谈如何提高自动化测试的稳定性和可维护性 (pytest&allure)
装饰器与出错重试机制 谈到稳定性,不得不说的就是“出错重试”机制了,在自动化测试中,由于环境一般都是测试环境,经常会有各种各种的抽风情况影响测试结果,这样就为测试的稳定性带来了挑战,毕竟谁也不想自己的 ...
- iOS自动化探索(四)自动化测试框架pytest - 安装和使用
自动化测试框架 - pytest pytest是Python最流行的单元测试框架之一, 帮助更便捷的编写测试脚本, 并支持多种功能复杂的测试场景, 能用来做app测试也能用作函数测试 官方文档: ht ...
随机推荐
- 蓝桥杯——字母阵列(2018JavaC组第3题)
字母阵列(18JavaC3) 标题:字母阵列 仔细寻找,会发现:在下面的8x8的方阵中,隐藏着字母序列:"LANQIAO". SLANQIAO ZOEXCCGB MOAYWKHI ...
- uwsgi+nginx的三种配置方式
第一种 vi /etc/uwsgi.ini uwsgi --reload uwsgi.pid vi /etc/nginx/conf.d/iot.conf service nginx restart 第 ...
- moviepy音视频剪辑VideoClip类fl_image方法image_func报错ValueError: assignment destination is read-only解决办法
☞ ░ 前往老猿Python博文目录 ░ moviepy音视频剪辑模块的视频剪辑基类VideoClip的fl_image方法用于进行对剪辑帧数据进行变换. 调用语法:fl_image(self, im ...
- 老猿学5G随笔:5G网元功能体NF以及NF之间的两种接口--服务化接口和参考点
一.5G功能体之间的接口类型 5G不同功能体之间提供了两种接口: 服务化接口:Service-basedinterface,这个是类似微服务化架构的服务注册和服务发现来实现的功能体对外暴露的接口,这种 ...
- PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox的按钮改变缺省文字的方法
在Qt Designer中可以预先定义标准按钮,相关支持的标准按钮请见<PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox的StandardButton ...
- PyQt(Python+Qt)学习随笔:窗口部件大小策略sizePolicy与SizeConstraint布局大小约束的关系
在<PyQt(Python+Qt)学习随笔:Qt Designer中部件的三个属性sizeHint缺省尺寸.minimumSizeHint建议最小尺寸和minimumSize最小尺寸>. ...
- jupyterlab 增加新内核的方法ipykernel
参考: https://blog.csdn.net/C_chuxin/article/details/82690830
- c#如何取出指定的中间文本
///<summary> ///取出文本中间内容 ///<summary> ///<param name="left">左边文本</par ...
- C++编程指南续(10-11)
十.类的继承与组合 对象(Object)是类(Class)的一个实例(Instance).如果将对象比作房子,那么类就是房子的设计图纸.所以面向对象设计的重点是类的设计,而不是对象的设计. 对于C++ ...
- P5327 [ZJOI2019]语言
一边写草稿一边做题吧.要看题解的往下翻,或者是旁边的导航跳一下. 草稿 因为可以开展贸易活动的条件是存在一种通用语 \(L\) 满足 \(u_i\) 到 \(v_i\) 的最短路径上都会 \(L\) ...