为什么需要自动化测试
自动化测试有很多优点,但这里有三个主要要点
只要不需要,即使是新的操作系统版本,也不需要总是编写新的可重用性:脚本。 可靠性:人容易出错,没有多少机器。 执行无法跳过的重复步骤/测试会更快。 全天:可以随时或远程启动测试。 即使在你睡觉的时候,我也在晚上测试你的软件。
成熟的、功能齐全的Python测试工具——pytest
目前有一些可用的测试框架和工具。 这些框架的样式也各不相同,如数据驱动、关键字驱动、混合、nrdqt等。 选择最适合您要求的产品。
Python和pytest在这场竞争中占有很大的份额。 Python及其相关工具之所以被广泛使用,可能是因为与其他语言相比,没有编程经验的人和较少的人能够负担得起它们。
使用pytest框架可以轻松创建小规模测试,但可以扩展到支持APP和库的复杂功能测试。
Pytest的主要特性:
大型第三方插件生态系统固定装置,自动检测具有测试模块和有效功能的CLI,更好地控制其运行或跳过的内容-在各种类型、各种范围内与传统的单元测试框架配合使用(955
自动化和可配置的测试检测
缺省情况下,pytest希望在名称以test_开头或以_test.py结尾的python模块中找到测试。 缺省情况下,测试函数名称希望以test_开头。 但是,可以通过将自己的配置添加到pytest的配置文件中来更改此测试检测协议。
# #内容为py测试. ini
# # example 1: havepytestlookfor ' check '测试已安装'
# # canalsobedefinedintox.iniorsetup.cfgfile,连接部分
# # nameinsetup.cfgfilesshouldbe '工具: py测试'
我的测试
python _ files=检查_ *.py
python _类别=检查
让我们来看看python_functions=*_check非常基本的测试函数。
类属(对象) :
def one _ check (自我) :
x='this ' '
声明在x
def two _ check (自我) :
x='hello '
注意到什么了吗? 没有华丽的资产净值比或资产净值比。 只是简单明了的断言。 比较两个对象的简单操作不需要引入这些断言函数。 因为assert是python已经提供的功能,所以没有必要重新发明。
固定装置起作用
检查功能并测试钱包软件的基本操作。 例如,
//test_wallet.py
fromwalletimportwalletdeftest _默认_初始_ Amount () :
公事包=公事包(
资产公事包.平衡==0
wallet.close (缺省设置初始化) :
公事包=公事包(初始货币=100 ) )。
资产公事包.平衡==100
wallet.close (预设公事包加入案例) :
wallet=wallet (初始值=10 ) )。
wallet.add_cash(amount=90 ) )。
资产公事包.平衡==100
wallet.close (预测_ wallet _ spend _ cash ) :
公事包=公事包(初始货币=20 ) )。
wallet.spend_cash(amount=10 ) )。
资产公事包.平衡==10
wallet.close ()嗯,很有趣! 注意到了吗,很多模板文件。 另一个值得注意的是,测试还包括测试功能以外的其他事项,如将钱包实例化并关闭——Wallet .close ()
现在,让我们看一下如何使用pytest fixture删除模板
导入py测试
从测试. fixturesimportsubrequest
从公事包汇入公事包#==
================== 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是值得考虑的。
原文链接:
https://medium.com/tenable-techblog/automation-testing-with-pytest-444c8b34ead2