Chakram学习笔记 - 基本概念
什么是Chakram
Chakram可以让API testing更简单,它可以让你写出直接易懂的E2E测试,保证JSON REST endpoints工作的正确性。不过,暂不支持非JSON的数据格式。
Chakram
是基于node.js、mocha、chai和request打造的,所以Chakram
可以提供BDD式的测试风格和处理promises。
整个Chakram
有两大模块组成:
-
chakram
- 包含了很多HTTP操作,用于API Testing -
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的方法,类似于chai
,Chakram
的expect
接口提供了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");
})
});
});