Chakram学习笔记 - 基本概念

什么是Chakram

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

Chakram是基于node.js、mocha、chai和request打造的,所以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");
    })
  });
});

你可能感兴趣的:(Chakram学习笔记 - 基本概念)