如何使用Pytest进行自动化测试

为什么需要自动化测试

自动化测试有很多优点,但这里有3个主要的点

  • 可重用性:不需要总是编写新的脚本,除非必要,即使是新的操作系统版本也不需要编写脚本。
  • 可靠性:人容易出错,机器不太可能。当运行不能跳过的重复步骤/测试时,速度会更快。
  • 全天运行:您可以在任何时间或远程启动测试。夜间运行正在测试你的软件,即使是在你睡着的时候。

成熟的、功能齐全的Python测试工具——pytest

目前有多种可用的测试框架和工具。这些框架的风格也各不相同,比如数据驱动、关键字驱动、混合、BDD等等。您可以选择最适合您的要求。

Python和pytest在这场竞争中占据了巨大的份额。Python及其相关工具之所以被大量使用,可能是因为与其他语言相比,没有或很少编程经验的人更能负担得起它们。

pytest框架使得编写小型测试变得很容易,但是可以扩展到支持应用程序和库的复杂功能测试。

Pytest的一些主要特性:

  • 自动发现测试模块和功能
  • 有效的CLI来更好地控制您想要运行或跳过的内容
  • 大型第三方插件生态系统
  • 固定装置-不同的类型,不同的范围
  • 与传统的单元测试框架一起工作
  • 如何使用Pytest进行自动化测试

自动和可配置的测试发现

在默认情况下,pytest期望在名称以test_开头或以test.py结尾的python模块中找到测试。在默认情况下,它期望测试函数名以test 开头。但是,可以通过在pytest的一个配置文件中添加您自己的配置来修改这个测试发现协议。

1

2

3

4

5

6

7

8

# 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

让我们看一下非常基本的测试函数。

1

2

3

4

5

6

7

8

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已经提供的功能,因此无需重新发明。

固定装置会起作用的

查看测试功能,测试钱包软件的基本操作,比如,

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

// 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去除样板

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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

整洁!不是吗。测试函数非常微妙,只做它们想做的事情。夹具钱包负责设置和拆卸、实例化和关闭钱包。它不仅有助于编写可重用的代码,还增加了数据分离的本质。如果仔细看,钱包数量是一块测试逻辑之外提供的测试数据,而不是硬编码在测试函数内部。

1

@pytest.mark.parametrize(‘wallet', [(10,)], indirect=True)

在更可控的环境中,您可以在存储库中有一个测试数据文件,例如test-data.ini,以及读取该文件的包装器,并且您的测试函数可以调用包装器的另一个接口来读取测试数据。

但是,建议将您的fixture作为conftest.py文件的一部分。这是pytest中的一个特殊文件,它允许测试发现全局fixture。

但是,有一个针对许多不同数据集执行的测试用例!

不用担心,pytest有一个很酷的特性来参数化您的fixture。让我们用一个例子来看看它。

假设您的产品公开CLI接口以在本地管理它。此外,您的产品在启动时设置了许多默认参数,您需要验证所有这些参数的默认值。

我们可以考虑为每个设置编写一个测试用例,但是使用pytest就容易得多了

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

@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安装此插件

1

pip install pytest-xdist

让我们通过一个示例来快速研究它。

我有一个自动化测试存储库CloudApp,用于使用selenium进行GUI测试。此外,它还随着新的测试用例不断增长,现在已经有了数百个测试。我想做的是并行运行它们,并减少测试执行时间。

在终端中,只需在项目根文件夹/ tests文件夹中键入pytest。这将执行所有测试。

1

pytest -s -v -n=2

 

并行运行测试的pytest-xdist

这还可以帮助您在多个浏览器上并行运行测试。

报告

Pytest内置支持创建结果文件,可由Jenkins、Bamboo或其他持续集成服务器读取,使用如下调用:

1

pytest test/file/path — junitxml=path

这可以生成很好的XML风格的输出,可以由许多CI系统解析器解释。

结论

Pytest的受欢迎程度逐年上升。此外,它还拥有广泛的社区支持,这让您可以访问很多扩展,比如pytest-django,它可以帮助您为Django web应用程序集成编写测试。记住,pytest支持运行unittest测试用例,所以如果您正在使用unittest, pytest是值得考虑的。

​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】

  • 24
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用pytest进行自动化测试非常简单。首先,您需要安装pytest库。可以使用以下命令在命令行中安装pytest: ``` pip install pytest ``` 安装完成后,您可以创建一个测试文件,文件名以`test_`开头,并以`.py`结尾。在这个文件中,您可以编写测试用例函数,这些函数以`test_`开头。例如,您可以创建一个名为`test_add.py`的文件,其中包含以下内容: ```python def test_add(): assert 2 + 2 == 4 def test_subtract(): assert 5 - 3 == 2 ``` 在命令行中,进入到`test_add.py`文件所在的路径,并运行以下命令: ``` pytest ``` pytest会自动查找当前目录以及子目录下所有以`test_*.py`或`*_test.py`命名的文件,并执行其中的测试用例。在上述示例中,pytest会执行`test_add()`和`test_subtract()`两个测试用例函数,并输出测试结果。 您还可以使用pytest的一些特性来组织和管理测试用例。例如,您可以使用`@pytest.mark.run(order=n)`装饰器为测试用例指定执行顺序。示例如下: ```python import pytest class TestOrder(object): @pytest.mark.run(order=2) def test_two(self): print("Test case two") @pytest.mark.run(order=1) def test_one(self): print("Test case one") @pytest.mark.run(order=3) def test_three(self): print("Test case three") ``` 在上述示例中,`test_one()`将首先执行,然后是`test_two()`,最后是`test_three()`。您可以使用`pytest`命令运行这个测试文件,pytest会按照指定的顺序执行测试用例。 总结起来,使用pytest进行自动化测试的步骤如下: 1. 安装pytest库 2. 创建一个以`test_`开头并以`.py`结尾的测试文件 3. 在测试文件中编写测试用例函数,函数名以`test_`开头 4. 在命令行中进入到测试文件所在的路径,并运行`pytest`命令 5. 查看测试结果 希望这个回答对您有帮助!\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* *3* [一文 pytest 自动化测试框架(一)](https://blog.csdn.net/weixin_46635091/article/details/122853843)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值