使用 Mocha & Chai 进行功能测试

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

在涉及客户端和服务器端或两者上的 JavaScript 的全栈 JavaScript 开发中,我们希望测试函数输入输出行为。在最简单的形式中,函数输入输出行为根据函数的输入指定函数的输出。

例如,对于添加两个数字的函数:


 function f(x,y){
        return x + y;
    }

它的输入输出行为抽象地指定了,


 function f(x,y){
        return x + y;
    }

函数可以在本地执行,也可以调用远程服务。函数的本地执行是经典的程序内执行,不涉及任何服务器端调用。

这些函数可以是 JavaScript 函数、 Node.js 函数,也可以嵌入到 AngularJS 等框架中。

自动化测试

在大多数情况下,测试诸如上述的抽象断言是不切实际的。相反,自动化测试会尝试自动运行测试脚本来检查重要案例的正确性。如果使用得当,自动化测试可以实现几个目标:

  • 它记录了编码时手动测试中使用的测试
  • 回归测试
  • 基于事实而非直觉的持续集成

自动化测试需要一个测试运行器,一个能够理解用测试运行器的语言编写的测试脚本的程序。测试脚本包括多个函数调用、函数输入输出行为的一些断言,以及断言语言表达的断言的自动检查。

摩卡和柴

我们发现作为测试运行器的 Mocha 和作为断言语言的 Chai 是全栈自动化测试的强大组合。与 Jasmine 等其他测试运行器相比,Mocha 不依赖于任何特定的断言语言。 Chai 本身带有多种类型的 BDD 和 TDD 断言。我们发现 Chai 的 BDD expect 风格对于本地函数执行和涉及远程服务调用的执行都非常方便。

那么 Mocha 测试脚本是什么样子的呢?

摩卡测试

摩卡测试构建了可以嵌套的“描述”语句。每个 describe 语句都是一个测试场景。要实际执行测试,请使用“it”语句:


 function f(x,y){
        return x + y;
    }


使用“expect”的 Chai 断言用于对函数的输入输出行为进行断言。

“完成”回调用于转移到下一个测试。

在 Backand 中使用 Mocha 和 Chai

我们在 Backand 中使用了 Mocha 和 Chai,后者是一个后端即服务 (BaaS) 提供商,它会自动创建一个关系数据库以及一个 REST API,它来自一个以熟悉的 JavaScript 术语描述数据库的 JSON 模式。它的灵感来自 Waterline ORM。

例如,此架构 JSON:


 function f(x,y){
        return x + y;
    }


创建具有两个关系的数据库:


 function f(x,y){
        return x + y;
    }


在 MySQL 中使用这些“创建表”语句:


 function f(x,y){
        return x + y;
    }

我们的测试需求

我们有两个主要功能,测试 JSON 是否为有效关系模式的“验证”和将一种模式转换为另一种模式的“转换”。当 Backand 用户通过提供新的 JSON 模式修改其数据库结构时,Backand 使用“转换”。该函数创建一系列 MySQL 语句来修改底层 MySQL 数据库。

在编码时,我们积累了一组测试用例,我们发现 Mocha with Chair 对于记录它们很有用。这是在编码期间立即完成的。完成编码的第一阶段后,我们将自动化测试的使用扩展到回归测试。我们不断扩展模式的表达能力,例如数据库中关系之间的一对多关系。自动化测试可以方便地进行回归测试。

写作测试

为了安装 Mocha 和 Chai,我们使用了“package.json”:


 function f(x,y){
        return x + y;
    }

安装它们:


 function f(x,y){
        return x + y;
    }

在我们的测试文件“unit_functional_test.js”中,我们包含了 Chai,然后是我们的代码:


 function f(x,y){
        return x + y;
    }

现在我们编写一个测试来检查我们的验证器是否将有效模式验证为有效。


 function f(x,y){
        return x + y;
    }

我们运行测试:


 function f(x,y){
        return x + y;
    }

并得到这个输出:



另一个验证字段默认值是否正确验证的测试是:


 function f(x,y){
        return x + y;
    }

在这种情况下,应该检测到表“用户”中的“名称”列具有无效的默认值。

为了测试将一个数据库模式转换为另一个数据库模式的 SQL 语句是否正确,我们使用此测试:


 function f(x,y){
        return x + y;
    }

测试远程服务调用

在全栈开发中,几乎所有模块,无论是客户端还是服务器端,都涉及到远程服务调用。此类调用虽然是异步的,但实际上是为输入生成输出的函数调用。 Mocha 和 Chai 对于测试此类调用同样方便。

在 Backand 中,我们会在您提供用户名、密码和应用程​​序名称时获取 MySQL 数据库的详细信息。这在以下测试中进行了描述,其中我们使用“请求”包进行 HTTP 调用。

首先,我们要求我们的模块进行远程服务调用:


 function f(x,y){
        return x + y;
    }

然后我们调用以获取授权用户和应用程序的身份验证令牌。获得令牌后,我们将调用 getConnectionInfo 服务。此测试旨在测试 getConnectionInfo 服务的输入输出行为。所以断言是在该服务的输出上。


 function f(x,y){
        return x + y;
    }

我们将标准的 2000 毫秒 Mocha 超时增加到 4000 毫秒,因为对服务器的调用可能需要时间。