专栏首页用户7466307的专栏使用Pytest创建一个Python测试自动化项目

使用Pytest创建一个Python测试自动化项目

为什么选择Python?

Python是当前最流行的编程语言之一。它为Web后端,数据科学笔记本,sysadmin脚本等提供支持。它的语法简洁,易读且优雅–非常适合初学者和专家。您可以想象的一切都只是一个导入。自然地,Python还是测试自动化的最好的语言。它的简洁性使测试人员可以将更多的精力放在测试上,而不必在代码上。未完成大量编程工作的测试人员往往比其他语言(如Java或C#)学习Python的速度更快。Python非常适合启动测试!

什么是pytest?

任何功能测试自动化项目的核心都是“核心”测试框架。该框架处理测试用例结构,测试执行以及通过/失败结果报告。这是可以添加额外的程序包和代码(例如Selenium WebDriver)的基础。

pytest是Python最好的测试框架之一。它简单,可扩展且具有Python风格。测试用例是作为函数而不是类编写的。测试断言失败将与实际值一起报告。插件可以添加代码覆盖率,漂亮的报告和并行执行。pytest也可以与Django和Flask等其他框架集成。根据2018年Python开发人员调查,它也是最受欢迎的Python测试框架。

入门

让我们创建我们的Python测试项目!如果您尚未这样做,请下载并在您的计算机上安装Python 3。然后,为项目创建一个新目录:

$ mkdir python-webui-testing
$ cd python-webui-testing

每当我创建一个新的Python项目时,都会为其依赖项创建一个虚拟环境。这样,同一台计算机上的项目就不会有相互冲突的软件包版本。我使用pipenv 是因为它简化了工作流程。要全局安装pipenv,请运行:

$ pip install pipenv

然后,为新项目安装pytest:

$ pipenv install pytest --dev

Pipenv将向您的项目添加两个新文件: Pipfile和 。 Pipfile指定了项目的要求,而 Pipfile.lock “锁定”了项目将使用的显式版本。该命令中的“ –dev”选项表示pytest软件包将仅用于开发,而不用于部署。Pipfile.lock

第一次测试

按照惯例,大多数项目会将所有测试放在一个 目录下。让我们遵循以下约定:tests/

$ mkdir tests
$ cd tests

创建一个 为我们的第一个测试命名的Python模块,并添加以下代码:test_math.py

def test_addition():
  assert 1 + 1 == 2

使用pytest编写的测试通常不需要太多代码。这两行是功能齐全的测试用例!测试用例是作为函数而不是类编写的。像这样的基本测试不需要导入。使用Python的本机 assert 语句代替自定义断言调用。

运行测试

让我们运行我们的新测试。将目录更改回项目根目录,并调用pytest模块:

$ cd ..
$ pipenv run python -m pytest
============================= test session starts ==============================
platform darwin -- Python 3.7.3, pytest-4.5.0, py-1.8.0, pluggy-0.12.0
rootdir: /Users/andylpk247/Programming/automation-panda/python-webui-testing
collected 1 item                                                               
tests/test_math.py .                                                    [100%]
=========================== 1 passed in 0.02 seconds ===========================

我们的第一个测试通过了!

pytest是如何发现我们的测试的?按名称:pytest将搜索名为 的模块中命名的 测试函数 。有趣的是,pytest不需要任何测试目录中的文件。test_*test_*.py__init__.py

测试失败

如果测试失败,会发生什么?让我们添加另一个带有错误的测试来找出:

def test_subtraction():
  diff = 1 - 1
  assert diff == 0

让我们重新运行这些测试:

$ pipenv run python -m pytest
============================= test session starts ==============================
platform darwin -- Python 3.7.3, pytest-4.5.0, py-1.8.0, pluggy-0.12.0
rootdir: /Users/andylpk247/Programming/automation-panda/python-webui-testing
collected 2 items                                                              
tests/test_math.py ..                                                   [100%]
=========================== 2 passed in 0.02 seconds ===========================

我们回到了正轨。

参数化测试

如果我们要使用多个输入组合来运行相同的测试过程,该怎么办?pytest有一个装饰器!让我们编写一个新的参数化输入乘法测试:

import pytest
@pytest.mark.parametrize(
  "a,b,expected",
  [(0, 5, 0), (1, 5, 5), (2, 5, 10), (-3, 5, -15), (-4, -5, 20)])
def test_multiplication(a, b, expected):
  assert a * b == expected

这次,pytest 必须导入模块。在 装饰将取代的输入元组的测试功能参数,运行每一次输入元组中的测试功能。再次运行测试将显示更多的通过点:@pytest.mark.parametrize

$ pipenv run python -m pytest
============================= test session starts ==============================
platform darwin -- Python 3.7.3, pytest-4.5.0, py-1.8.0, pluggy-0.12.0
rootdir: /Users/andylpk247/Programming/automation-panda/python-webui-testing
collected 7 items                                                              
tests/test_math.py .......                                              [100%]
=========================== 7 passed in 0.03 seconds ===========================

参数是进行数据驱动测试的好方法。

验证异常

pytest将未处理的异常视为测试失败。实际上,该 assert 语句仅引发异常以注册失败。如果我们要验证是否正确引发了异常该怎么办?使用 与期望的异常类型,如下所示:pytest.raises

def test_divide_by_zero():
  with pytest.raises(ZeroDivisionError):
    1 / 0

重新运行测试以确保一切正常:

$ pipenv run python -m pytest
============================= test session starts ==============================
platform darwin -- Python 3.7.3, pytest-4.5.0, py-1.8.0, pluggy-0.12.0
rootdir: /Users/andylpk247/Programming/automation-panda/python-webui-testing
collected 8 items                                                              
tests/test_math.py ........                                             [100%]
=========================== 8 passed in 0.04 seconds ===========================

本文分享自微信公众号 - 软件测试test(gh_d29759b02f67),作者:Coldrain

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python中的错误和异常

    错误是程序中的问题,由于这些问题而导致程序停止执行。另一方面,当某些内部事件发生时,会引发异常,从而改变程序的正常流程。

    用户7466307
  • 功能测试与非功能测试

    它测试了被测软件的行为。根据客户的需求,称为软件规范或需求规范的文档将用作测试应用程序的指南。

    用户7466307
  • 什么是网络测试

    Web测试是用于验证网站应用程序是否可以满足特定功能,安全性,可用性,可访问性,视觉和性能标准的过程。在将代码移交给生产之前,Web测试对于捕获关键错误的应用程...

    用户7466307
  • pytest文档12-skip跳过用例

    pytest.mark.skip可以标记无法在某些平台上运行的测试功能,或者您希望失败的测试功能

    上海-悠悠
  • 安全测试工具(连载3)

    RationalAppScan(简称 AppScan)是一个产品家族,它包括众多的应用安全扫描产品,从开发阶段的源代码扫描的AppScan sou...

    小老鼠
  • go test 测试用例那些事

        go test命令,相信大家都不陌生,常见的情况会使用这个命令做单测试、基准测试和http测试。go test还是有很多flag 可以帮助我们做更多的分...

    lpxxn
  • 【实践】Golang的单元测试入门go test

    go test命令,相信大家都不陌生,常见的情况会使用这个命令做单测试、基准测试和http测试。go test还是有很多flag 可以帮助我们做更多的分析,比如...

    辉哥
  • 【我问 Crossin】英语不好能不能学编程?

    “我问 Crossin” 栏目会整理一些读者经常会问到的问题,统一作答。有比较具体的编程细节,也会有一些方向的建议,以及学习经验、编程小技巧的分享。 大家有想问...

    Crossin先生
  • 什么是Federated Learning(联邦学习)?

    federated learning是一种训练数据去中心化的机器学习解决方案,最早于2016年由谷歌公司提出,目的在于通过对保存在大量终端的分布式数据开展训练学...

    enenbobu
  • 中投全球:高效管理财富,让财富实现升级

    通过努力奋斗,拥有了财富,一定要学会管理,通过管理财富才能拥有更多的财富,但很多人只忙于创造财富,却不知道如何管理财富,为解决财富管理的难题,中投全球诞生了,且...

    红狐财经

扫码关注云+社区

领取腾讯云代金券