断言的“神秘身份”

本文探讨了"断言"这一编程术语在IT研发中的作用,特别是在自动化测试和软件质量保证方面。断言用于验证代码执行结果或状态,确保程序行为符合预期。Java中的assert关键字和自动化测试工具如Selenium提供的断言方法,如assertTrue、assertFalse和assertEqual等,是确保软件达到期望结果的关键。断言与确认的区别在于,断言在失败时会停止程序执行,而验证失败则允许测试继续进行。

在IT研发相关的书籍和文章中,经常会出现“断言”这个词语,有些人读起来会感觉“特别别扭”。例如,在《持续交付:发布可靠软件的系统方法》(DevOps Maste认证课程的指定教材)一书中,就多次使用到“断言”这个词语。下面摘录该书部分段落的描述,请试着读读看:

  • 我们首次尝试自动化测试是在很多年以前。毫无疑问,那时候都是最基本的冒烟测试,简单地断言应用程序可以运行汇编。在当时,这是构建过程中我们引以为豪的非常大的一个进步。(第3章 持续集成,Page52)。
  • 提交阶段是从技术角度上断言整个系统是可以工作的。这个阶段会进行编译,运行一套自动化测试(主要是单元级别的测试),并进行代码分析。(第5章 部署流水线解析,Page88)。
  • 验收测试阶段的目标是断言应用程序交付了客户期望的价值,并满足了验收条件。(第5章 部署流水线解析,Page100)。
  • 这些测试不必非常详尽,它们只需要捕获常见错误或昂贵的潜在错误,应该只是一些非常简单的“冒烟测试”,断言某些关键资源是否存在。……断言消息代理中的已注册的消息集合是正确的。(第6章 部署脚本化,Page131)。
  • 关键是,还可以更进一步,在一些简单的断言中,你能指定测试中期望该模拟类作出什么行为。(第7章 提交阶段,Page147)。
  • 单元测试的目标就是要证明:应用程序的某个单一部分的确是按开发人员的思路运行的,但这并不能断言它也就是用户想要的功能。(第8章 自动化验收测试,Page153)。
  • 创建一些自动化测试来断言所期望的容量级别。当这些测试失败时,用它们作为向导来修复这些问题。……相反,如果测试断言应用程序每秒必须处理100个事务,而实际上它可以处理200个,那么测试不会自己告诉你吞吐量还可以增加一倍。(第9章 非功能需求的测试,Page188、Page190)。
  • 我们通过测试来断言我们所开发的应用程序的行为符合我们期望的结果。……我们运行验收测试来断言应用程序交付了用户所期望的价值。我们执行容量测试来断言应用程序满足我们的容量需求。(第12章 数据管理,Page274)。

感觉如何?你是否能轻易的理解上述文字所表达的意思?如果不能,那你是否有一种别扭感?

如果把上面的“断言”换成“确认”,请再读一遍试试看,是不是“感觉轻松多了”?!

为什么很多书籍和文章中要使用“断言”,而不使用“确认”这个词呢?如果你对此感到新奇,请继续阅读下文。

其实,“断言”是一个“舶来词”,对应的英文是Assertion。它是一个编程术语,主要使用在代码开发和测试中,用于对软件代码的执行结果或状态进行判断。如果执行结果或状态不是所预期的,断言就提出警告或退出,即断言是软件程序员用来做判断和确认的一种代码。

Java中使用assert作为断言的一个关键字(Assertion是jdk1.4后加入的新功能)。断言在Java程序中表示为布尔表达式,程序员如果认为在程序中的某个特定点该表达式值为真,可以使用断言来进行验证。因此,在软件测试时可以启用断言,检查软件是否存在问题,以验证或确认软件是否达到了期望的结果。当软件正式发布时,可以取消断言部分的代码。程序投入运行后,最终用户在遇到问题时,系统开发者也可以重新启用断言,进行问题根源的排查。

软件程序员通过在开发和测试中使用断言,可以创建更稳定、品质更好,且不易于出错的代码。

断言的使用,通常有两种语法形式:

  • 语法形式1:

assert expression;//expression是一个布尔表达式,表达式的值如果为True,就继续正常运行,值如果为False,则程序退出执行。

  • 语法形式2:

assert expression1 : expression2; //expression1是一个布尔表达式,expression2是一个基本类型或者Object类型,如果expression1的值为True,则程序忽略expression2继续运行;如果expression1的值为False,则运行expression2,然后退出程序。

在执行软件的自动化测试时,程序是怎么来判断测试是否通过呢?与人工测试类似,自动化测试程序的判断办法就是用软件运行的实际结果和预期结果进行自动比较,如果一致就通过,否则测试就是失败的。在软件程序中,这种比较的方法就是断言。

在很多自动测试工具(如unittest框架、Selenium)中,都提供了一系列的断言方法,而且,通常它们是成对的。例如:

  • assertTrue(expr, msg=None);//验证expr的值是否是True。如果为True,则继续执行;如果为False,则执行失败

asserTrue返回的是boolean类型的值,它主要对返回的测试结果是boolean类型的校验。

  • assertFalse(expr,msg=None);//验证expr的值是否为False。如果为False,则继续执行;如果为True,则执行失败

assertFalse和assertTrue一致,都是对返回的boolean类型做校验,唯一不同的是assertFalse返回的结果是False。

  • assertEqual(arg1, arg2, msg=None);//验证arg1=arg2。如果不等,则执行失败
  • assertNotEqual(arg1, arg2, msg=None);//验证arg1 != arg2。如果相等,则执行失败
  • assertIs(arg1, arg2, msg=None);//验证arg1、arg2是否是同一个对象。如果不是,则执行失败
  • assertIsNot(arg1, arg2, msg=None);//验证arg1、arg2不是同一个对象。如果是,则执行失败
  • ……

使用举例:现在需要测试一下百度的搜索功能。

首先,需要确认百度的搜索框的状态是可编辑的,即在搜索框中可以输入搜索的关键字。

怎样让软件自动检查百度的搜索框是可编辑的呢?

可以使用自动化测试工具Selenium,在自动化测试脚本中添加一行命令:

  • assertEditable on id=kw

如下图

assertEditable是一个断言命令,用于判断指定的目标对象的状态是否为可编辑,如果是,则返回值为True,并继续执行下一行命令,如果不是,则返回值为False,并停止执行命令。

id=kw,指定目标对象是百度页面上的搜索输入框。

当自动化测试脚本执行到这行命令时,就会自动检查百度页面上的搜索输入框是否为可编辑(可输入)状态,如果是可编辑的状态,则继续执行下一行命令,如果不可编辑,则结束执行。

也可以使用另一个与assertEditable成对的断言命令assertNotEditable来进行验证,如下图:

在实际工作中,有时候希望程序执行遇到问题时,仍然能继续执行,而不是结束执行。Selenium提供了另外一种断言命令:Verify。上述场景,使用Verify断言后的执行效果如下图:

那么,什么时候应该使用Assert,什么时候应该使用Verify?

Assertion是指检查、断言,主要用来验证某个结果或状态是否为真或假。Verification是指验证,主要用来确认是否一致。测试时,Assertion是必须的,只有Assertion命令才能验证程序功能是否正确。如果程序打开的页面不是期望的页面,那就没必要再检查页面上的其它信息是否正确。因此,通常先用Assert进行检查测试,确保程序运行在正确的页面上,然后再使用Verify验证页面上的元素,如对象、窗体数据、页签等。

在自动化测试工具Selenium中,Assert和Verify都被视为Assertion(断言)命令。在使用时,根据场景要求,选择使用。当Assert失败时,测试将终止,退出测试;当Verify失败时,测试会继续运行,并在日志中记录失败。

嗯,阅读至此,你能理解“断言”了吗?

下面,再看看Assert和Verify的英文解释吧,以加深理解。

  • Assert,英 [əˈsɜːt],美 [əˈsɜːrt]

v. 明确肯定; 断言; 坚持自己的主张; 表现坚定; 维护自己的权利(或权威)

[例句]Mr. Helm plans to assert that the bill violates the First Amendment

翻译:赫尔姆先生打算声明该法案违反了宪法第一修正案。

  • Verify ,英 [ˈverɪfaɪ]     美 [ˈverɪfaɪ]
  1. 核实; 查对; 核准; 证明; 证实;

[例句] I verified the source from which I had that information

翻译:我核实了我所获消息的来源。

再回到文章开篇的那个问题:为什么很多书籍和文章中要使用“断言”而不使用“确认”?我以为,这仅仅是一个翻译的问题,“断言”是技术用语,而“确认”则是业务语言。

使用“断言”的这些书籍和文章,基本上都是IT技术类的,翻译者大多也都是IT技术人员,将Assert或Assertion翻译为“断言”,从技术上更加的贴切,对于熟悉软件开发或软件测试代码的技术人员,断言=Assert,理解起来更加的直观。而“确认”一词,在日常使用中则具有更多的业务含义。在译文中,如果使用“确认”,则可能会让一些不经常接触代码的人员阅读起来减少一些“别扭感”,更加的通俗易懂。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值