欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Chakram学习笔记 - 基本概念

程序员文章站 2022-06-03 16:00:14
...

什么是Chakram

Chakram可以让API testing更简单,它可以让你写出直接易懂的E2E测试,保证JSON REST endpoints工作的正确性。不过,暂不支持非JSON的数据格式。

Chakram是基于node.jsmochachairequest打造的,所以Chakram可以提供BDD式的测试风格和处理promises。

整个Chakram有两大模块组成:

  1. chakram - 包含了很多HTTP操作,用于API Testing
  2. chakram-expectation - 扩展了chai.expect,加上了HTTP matcher,用于判断HTTP相关内容

Chakram主要特点

  • 提供HTTP相关的验证
    • 验证status code
    • 验证cookie
    • 验证header
    • 验证JSON和schema
    • 验证compression
    • 验证响应时间
  • 基于mocha和chai的BDD的风格
  • promise友好
  • 自定义的验证

Chakram的安装运行

Chakram的运行需要nodejs环境,通过npm install --save-dev chakram可以把Chakram作为development dependency加入到项目中。

Mocha用来运行Chakram测试,所以Mocha的各种功能都可以和Chakram一起使用。本质上讲,我们可以把Chakram看成一个API Testing的库,测试框架本质还是Mocha

功能介绍 HTTP specific assertion

Chakram提供API Testing中最常用的功能 - HTTP request和response验证。

Chakram使用request library作为请求处理的库,基于这个库(as a helper)提供了很多简单好用的方法来覆盖常用的HTTP request方法。

发起请求 HTTP GET

chakram.get(url, params)发起了一个HTTP请求。返回值是一个ChakramResponse对象,这个对象封装了一次HTTP请求的结果。

验证response

Chakram提供了很多验证response的方法,类似于chaiChakramexpect接口提供了BDD风格的验证方法。我们只需要把response作为参数传给chakram.expect,然后接着使用Chakram提供的验证方法就可以了。还可以使用Chai提供的chains getter来提供可读性。一旦response被接受到了,验证就立即开始。

此外,Chakram.expect继承了Chai所有的属性和验证方法,可以任意使用。

Waiting

由于语言和库的特殊性,API testing在此时都是异步执行的。由于Chakram是基于Mocha的,所以支持异步模式和promise都不在话下。在Mocha中,通过在it()中加上回调函数,可以让it()等到这个回调函数被执行才结束测试;对于promise,需要在it()中直接返回即可. 在Chakram中,通过在it()中返回的promise对象,会保证测试等待请求和验证的完成。

chakram.wait就用来保证测试会等到所有的请求和验证完成后才结束。Chakram也会让所有没有等待验证结束的测试失败。chakram.wait()返回值是一个promise对象,当所有验证都完成的时候,这个promise对象就会被生成实现。

Complex Promise Use

因为chakram大量使用了promises作为return value,所以我们可以使用(new Promise()).then() 这样的chains方法来描述请求和验证。

Example

综上所述,下面来看一个最简单的发出请求和验证response的例子

var chakram = require('../node_modules/chakram/lib/chakram.js'),
    expect = chakram.expect;

const testURL = "https://api.douban.com/v2/movie/subject/26363254";

describe("I can get movie information from douban", function () {
  it("should have year 2017 for movie Wolf Warrior 2", function () {
    let response = chakram.get(testURL);
    expect(response).to.have.status(200);
    expect(response).to.have.header('content-type', 'application/json; charset=utf-8');
    expect(response).to.comprise.of.json({
      "year": "2017"
  });
    return chakram.wait();
  });

  it('should have Wu Jing Starring', function(){
    return chakram.get(testURL).then(function(response){
      let expected_id = response.body.casts[0].id;
      expect(expected_id).to.equal("1000525");
    })
  });
});