• 14
  • 16
分享

为什么需要自动化测试

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

  1. 可重用性:不需要总是编写新的脚本,除非必要,即使是新的操作系统版本也不需要编写脚本。

  2. 可靠性:人容易出错,机器不太可能。当运行不能跳过的重复步骤/测试时,速度会更快。

  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是值得考虑的。

最后:

凡事要趁早,特别是技术行业,一定要提升技术功底,丰富自动化项目实战经验,这对于你未来几年职业规划,以及测试技术掌握的深度非常有帮助。


作者:测试猿David

原文链接:https://blog.csdn.net/weixin_50271247/article/details/110498897


  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 测试用例和缺陷报告模板对于测试工程师,必备技能之一便是测试用例的编写和软件缺陷报告的编写啦~下面提供一些模板还有项目实战样例供大家参考参考,1.通过Excel表格编写测试用例2. 缺陷报告模板下面来个实战案例3.在线课程作业管理系统项目测试用例(部分)4.缺陷报告实例这是我写的缺陷报告模板,可以参考下,可以把bug截图放进缺陷报告里,更直观的知道bug原因所在。(由于一些内容不是很方便共享,我做了马赛克处理,敬请原谅。仅供各位参考一下缺陷报告的模板可以采用这样的形式)测试用例是面试中经常被问及的,我实习面试面了四家,都被问到了!可见其重要性。作者:lucky多多原文链接:https://blo...
            14 14 3868
            分享
          • 前言最近跟一位朋友聊天,福报场-阿里是大部分程序员的梦想。这位老哥梦想进入阿里很久了,连续两年面试阿里不同bu,有几次是技术面挂,最冤的一次是技术6面了,连P10大老板都面了,但是挂在了hrg。我以仰望的视角望着老哥,表示能够通过6轮技术面试已经很牛了,但是最后跪在了hrg实在有点可惜。正文hrg究竟是一种什么存在?。“阿里HRG”:HR generalist,可翻译为HR多面手。HRG的面试总则是什么?提问问题比较刁钻,不像一般的公司,只要通过了技术或业务面试,hr小姐姐,只是与你简单聊聊,真的是简单聊聊,比如你的家庭、学业情况,有什么兴趣爱好,期望薪资是什么,对未来的工作有什么期望,一切都...
            0 1 2447
            分享
          •   背景介绍  作为一个测试同学,提交bug是个绕不过去的坎(请不要杠哈,我真不太相信有测试同学从来未提交过bug)。  但是每次提交bug,少则几项多则几十项,填得有点头大有没有?即使有模板,根据模板再修改,手动填的时候也经常会漏掉一些项有没有?  所以为了我们这些懒人的福利,自动化提交bug就应运而生了。  测试需求分析  此自动化需求主要涉及到python/pytest,且需要jira API文档(下文有jira接口文档链接)。  测试流程  自动化脚本实现  bug模板及提交jira手工步骤  提完bug的bug模板参考下图:  创建bug时,参考下图,可以看见目前统一模板有如下10个...
            14 14 2076
            分享
          •   人工智能时代软件的作用越来越大、功能越来越丰富,毫不夸张的讲软件已经悄无声息的融进了生活中的各个角落!对于融入生活的一切事物,人都是格外关心的,软件也不例外。融入生活的一切都是要有品质的,是什么保证了软件的品质呢?怎么保证软件的品质呢?谁来保证软件的品质呢?一切的答案都直接指向一个在当代越来越重要的岗位:软件产品测试。  专业的软件测试人才在当下供需之间存在巨大缺口,软件测试人员的薪水也比较可观,越强的工作能力薪酬越高。怎样成为一个软件测试师呢?如果已经从事软件测试工作,怎样靠本事提高自己的收入呢?有一位软件产品测试行业的有心人贡献出一幅满载知识、方法和经验的思维导图,希望这份贡献能帮你在...
            0 0 1079
            分享
          •   2023 年底,懂车帝“冬测”争议事件在全网引发热议,包括华为、长城汽车、吉利均对测试标准表示质疑。余承东还称“某些媒体的冬季测试非常具有随意性、创造性”,并称测试“不专业”。  时隔半年,懂车帝 App 官方微博今日宣布,经过一个多月筹备,2024 懂车帝夏测研讨会 6 月 17 日在北京顺利召开。“本次夏测所有车辆全部为懂车帝自购,测试项目将通过直播方式对外展示,接受公众监督。”  懂车帝还称:“来自 20 个车企品牌的 40 多位研发、工程、测试等团队负责人,以及来自中国电动汽车百人会、全国乘用车市场信息联合会、北京航空航天大学等机构的专家,就夏测科目、标准、设备、流程等全程细节进行...
            0 0 424
            分享
      • 51testing软件测试圈微信