JavaScript 中的「断言」该咋用
【JavaScript 中的「断言」该咋用】 又重新了解了下,JavaScript 中好像有断言工具函数,叫 console.assert(参数1,参数2)。
参数1:是断言条件,即应该发生的情况;
参数2:是不满足断言条件时,打印出来的提示信息。
当时提问忘了放出问题描述中我练习的断言小例子,很简单的,此处补充下:console.assert(a === 3, "a 的值不是3!");其实感觉这个函数还是挺有用的,就算不是为了做单元测试,自己平时在写代码时为了保证程序正确性,也可以使用一下。
毕竟,像1楼说的一样,调试时我们总不可能把所有的错误都打印出来吧 \u0026gt;.\u0026gt;
■网友
谢邀,先说明下我对断言的理解也可能有偏差,所回答的仅供参考,不要当做权威回答。
首先,断言在js中是没有的,不过nodejs里有。可以移步文档看一下:
Node.js v8.1.3 Documentation在c++啊Java等等语言中,都有断言的使用。第一次接触断言是参考前东家的测试框架的时候,看到大量的Java断言在selenium中出现。我们对断言使用,往往是为了去嗅探边界条件和非正常条件,从而去检查不应该发生的情况。当assert参数为假时,程序会终止,并抛出错误信息。
比如你举出的例子,作者是这样写的:function assert (condition, msg) { if (!condition) throw new Error(` ${msg}`)}这里吐下槽,web版编辑器插入代码段后,就没找到怎么在后面输入非代码文字了,只能先输入一行,然后往中间插代码。
这里可以看到,当走入断言时,如果condition返回为false时,就会抛出具体的错误。assert(Vue, `must call Vue.use(Vuex) before creating a store instance.`)而具体使用的例子,就是这样。
而assert的使用也有稍微复杂的方式,比如assert.deepStrictEqual,assert.equal之类的,做多个变量判断等等。
断言的好处是可以方便我们调试错误,我们不可能去console每一处错误,js也做不到抛出足够清晰的错误。当我们需要对一些方法进行批量测试的时候,断言就是一个不错的方式。这就是你之前所说的,单元测试相关的问题。同理,自动化测试也可以用断言,去判断我们需要检查的接口和方法是否正确,来进行测试定位。
但同样,断言是只能用于调试阶段(上线不能抛出错误吧),而且也是以牺牲了很大的效率来进行的。程序的任何功能都不能依赖于断言(就是正常情况下,断言全部删除对程序完全没有影响),而调试过程中,断言会影响程序的连贯性,这些大概是你所说的少用为好的原因。一般不是单测或是书写测试相关的代码,前端是没人会用断言的吧…
以c++为例,c++的assert是宏不是函数,而在编译过程中有开关关闭(NDEBUG)。如果不愿意写代码去做编译过滤,那么在刚才例子声明的assert里,最好依赖一个配置变量,通过配置改变来决定,assert是否执行。
■网友
测试用的,推荐阮一峰的 测试框架 Mocha 实例教程 - 阮一峰的网络日志
这里面讲了测试框架的使用以及断言的介绍。
以我个人的情况来看,因为js是门弱类型的动态语言,因此运行时会报错 xxxxx is undefined的。特别是做工程化的前端项目,如vue react angular这些,报错是由他们自己处理的,因此查错误特别不方便。
但即使这样,我在开发中,以及我触及到的圈子中都没有使用断言的,至少在前端项目上。公司的测试也是半吊子,不会用这些科学的测试框架, 就是在做好的网页上点点点。甚至开发过程中,我们连chrome的调试都很少用,更喜欢console。基本看console就知道问题出在哪里了。所以对于前端来说,断言这些测试框架不怎么重要。
推荐阅读
- 鄂温克冬季马赛-30℃极寒开赛:寒冬中的火热派对
- 大雪@大雪腌肉 适当进补 今日大雪
- |电商事业中的“闪光少年”
- hadoop中的mapreduce链接(mapreduce chaining)怎样避免中间文件的产生
- 经观汽车|日系车企中的“异类”?东风日产将导入e-POWER技术大干增程式混动 | 经观汽车
- 中年|这些东西,比你想象中的还要大得多!
- 请问杨毅微博中的这两人是谁
- 某些公司招聘要求中的精通mysql是啥程度
- 宝宝|婴幼儿游泳——宝宝人生中的第一健身运动
- 汽车|你眼中的未来出行世界——YiMagazine x 道达尔
