美文网首页
单元测试jest初识

单元测试jest初识

作者: 愿你如夏日清凉的风 | 来源:发表于2019-04-10 12:37 被阅读0次

    单元测试 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初识

          本文链接:https://www.haomeiwen.com/subject/morniqtx.html