JavaScript 单元测试

与编写代码本身一样,编写单元测试同样重要:它有助于确保代码按给定规范编写,并在演进过程中保持正确。

测试框架

测试代码从测试框架开始。该框架提供了一层抽象,使得以简单高效的方式编写测试成为可能。它还提供了一组工具来运行测试、进行断言并报告结果。

Odoo 开发者使用一个名为 HOOT 的自研测试框架。使用自定义框架的主要原因是,我们可以根据自身需求对其进行扩展(标签系统、全局对象模拟等)。

在此框架之上,我们构建了一组工具来帮助我们为 Web 客户端编写测试(web_test_helpers),还构建了一个模拟服务器端的 mock 服务器(mock_server)。

你可以在下面找到各部分参考文档的链接,还可以找到一个包含示例和编写测试最佳实践的章节。

设置

在学习如何编写测试之前,最好从基础开始。以下步骤将确保你的测试文件能被测试运行器正确识别。

请注意,在现有插件模块中,这些步骤大多可以跳过,因为正确的文件夹结构和资源包很可能已经设置好了。

  1. 将文件写入正确的 位置:

    所有 JavaScript 测试文件都应放在相关插件模块的 /static/tests 文件夹下(例如 /web/static/tests/env.test.js)。

  2. 使用正确的 名称:

    测试文件必须以 .test.js 结尾。这不仅是一种约定,也是测试文件被运行器识别的必要条件。所有其他 JavaScript 文件都将被解释为生产代码(即要测试的代码),或测试辅助文件(例如 web_test_helpers)。

    注解

    需要注意的是,.hoot.js 文件是一个例外,它们不被视为测试文件,而是整个测试运行期间的全局模块,而其他 JavaScript 模块会为每个测试套件重新创建。由于这些模块的同一实例将在整个测试运行期间运行,它们遵循严格的约束,例如受限的导入,或采用高级内存管理技术以确保不会有副作用影响测试。

  3. 在正确的 资源包 中调用文件:

    添加到正确文件夹中的测试文件必须包含在 web.assets_unit_tests 资源包中。为便于使用,可以使用 glob 语法导入所有测试和测试辅助文件:

    # Unit test files
    'web.assets_unit_tests': [
        'my_addon/static/tests/**/*',
    ],
    
  4. 前往正确的 URL:

    然后,你可以访问 /web/tests 网址来运行测试。

    小技巧

    可以通过 调试菜单 ‣ 运行单元测试 访问此页面。

编写测试

创建并添加测试文件之后,就可以编写测试了。你可以参阅以下文档章节来了解测试框架。