单元测试jest初识

单元测试 jest,这个迭代在做新框架压测的时候 第一次接触到 jest,这次总结再做进一步的了解,以后在开发中利用 jest 提高 自己的代码质量,减少 bug,提高开发效率。

测试是一种验证我们的代码是否可以按预期工作的手段。
测试可以分为三个种类:单元测试、集成测试、功能测试。
Jest 就是单元测试的一种,单元测试又称为模块测试,是针对程序模块来进行 正确性检验的测试工作,单元可以是单个程序、函数、过程等,我们在写接口 的时候,可以针对某个接口中的 controller 层来进行测试,例如入参不按规定传 入,入参的各种边界情况,改变参数的类型。例如出参的结构,出参的类型, error、errorCode 等等,都可以通过单元测试来测出很多问题。
测试的好处有很多,减少 bug、提高代码质量、提升产品性能、趁早发现问 题,及时解决问题,减少调试时间,放心重构。
Jest 是由 Facebook 发布的开源的、基于 Jasmine 的 JavaScript 单元测试框架。 Jest 优点是尽量减少开始测试一个项目所要花费的时间和认知负荷,安装配置 简单,非常容易上手,几乎零配置。

支持 Babel,我们将很轻松的使用 ES6 的高级语法。
支持 webpack,非常方便的使用它来管理我们的项目。
支持 TypeScript,在我们的项目中可以放心的使用 TypeScript 来编写代码。
快速的命令行接口、Mock 工具集以及它的自动模块 Mock 系统。

在我们的框架中有配置了 test 的命令,

"scripts": {
    "test": "one-jest",
}

当我们要执行这条命令的时候可以直接在项目的根目录下执行:
npm run test
下面举两个在项目中的例子:

test('判断 getwaitmyreply 接口返回的 error 是否为 false', async () => { 
     let  requestInvoke = {             
     url:"http://127.0.0.1:8080/content/api/getwaitmyreply", 
     method: "POST",
     dataType: "form"
};
let data = await TeService(requestInvoke)({
     sourceType: "0",
     pageSize: 2,
     pageNo: "1",
     userId: "240000000084992760"
});
expect(data.data.error).toEqual(false); });

test()中包含一个测试,这里我们做了一个异步的测试,直接请求自己写的接 口。
expect().toEqual():这种就是断言,是一种放在程序中的一段逻辑(如一个结果 为真或为假的逻辑判断式),目的是为了标示与验证程序开发者预期的结果, 判断结果是否和预期等价,如果想检查某表对象的值,就用 toEqual(),因为 toEqual()会递归遍历检查对象或数组里的每一个领域,所以这里用 toEqual()是 最精准的。

toEqual()是一个 matchers,Jest 使用 matchers 来使用不同的方式测试你的结果。 在上面这个例子中,如果出现了业务逻辑上的错误,不太好找原因,这个时 候,我们就需要像下面这样写测试代码。

import { BaseController } from 'te-one';
import { GetMyAskBean, GetMyAskViewModel } from '../../src/controller/qanda/myask/service/index.interface';
import { MyAskRequest } from '../../src/business/myask/service/index.interface';
import getMyAskBus from '../../src/business/myask/index'; 
import { API_ERROR, NOT_LOGIN, PARAM_ERROR } from '../../src/common/constants.error';

let res = {
   "sourceType": "0",
   "pageSize": 2,
   "pageNo": "1",
   "userId": "240000000084992760"
};
export class GetMyAskController extends BaseController {
async getMyAsk(res) {
let vm_data = new GetMyAskViewModel();
let viewModel = this.getResObj();
let bus = new getMyAskBus();
let form = new GetMyAskBean(res.sourceType, res.pageSize, res.pageNo, res.userId);

if (!form.validate()) {
   viewModel.error = true; viewModel.errorCode = PARAM_ERROR;       
   viewModel.errorMessage = "参数错误"; return viewModel;
}

let getMyAskReq = new MyAskRequest(); 
getMyAskReq.sourceType = res.sourceType; 
getMyAskReq.pageSize = res.pageSize; 
getMyAskReq.pageNo = res.pageNo; 
getMyAskReq.userId = res.userId; getMyAskReq.pageType = '0';

try {
    let getMyAskResult = await bus.getMyAskResp(getMyAskReq);
    this.log(">>>>> getmyask: 我的提问: ", getMyAskReq, ">>> res : ", getMyAskResult);
    if (!getMyAskResult.data || getMyAskResult.data.retcode != 0 || 
    getMyAskResult.data.retdesc != 'success') {
         viewModel.error = true; viewModel.errorCode = API_ERROR;         
         viewModel.errorMessage = "没有我提问的问答"; return viewModel;
     }
     viewModel.error = false; viewModel.errorCode = ""; 
     viewModel.errorMessage = ""; vm_data.askAnswerLastDate =
     getMyAskResult.data.body.askAnswerLastDate;
     vm_data.totalAskNum = getMyAskResult.data.body.totalAskNum;     
     vm_data.waitAnswerLastDate =
     getMyAskResult.data.body.waitAnswerLastDate;
     vm_data.askList = getMyAskResult.data.body.askList; viewModel.data = vm_data;
     return viewModel;
} catch (error) {
    this.error("getmyask ===> req:" + JSON.stringify(res) + "
    resp:" + JSON.stringify(error)); }
} }
    let getMyAskData = new GetMyAskController();
    it('判断 GetMyAsk 接口返回的 error 是否为 false', async () => {
        expect.assertions(1);
        const data = await getMyAskData.getMyAsk(res); expect(data.error).toEqual(false);
});

上面是 controller 层中的代码,我们要测试一个接口中可能遇到的问题,都可以 通过这些代码来测试,也能比较快的定位到问题。

你可能感兴趣的:(单元测试jest初识)