在前端开发中,测试是非常重要的一环。而在 JavaScript 中,测试框架是必不可少的,而 Chai 是其中一款非常流行的测试框架。在 Chai 中,assert 和 expect 是两个最常使用的测试工具,本文将对它们的差异、优缺点进行分析。
assert
assert 是在 Node.js 中提供的一个基础的测试工具,而在 Chai 中也有相应的实现。它主要通过一些预定义的方法来断言一个值是否符合期望,例如:
assert.equal(1 + 1, 2); // 通过 assert.equal(1 + 1, 3); // 失败,会抛出错误
assert 的语法十分简洁明了,一行代码就可以完成大部分的测试需求,因此被广泛使用。但是,assert 也有一些明显的缺点:
错误信息不友好
当使用 assert 的某个方法进行断言时,如果断言失败,它只会抛出一个错误,而这个错误信息通常只包含一些堆栈信息和一些位置指示符,对用户来说没有多少帮助。使用者需要进一步去调查错误信息,排除错误原因。
仅支持一种断言形式
assert 只支持类似 equal
这样的形式的断言方式,因此它不支持像 expect 中的 "to.be." 形式的连贯断言,这些连贯形式的语句对于更好地组织测试用例和代码有很大的帮助。
不易扩展
assert 本身是一个非常基础的工具,且具有一定的局限性。当我们需要实现更加复杂的断言时,它的扩展性就显得比较有限了。
expect
expect 是另一种在 Chai 中提供的测试工具,它采用了更加自然、符合口语的语法,而且具有非常好的扩展性。它的语法十分直观,例如:
expect(1 + 1).to.equal(2); // 通过 expect(1 + 1).to.equal(3); // 失败,会抛出错误
expect 不仅支持基础的 equal 断言,还支持一系列的连贯形式的断言,例如:
expect([1, 2, 3]).to.have.lengthOf(3); expect('hello').to.be.a('string').and.include('o');
这些连贯形式的语句对于更好地组织测试用例和代码有很大的帮助。
链式断言
使用 expect 可以进行链式断言,例如:
-- -------------------- ---- ------- ----- --- - - ----- -------- ---- --- ------ ----------- --------- -- ----------- ------------------- -------------------------- -------- ----------------------- --------------------------
这种链式断言具有非常好的可读性和可组织性,可以将测试用例更加清晰地组织起来。
扩展性
相较于 assert,expect 具有非常好的扩展性。我们可以通过编写自定义的 matcher 来实现更加复杂的断言,例如:
-- -------------------- ---- ------- ----------------- ------- ------ - ----------------------------------- -------- ------ ---- - ----- --- - ---------- ----- ---- - ----------------- --------------------------------- -- --------------------- --------- ------- -- ---- ---- --- ------ -------------------- --- ----- --------- ------- -- ---- ---- ------ --- --- -------- ----- ---------- ------------------- --- ---- --------- ------- -- ---- --- ------ --- --- -------- ---- --------- --- --- ----- - - - ----- -------- ---- --- -- ------------------------------- ---- -- -- ------------------------------- ---- -- --------
通过编写自定义的 matcher,我们就可以实现一些类似于链式语法的自定义匹配器,可以更加方便地组织测试用例和代码。
总结
使用 expect 和 assert 都可以对值进行断言,但它们在语法和扩展性上有很大的不同。如果你想要一个简单但功能齐全的测试工具,assert 可能是一个不错的选择;但如果你想要一个更加灵活和扩展性更好的测试工具,你应该选择 expect。
在使用过程中,我们应该根据实际情况来选择正确的测试工具,以保证测试用例的可维护性和代码的可读性。同时,也应该注意在写测试用例时养成良好的习惯,例如合理地组织测试用例、编写可读性高的测试用例等等。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65321bd77d4982a6eb453cba