Chai 的 “assert” 断言与 “should” 断言与 “expect” 断言的区别及使用场景

阅读时长 4 分钟读完

在前端开发中,测试是至关重要的一环。而为了方便跑自动化测试,我们需要使用断言库。在 JavaScript 中,Chai 是最受欢迎和使用的断言库之一,它提供了多种断言的格式,包括 assert、should 和 expect。

本文将会对这三种格式进行详细的比较和使用场景的说明,帮助开发者能够更好地理解它们之间的差异和如何选用最适合自己的断言格式。

Chai 的三种断言格式

Chai 中的三种主要的断言格式分别是 assert、should 和 expect。它们分别提供不同的语法格式,并可以在测试代码中进行混合使用。下面分别介绍它们的特点和使用。

assert 断言

assert 是 Node.js 内置模块之一,它提供了简单但功能强大的状态检测方法。在 Chai 中,assert 断言提供了与 Node.js assert 一样的使用方法,并添加了更多的断言函数,例如 isOk、isTrue 等等。

assert 的语法格式大致为:

其中,expression 为要测试的表达式,如果为真则测试通过,否则测试不通过。message 是可选的,表示这个测试失败时显示的信息。

这里有个示例代码,我们使用 assert.equal() 来断言:

这段代码中,我们使用 assert.equal() 来比较 foo 和 'bar' 是否相等。如果 foo 等于 'bar' 则测试通过,否则测试不通过。

should 断言

should 断言是基于 Object.defineProperty() 实现的,它会把断言关键字放到对象的原型上,然后运用 Object.defineProperty() 来拦截 getter 调用,并对调用的对象进行断言。这样,我们就可以在测试期间链式调用 should 方法,并进行更优雅的断言的书写。

should 的语法格式:

在使用 should 断言时,我们需要预先将它实例化。实例化后,我们就可以为任意值或对象添加 should 属性,然后执行断言,如下所示:

这里,我们首先使用 require() 引入了 Chai 库,然后实例化了 should 断言。然后,我们定义了一个名为 foo 的字符串。最后,我们使用 should 断言链式调用了 foo.should.be.a('string') 进行断言,它的含义是应该是字符串类型。

expect 断言

expect 断言是最新的一种 Chai 断言格式,它提供了更加简洁的 API 和更好的可读性。

expect 的语法格式:

我们可以通过 require 引入并实例化一个 expect 对象。然后,我们将值传递给实例化的 expect 对象,并调用其 API 来进行测试和断言。

下面的示例代码中,我们使用 expect 断言:

这段代码中,我们首先引入并实例化了 expect,然后定义了名为 foo 的字符串。最后,我们使用 expect(foo).to.be.a('string') 断言 foo 应该是字符串类型。

应该如何选择使用哪种断言

在编写自动化测试代码时,不同的断言格式应该为不同的场景选择使用。下面是一些场景和建议,供开发者们参考:

  1. 在没有其他偏好且只使用不同类型断言的情况下,选择 expect
  2. 如果您将自动化测试代码作为公共 API,应该使用 expect 断言。因为 expect 断言具有清晰易懂的语法,并且易于传达语义。
  3. 如果您的测试场景涉及异步代码(例如使用 setTimeout、setInterval、Promise 和 AJAX 等),则应选择回调或异步方法。
  4. 如果您不需要链式语法,并且希望您的代码实现尽可能少但有力,我们建议您使用 assert。
  5. 如果您习惯使用链式语法,并希望易于阅读和使用,则应该选择 should。

无论您选择哪种于方法,选择了适合自己的方法是最重要的。在合适的情况下,您可以根据需要组合使用 expect、assert 和 should。

总结

Chai 是用 JavaScript 编写的一个断言库。它提供了多种断言的格式,包括 assert、should 和 expect。在编写自动化测试代码时,不能只关注使用哪种格式更流行或更好看,而是要选择最适合自己的断言格式。

希望通过这篇文章可以帮助读者更好的使用 Chai 并编写更好的自动化测试代码。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/651fa29e95b1f8cacd72b0db

纠错
反馈