Jest测试框架学习(一)

前言

jest是针对JavaScript的测试框架。如果遵循TDD原则,在任何功能开发之前都需要先写测试。而测试分为单元测试,集成测试和系统测试。

单元测试

单元测试可以理解为对于单个函数(单一功能)进行的测试。单元测试一般由开发人员来执行,首先设定最小的测试单元,然后通过设计相应的测试用例来验证各个单元功能的正确性。

集成测试

在单元测试后,需要确认几个单元之间互动没有问题。这就需要集成测试对几个单元组成的模块进行测试,或者测试单元的接口没问题。集成测试的主要关注点是系统能够成功编译,实现了主要的业务功能,系统各个模块之间数据能够正常通信等。

系统测试

系统测试就是针对这个项目的测试。通常与联调相关。验证整个系统是否满足需求规格说明。

验收测试

依照产品说明书,逐步进行检查。从用户的角度检查系统是否满足合同中定义的需求或者用户需求。作为开发,这一步几乎接触不到。

开始入门

直接用npm包管理进行下载安装,同时可以在Package.json的script项中进行设置相关脚本。

//用npm进行安装
npm install --save-dev jest
//设置脚本
{
  "scripts": {
    "test": "jest"
  }
}

package.json初始化

用原生js写项目时,是没有package.json。而使用jest却需要用到。此时可以简单用npm init命令。
npm init

Jest测试命名约定

测试文件的文件名 = 被测试模块名 + .test.js

Cannot use import statement outside a module

配置好以上之后,如果在测试开头import,会报错。原因是jest运行在node中,不能使用es6语法,需要用bable转换为es5。
先安装npm i babel-jest @babel/core @babel/preset-env -D
再创建babel.config.cjs文件

module.exports = {
  presets: [
    [
      "@babel/preset-env",
      {
        targets: {
          node: "current",
        },
      },
    ],
  ],
};

Jest中几类函数

描述函数

这两个仅有可读性的区别,而非功能性。

test("描述信息",()=>{
})

it("描述信息",()=>{
})
分组函数

某个功能,某个组件所有的相关测试

describe("这组是做什么的 "(){
	test("测试一号",()=>{
	})

	it("c测试二号",()=>{
	})
})

Jest的匹配器

常见的匹配器

匹配器可以用于简单输出结果的测试。详情可以参照expect API文档。

// 1 toBe 精确相等
test("一加一必须等于二",()=>{
	expect(1+1).toBe(2);
})

// 2 toEqual 对象,数组相等
test('object assignment', () => {
  const data = {cat: "miao"};
  data['dog'] = “wang";
  expect(data).toEqual({cat: miao, dog:  “wang"});
});

//3 加个Not测试相反情况
test("一加一不等于三",()=>{
	expect(1+1).not.toBe(3);
})
特殊类型和真假

undefined和null等特殊类型可以单独拎出来判断。同时也可以判定语句真假

test('null', () => {
  const n = null;
  expect(n).toBeNull();
  expect(n).toBeDefined();
  expect(n).not.toBeUndefined();
  expect(n).not.toBeTruthy();
  expect(n).toBeFalsy();
});

test('zero', () => {
  const z = 0;
  expect(z).not.toBeNull();
  expect(z).toBeDefined();
  expect(z).not.toBeUndefined();
  expect(z).not.toBeTruthy();
  expect(z).toBeFalsy();
});
数字

大于小于等关系。
这里js浮点运算的精确问题也考虑进去了。

test('two plus two', () => {
  const value = 2 + 2;
  expect(value).toBeGreaterThan(3);
  expect(value).toBeGreaterThanOrEqual(3.5);
  expect(value).toBeLessThan(5);
  expect(value).toBeLessThanOrEqual(4.5);

  // toBe and toEqual are equivalent for numbers
  expect(value).toBe(4);
  expect(value).toEqual(4);
});

test('adding floating point numbers', () => {
  const value = 0.1 + 0.2;
  //expect(value).toBe(0.3);           This won't work because of rounding error
  expect(value).toBeCloseTo(0.3); // This works.
});
字符串

主要还是用正则规则匹配

test('there is no I in team', () => {
  expect('team').not.toMatch(/I/);
});

test('but there is a "stop" in Christoph', () => {
  expect('Christoph').toMatch(/stop/);
});
数组和可迭代对象
const shoppingList = [
  'diapers',
  'kleenex',
  'trash bags',
  'paper towels',
  'milk',
];

test('the shopping list has milk on it', () => {
  expect(shoppingList).toContain('milk');
  expect(new Set(shoppingList)).toContain('milk');
});
异常
function compileAndroidCode() {
  throw new Error('you are using the wrong JDK');
}

test('compiling android goes as expected', () => {
  expect(() => compileAndroidCode()).toThrow();
  expect(() => compileAndroidCode()).toThrow(Error);

  // You can also use the exact error message or a regexp
  expect(() => compileAndroidCode()).toThrow('you are using the wrong JDK');
  expect(() => compileAndroidCode()).toThrow(/JDK/);
});
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值