你知道硬断言和软断言在自动化测试中的作用吗?
一、什么是断言?
断言的主要目的是验证应用程序在插入的检查点处以及整体上是否正常工作。这是告诉测试脚本“我期望此时应用程序状态/行为的值为 X”的一种方式。“我的期望与实际结果相符吗?告诉我是真是假。
当执行断言时,它会评估一个条件(通常是实际值和期望值之间的比较)。如果条件为真,则测试继续运行。如果条件为假,则断言将抛出错误,将测试标记为失败。
举一个烤蛋糕的例子
让我们以烘焙巧克力蛋糕为例,以及如何在过程之间和结束时插入断言。
第 1 步:测量成分
行动:测量 1 杯糖。 断言:您确认糖的量是正确的。
行动:食谱上说要把烤箱预热到 350°F。 断言:验证烤箱温度计已达到 350°F。在软件测试中,这就像检查条件(在本例中为烤箱温度)是否完全符合预期。
行动:食谱中提到将蛋糕烘烤 30 分钟。 断言:你设置一个计时器并检查蛋糕 30 分钟。这类似于超时断言,确保过程(烘焙)不会花费比预期更长的时间。
操作:将牙签插入中心以检查其是否烘烤。 断言:如果牙签拔出来是干净的,那么蛋糕就完全烤好了。这与检查最终结果的断言相同(在软件中,这可能是检查事务是否完成)。
下面是两种类型的断言和比较表:
硬断言是指当不满足断言条件并且测试用例失败时测试执行将中止的断言。如果即使断言之一失败也希望继续执行测试,请使用软断言。
您需要将 TestNG 与 Selenium 结合使用,以使用org.testng.assert包设置断言。默认情况下,Selenium 中的断言是硬断言。要使用软断言(也称为验证),请导入org.testng.asserts.SoftAssert 包。
接下来我将通过一个接口测试来理解一下
在Python中,内建的 assert 可以被用作硬断言。例如
def test_add():
result = add(10,5)
assert result == 15 # 这是一个硬断言。
不幸的是,Python的内建 assert 总是会是一个硬断言。对于软断言,我们需要第三方测试库的帮助,如 pytest 的 pytest.assume()。例如:
@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
在这种情况下,如果断言失败,它将继续下一个测试用例,但在测试用例结束时将该场景标记为失败。
下面我们举一个具体的详细例子
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()方法应用在需要进行多个断言且希望所有断言都可以执行的情况下。这是一种软断言的方式,使得你可以在测试失败后继续执行其他断言,而不是立即停止。它在以下情况下尤其有用:
请注意,pytest.assume()只是一种测试策略。在某些情况下,如当后续的断言依赖于前面的断言的结果,或者当发生问题时你想立即停止测试,硬断言可能会更为合适。具体使用哪种断言方式取决于你的测试需求。
在使用`pytest.assume()`时,如果出现断言失败的情况,会如何继续执行其他断言?
当使用 pytest.assume() 函数时,该函数会捕获断言错误并将其记录下来,而不会立即抛出异常。这就是pytest.assume()能够在断言失败时继续执行其他断言的原因。
当你的测试用例中所有的断言都执行完毕后,如果有一个或多个断言失败,pytest.assume() 将会抛出一个异常,该异常将包含所有失败断言的详细信息。这意味着,即使有一个或多个断言失败,你的测试用例也可以正常结束,并展示所有断言的执行结果。
下面是一个执行失败断言后的输出示例:
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()将抛出一个异常,列出所有失败的断言。
现在,你理解软断言和硬断言之间的区别了吗?
如果你还有什么疑问,请从下方留言吧~