Chai 和 Mocha 為API編寫(xiě)測(cè)試

昨天在文章《JavaScript單元測(cè)試的“抹茶”組合:Mocha和Chai》介紹了JavaScript單元測(cè)試常用組合,本文展示使用 Chai 和 Mocha 為API編寫(xiě)簡(jiǎn)單的測(cè)試用例。
本文將除用到主要框架 Chai 和 Mocha 外,還需要用到 Chai HTTP。
Chai HTTP是一個(gè)使用Chai斷言進(jìn)行HTTP集成測(cè)試的框架,詳細(xì)文檔參閱官方文檔。
首先,通過(guò)運(yùn)行以下命令來(lái)安裝相關(guān)的依賴項(xiàng):
npm install mocha --save-dev
npm install chai --save-dev
npm install chai-http --save-dev
修改項(xiàng)目文件 package.json ,修改 scripts 項(xiàng),增加 test 命令:
"scripts": {
"start": "node ./app.js",
"dev": "nodemon ./app.js",
"test": "mocha"
}
接下來(lái)開(kāi)始編寫(xiě)測(cè)試用例,本文以用戶登錄接口為例,三個(gè)測(cè)試條件:
- 登錄成功
- 用戶名不存在
- 密碼錯(cuò)誤
測(cè)試用例
第 1 步
在項(xiàng)目目錄中創(chuàng)建一個(gè)名為 test 的文件夾,然后在其中創(chuàng)建一個(gè)文件 administrators.js 。
第 2 步
接下來(lái)編寫(xiě)單元測(cè)試用例,編輯文件administrators.js ,代碼如下:
const chai = require("chai");
const chaiHttp = require("chai-http");
const apiUrl = "http://127.0.0.1:4088";
chai.should();
chai.use(chaiHttp);
describe("測(cè)試用戶登錄模塊", () => {
describe("POST /api/v1/auth/login", () => {
it("用戶名不存在", (done) => {
chai.request(apiUrl)
.post("/api/v1/auth/login")
.send({
username: "devpoint",
password: "dev126",
})
.end((error, response) => {
response.should.have.status(200);
response.body.should.be.a("object");
response.body.should.have.property("code").eq(30004);
done();
});
});
it("登錄密碼錯(cuò)誤", (done) => {
chai.request(apiUrl)
.post("/api/v1/auth/login")
.send({
username: "administrator",
password: "dev126",
})
.end((error, response) => {
response.should.have.status(200);
response.body.should.be.a("object");
response.body.should.have.property("code").eq(30001);
done();
});
});
it("登錄成功", (done) => {
chai.request(apiUrl)
.post("/api/v1/auth/login")
.send({
username: "administrator",
password: "devpoint",
})
.end((error, response) => {
response.should.have.status(200);
response.body.should.be.a("object");
response.body.should.have.property("code").eq(0);
response.body.should.have.property("data").a("object");
response.body.data.should.have
.property("username")
.eq("administrator");
done();
});
});
});
});
在上面的代碼片段中:
describe是一個(gè)保存測(cè)試集合的函數(shù),需要兩個(gè)參數(shù),第一個(gè)是被測(cè)功能的名稱或者描述,第二個(gè)是包含一個(gè)或多個(gè)測(cè)試邏輯的函數(shù),也可以嵌套描述。it也是一個(gè)函數(shù),它實(shí)際上是一個(gè)測(cè)試主題,接受兩個(gè)參數(shù),第一個(gè)參數(shù)是測(cè)試的名稱,第二個(gè)參數(shù)是函數(shù),實(shí)現(xiàn)主要的測(cè)試邏輯。
第 3 步
現(xiàn)在運(yùn)行以下命令以查看測(cè)試結(jié)果:
npm run test
運(yùn)行后,將能看到上面編寫(xiě)的3個(gè)單元測(cè)試用例結(jié)果,如圖:

總結(jié)
單元測(cè)試為應(yīng)用程序的最小部分,在開(kāi)發(fā)API接口的時(shí)候可以為預(yù)期的結(jié)果編寫(xiě)相應(yīng)的測(cè)試用例。在項(xiàng)目開(kāi)發(fā)中,普遍是使用前后端分離的模式,可以使用 Chai 和 Mocha 為后臺(tái)接口編寫(xiě)測(cè)試用例,以最大程度的覆蓋接口的邏輯,可以降低前后端聯(lián)調(diào)出現(xiàn)異常的概率,進(jìn)而提高項(xiàng)目開(kāi)發(fā)效率。