前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2024年了,你知道硬断言和软断言在自动化测试中的作用和区别吗?

2024年了,你知道硬断言和软断言在自动化测试中的作用和区别吗?

作者头像
一个正经的测试
发布2024-01-22 16:57:02
1630
发布2024-01-22 16:57:02
举报
今天面试一个实习生,问了这样一个问题

你知道硬断言和软断言在自动化测试中的作用吗?

一、什么是断言?

断言的主要目的是验证应用程序在插入的检查点处以及整体上是否正常工作。这是告诉测试脚本“我期望此时应用程序状态/行为的值为 X”的一种方式。“我的期望与实际结果相符吗?告诉我是真是假。

当执行断言时,它会评估一个条件(通常是实际值和期望值之间的比较)。如果条件为真,则测试继续运行。如果条件为假,则断言将抛出错误,将测试标记为失败。

举一个烤蛋糕的例子

让我们以烘焙巧克力蛋糕为例,以及如何在过程之间和结束时插入断言。

第 1 步:测量成分

行动:测量 1 杯糖。 断言:您确认糖的量是正确的。

第二步:预热烤箱

行动:食谱上说要把烤箱预热到 350°F。 断言:验证烤箱温度计已达到 350°F。在软件测试中,这就像检查条件(在本例中为烤箱温度)是否完全符合预期。

第三步:烘烤时间

行动:食谱中提到将蛋糕烘烤 30 分钟。 断言:你设置一个计时器并检查蛋糕 30 分钟。这类似于超时断言,确保过程(烘焙)不会花费比预期更长的时间。

第四步:最终检查——牙签测试

操作:将牙签插入中心以检查其是否烘烤。 断言:如果牙签拔出来是干净的,那么蛋糕就完全烤好了。这与检查最终结果的断言相同(在软件中,这可能是检查事务是否完成)。

二、软件测试中的断言类型

下面是两种类型的断言和比较表:

硬断言是指当不满足断言条件并且测试用例失败时测试执行将中止的断言。如果即使断言之一失败也希望继续执行测试,请使用软断言。

您需要将 TestNG 与 Selenium 结合使用,以使用org.testng.assert包设置断言。默认情况下,Selenium 中的断言是硬断言。要使用软断言(也称为验证),请导入org.testng.asserts.SoftAssert 包。

接下来我将通过一个接口测试来理解一下

在Python中,内建的 assert 可以被用作硬断言。例如

代码语言:javascript
复制
def test_add():
    result = add(10,5)
    assert result == 15   # 这是一个硬断言。

不幸的是,Python的内建 assert 总是会是一个硬断言。对于软断言,我们需要第三方测试库的帮助,如 pytest 的 pytest.assume()。例如:

代码语言:javascript
复制
@pytest.mark.parametrize('x, y, expected', [(10, 5, 15), (5, 5, 10), (0, 0, 0)])
def test_add(x, y, expected):
    with pytest.assume():  # 软断言块开始
        assert add(x, y) == expected

在这种情况下,如果断言失败,它将继续下一个测试用例,但在测试用例结束时将该场景标记为失败。

下面我们举一个具体的详细例子

代码语言:javascript
复制
import requests
import pytest

def test_user_api():
    response = requests.get("http://someapi.com/users/1")  # 调用API接口获取用户信息

    with pytest.assume():  # 这模块开始多个软断言
        assert response.status_code == 200  # 断言响应状态码
        assert response.json()['name'] == 'John'  # 断言响应的用户名称
        assert response.json()['email'] == 'john@example.com'   # 断言响应的用户电子邮件
        assert len(response.json()['friends']) == 5  # 断言响应中的朋友数量

在上述示例中,我们将待测试的API接口请求放在了一个测试函数test_user_api中。我们调用用户API并把响应存储在response中。然后,我们用pytest.assume()方法创建一个软断言区块,其中包含的四个断言都会执行,即使某个断言失败。这样我们就可以在一个测试执行结束时得到所有的断言结果,而不是在第一个断言失败时就结束测试。如果所有断言都通过,那么这个接口测试就通过了。如果有任何失败的断言,那么这将会提示我们哪些部分需要关注和修复。

三、那么,pytest.assume()方法可以用在哪些情况下?

pytest.assume()方法应用在需要进行多个断言且希望所有断言都可以执行的情况下。这是一种软断言的方式,使得你可以在测试失败后继续执行其他断言,而不是立即停止。它在以下情况下尤其有用:

  1. 复杂测试用例: 当你有一个包含很多断言的复杂测试用例,并且希望获取关于所有断言的反馈,而不仅仅是第一个失败的断言。这将帮助你一次性地发现所有可能的问题,而不是逐一发现和修复。
  2. 相关断言: 当你有一组相互关联的断言,也许它们都依赖于相同的条件或数据。在这种情况下,如果其中一个断言失败,该组的其他断言可能也会失败。使用pytest.assume(),你可以一次看到所有断言结果,这将帮助你更好地理解问题的范围和性质。
  3. 效率: 有时修复第一个发现的bug可能会引入其他问题。如果你使用硬断言,只有在修复第一个问题并重新运行测试后才能发现这些问题。而使用pytest.assume(),你可以看到所有的问题,一次性修复它们,减少不必要的测试运行次数。

请注意,pytest.assume()只是一种测试策略。在某些情况下,如当后续的断言依赖于前面的断言的结果,或者当发生问题时你想立即停止测试,硬断言可能会更为合适。具体使用哪种断言方式取决于你的测试需求。

在使用`pytest.assume()`时,如果出现断言失败的情况,会如何继续执行其他断言?

当使用 pytest.assume() 函数时,该函数会捕获断言错误并将其记录下来,而不会立即抛出异常。这就是pytest.assume()能够在断言失败时继续执行其他断言的原因。

当你的测试用例中所有的断言都执行完毕后,如果有一个或多个断言失败,pytest.assume() 将会抛出一个异常,该异常将包含所有失败断言的详细信息。这意味着,即使有一个或多个断言失败,你的测试用例也可以正常结束,并展示所有断言的执行结果。

下面是一个执行失败断言后的输出示例:

代码语言:javascript
复制
def test_assume():
    with pytest.assume:
       assert 1 == 1
       assert 1 == 2
       assert 2 == 2
       assert 2 == 3

# 运行结果
============================ test session starts ============================
test_assume.py F
================================= FAILURES =================================
_____________________________ test__assume _________________________________

>   Assumptions Failed: 
    assert 1 == 2 at line 27
E   FailedAssumption: 
E   Assumptions Failed: 
E   assert 1 == 2 at line 27

test_assume.py:27: FailedAssumption

在这个例子中,当第二个断言assert 1 == 2失败时,它不会立即停止执行,而是会继续执行下一个断言assert 2 == 2。当所有断言都执行完毕后,pytest.assume()将抛出一个异常,列出所有失败的断言。

现在,你理解软断言和硬断言之间的区别了吗?

如果你还有什么疑问,请从下方留言吧~

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-01-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一个正经的测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第二步:预热烤箱
  • 第三步:烘烤时间
  • 第四步:最终检查——牙签测试
  • 二、软件测试中的断言类型
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档