草庐IT

五个优秀 Python 测试框架

科技狠活与软件技术 2023-03-28 原文
在本文中,读者将找到用于测试自动化的前 5 个 Python 框架的真实比较。发现他们所有的优点和缺点。

在被评为 2018 年最佳编程语言之后,Python 的排名继续上升,目前排名第三,仅次于 Java 和 C,根据指数由 Tiobe 出版。随着这种语言的使用越来越多,基于 Python 的测试自动化框架也越来越受欢迎。显然,在为他们的项目选择最佳框架时,开发人员和测试人员会有点困惑。在选择一个时,你应该判断很多东西,框架的脚本质量,测试用例的简单性和运行模块的技术并找出它们的弱点。这是我试图帮助您比较 2019 年测试自动化的前五名 Python 框架,以及它们与其他框架相比的优缺点。因此,您可以根据需要选择理想的 Python 测试自动化框架。

Robot Framework

Robot Framework 主要用于验收测试驱动的开发以及验收测试,是顶级 Python 测试框架之一。虽然它是使用 Python 开发的,但它也可以在基于 .net 的 IronPython 和基于 Java 的 Jython 上运行。Robot 作为 Python 框架兼容所有平台——Windows、MacOS 或 Linux。

先决条件

  • 首先,只有当你安装了 Python 2.7.14 或更高版本时,你才能使用 Robot Framework (RF)。虽然也使用了 Python 3.6.4,但 RF 官方博客中提供的代码片段将确保添加了适当的注释,包括所有需要的更改。
  • 您还需要安装“pip”或 Python 包管理器。
  • 最后,必须下载一个开发框架。PyCharm Community Edition 是开发人员中流行的框架。但是,由于代码片段不依赖于 IDE,因此您可以使用之前使用过的任何 IDE。

机器人的优缺点

让我们来看看 Robot 作为测试自动化框架相对于其他 Python 框架的优势和劣势:

优点

  • 使用关键字驱动的测试方法,它通过帮助测试人员轻松创建可读的测试用例来简化自动化过程。
  • 可以轻松使用测试数据语法。
  • 它由通用工具和测试库组成,拥有一个庞大的生态系统,其中各个元素可以在单独的项目中使用。
  • 该框架具有高度可扩展性,因为它具有许多 API。
  • Robot 框架可帮助您通过 Selenium Grid 运行并行测试;但是,此功能不是内置的。

缺点

  • Robot 框架在创建自定义 HTML 报告时虽然很棘手。但是,您仍然可以使用 Robot 框架呈现 xUnit 格式的简短报告。
  • Robot框架的另一个缺陷是并行测试的不足。

Robot 是最适合您的 Python 测试框架吗?

如果您是自动化领域的初学者并且开发经验较少,那么使用 Robot 作为顶级 Python 测试框架比 Pytest 或 Pyunit 更容易使用,因为它具有丰富的内置库并且涉及使用更容易的面向测试的 DSL。但是,如果你想开发一个复杂的自动化框架,最好切换到 Pytest 或任何其他涉及 Python 代码的框架。

pytest

Pytest 用于各种软件测试,是另一个用于测试自动化的顶级 Python 测试框架。该工具开源且易于学习,可供 QA 团队、开发团队、个人实践小组和开源项目使用。由于其有用的功能,如“断言重写”,互联网上的大多数项目,包括像 Dropbox 和 Mozilla 这样的大人物,已经从 unittest (Pyunit) 切换到 Pytest。让我们深入了解一下这个 Python 框架的特别之处。

先决条件

除了 Python 的应用知识外,Pytest 不需要任何复杂的东西。您所需要的只是一个工作桌面,它具有:

  • 命令行界面
  • Python包管理器
  • 开发IDE

Pytest的优缺点

优点

  • 在 Python 测试社区中,在 Pytest 出现之前,开发人员将他们的测试包含在大类中。然而,Pytest 带来了一场革命,因为它使得以比以前更紧凑的方式编写测试套件成为可能。
  • 其他测试工具要求开发人员或测试人员使用调试器或检查日志并检测特定值的来源。Pytest 帮助您编写测试用例,使您能够将所有值存储在测试用例中,并通知您哪个值失败以及哪个值被断言。
  • 由于不需要那么多样板代码,因此测试更容易编写和理解。
  • 夹具是可以通过向测试函数添加参数来使用的函数。他们的工作是返回值。在 Pytest 中,您可以通过使用一个夹具来使它们模块化。使用多个夹具可帮助您覆盖所有参数组合,而无需重写测试用例。
  • Pytest 的开发人员发布了一些有用的插件,使框架可扩展。例如,pytest-xdist可用于在不使用不同的测试运行器的情况下执行并行测试。单元测试也可以在不复制任何代码的情况下进行参数化。
  • 为开发人员提供某些特殊例程,使测试用例编写更简单,更不容易出错。代码也变得更短且易于理解。

缺点

Pytest 使用特殊例程这一事实意味着您必须在兼容性方面做出妥协。您将能够方便地编写测试用例,但无法将这些测试用例与任何其他测试框架一起使用。

Pytest 是最适合您的 Python 测试框架吗?

好吧,您必须从学习一门成熟的语言开始,但是一旦掌握了它,您将获得所有功能,例如静态代码分析、对多个 IDE 的支持,以及最重要的是,编写有效的测试用例。对于编写功能测试用例和开发复杂的框架来说,它比unittest好,但如果你的目标是开发一个简单的框架,它的优势有点类似于Robot框架。

单元测试(PyUnit)

Unittest,即 PyUnit,是 Python 自带的用于单元测试的标准测试自动化框架。它深受 JUnit 的启发。断言方法和所有清理和设置例程由基类 TestCase 提供。TestCase 子类中的每个方法的名称都以“test”开头。这允许它们作为测试用例运行。您可以使用加载方法和 TestSuite 类来分组并加载测试。您可以一起使用它们来构建定制的测试运行器。与使用 JUnit 进行 Selenium 测试一样,unittest 也具有使用和生成 XML 报告的能力unittest-sml-reporting。

先决条件

没有这样的先决条件,因为 unittest 默认情况下与 Python 一起提供。要使用它,您需要具备 Python 框架的标准知识,如果您想安装其他模块,则需要安装 pip 以及用于开发的 IDE。

PyUnit的优点和缺点

优点

作为 Python 标准库的一部分,使用 Unittest 有几个优点:

  • 开发人员不需要安装任何额外的模块,因为它是随附的。
  • Unittest是xUnit的衍生产品,其工作原理与其他xUnit框架类似。没有深厚 Python 背景的人通常会觉得工作起来很舒服。
  • 您可以以更简单的方式运行单个测试用例。您需要做的就是在终端上指定名称。输出也很简洁,使框架在执行测试用例时具有灵活性。
  • 测试报告在几毫秒内生成。

缺点

  • 通常,snake_case用于命名 Python 代码。但是,由于这个框架从 Junit 中得到了很多启发,所以传统的camelCase命名方法仍然存在。这可能非常令人困惑。
  • 测试代码的意图有时会变得不清楚,因为它太支持抽象了。
  • 需要大量的样板代码。

PyUnit 是最适合您的 Python 测试框架吗?

根据我个人的意见和其他 Python 开发人员的意见,Pytest 引入了某些惯用语,允许测试人员以非常紧凑的方式编写更好的自动化代码。尽管 unittest 作为默认的测试自动化框架出现,但其工作原理和命名约定与标准 Python 代码略有不同,并且需要过多的样板代码,使其成为不太受欢迎的 Python 测试自动化框架。

Behave

我们都知道行为驱动开发,这是一种最新的基于敏捷的软件开发方法,它鼓励开发人员、业务参与者和质量分析师相互协作。Behave 是另一个顶级 Python 测试框架,它允许团队执行 BDD 测试而不会出现任何复杂情况。该框架的性质与用于自动化测试的 SpecFlow 和 Cucumber 非常相似。测试用例是用一种简单易读的语言编写的,然后在执行过程中固定在代码中。行为由行为规范设计,然后这些步骤被其他测试场景重用。

先决条件

任何具有 Python 基础知识的人都应该能够使用 Behave。让我们看一下先决条件:

  • 在安装 Behave 之前,您必须安装 Python 2.7.14 以上的任何版本。
  • 使用 Behave 需要 Python 包管理器或 pip。
  • 开发环境是您需要的最后也是最重要的东西。您可以使用大多数开发人员首选的 Pycharm 或您选择的任何其他 IDE。

Behave的优点和缺点

与驱动测试框架中的所有其他行为一样,对 Behave 优势的看法因人而异。让我们来看看使用 Behave 的常见优缺点:

优点

  • 系统行为由半正式语言和领域词汇表达,使行为在组织中保持一致。
  • 在具有相似功能的不同模块上工作的开发团队得到适当的协调。
  • 构建块随时准备执行各种测试用例。
  • 推理和思考体现在细节上,从而产生更好的产品规格。
  • 由于规范的相似格式,利益相关者或经理对 QA 和开发人员的输出有更好的清晰度。

缺点

唯一的缺点是它只适用于黑盒测试。

Behave 是最适合您的 Python 测试框架吗?

好吧,正如我们所说,Behave(Python 框架)仅适用于黑盒测试。Web 测试是一个很好的例子,因为用例可以用通俗易懂的语言来描述。但是,对于集成测试或单元测试,Behave 不是一个好的选择,因为冗长只会导致复杂测试场景的复杂化。开发人员和测试人员都推荐pytest-bdd. 它是 Behave 的替代品,因为它使用 Pytest 中的所有优点并实现它以测试行为驱动的场景。

Lettuce

Lettuce 是另一个基于 Cucumber 和 Python 的简单易用的行为驱动自动化工具。Lettuce 的主要目标是专注于行为驱动开发的常见任务,使过程更简单和有趣。

先决条件

您至少需要安装 Python 2.7.14 和 IDE。您可以使用 Pycharm 或您选择的任何其他 IDE。此外,为了运行测试,您将需要安装 Python 包管理器。

Lettuce的优缺点

优点

  • 好吧,就像任何其他 BDD 测试框架一样,Lettuce 使开发人员能够创建多个场景并以简单的自然语言描述功能。
  • 由于规范的格式相似,因此开发和 QA 团队得到了适当的协调。
  • 对于黑盒测试,Lettuce 对于运行行为驱动的测试用例非常有用。

缺点

使用 Lettuce 作为 Python 框架只有一个缺点。为了成功执行行为驱动测试,开发团队、QA 和利益相关者之间的沟通是必要的。缺席或沟通不畅会使流程变得模棱两可,任何团队都可以提出问题。

Lettuce 是最适合您的 Python 测试框架吗?

根据开发人员和自动化测试人员的说法,Cucumber 在执行 BDD 测试时更有用。但是,如果我们谈论 Python 开发人员和 QA,没有比pytest-bdd. Pytest 的所有强大功能,如紧凑性和易于理解的代码,都在这个框架中实现,并结合了行为驱动测试的冗长性。

总结!

在上面的文章中,我们根据不同的测试程序讨论了 2019 年测试自动化的前五名 Python 框架。Pytest、Robot 框架和 unittest 用于功能和单元测试,而 Lettuce 和 Behave 仅适用于行为驱动测试。

从所述的功能,我们可以得出结论,对于功能测试,Pytest 是最好的。但是,如果您不熟悉基于 Python 的自动化测试,那么 Robot 框架是一个很好的入门工具。虽然功能有限,但能让你在赛道上轻松领先。对于基于 Python 的 BDD 测试,Lettuce 和 Behave 同样出色,但如果您已经有 Pytest 的使用经验,最好使用pytest-bdd.

我希望我的文章能帮助您从顶级 Python 测试框架中做出正确的选择,以满足您的 Python Web 自动化需求。测试愉快!

有关五个优秀 Python 测试框架的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  3. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  4. ruby - Ruby 的 Hash 在比较键时使用哪种相等性测试? - 2

    我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。

  5. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  6. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

  7. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  8. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  9. ruby-on-rails - 如何使辅助方法在 Rails 集成测试中可用? - 2

    我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel

  10. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

随机推荐