這篇文章會通過具體例子介紹chakram-expectation
模塊的常用驗證方法。
狀態碼驗證 status code
使用chakram-expectation.status(code)
檢查response的狀態碼
it("should allow checking of the response's status code", function () {
return chakram.get("https://www.hupu.com/").then(function(response){
return expect(response).to.have.status(200);
});
});
響應時間驗證 Response times
使用chakram-expectation.responsetime(milliseconds)
檢查響應時間是小于或等于給出的millisecond value
it("should response time less than or equal to 900", function () {
return chakram.get("https://api.douban.com/v2/movie/subject/26363254").then(function(response){
expect(response).to.have.responsetime(900);
});
JSON內容驗證
使用 chakram-expectation.json(subelement, expectedValue)
去檢查返回body里JSON對象的內容。默認情況下,檢查返回的JSON對象與給出的對象是否完全匹配;如果在chain里加了comprise
,那么就允許部分匹配。json()第一個參數subelement是optional的,這個參數的作用是允許sub object的檢查。
const chakram = require('../node_modules/chakram/lib/chakram.js'),
expect = chakram.expect;
const testURL = "https://api.douban.com/v2/movie/subject/26363254";
const expectedValue = {
"rating": {
"max": 10,
"average": 9.5,
"stars": "50",
"min": 0
},
"reviews_count": 488,
"wish_count": 66074,
"douban_site": "",
"year": "2016",
"images": {
"small": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2380810795.jpg",
"large": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2380810795.jpg",
"medium": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2380810795.jpg"
},
"alt": "https://movie.douban.com/subject/26794215/",
"id": "26794215",
"mobile_url": "https://movie.douban.com/subject/26794215/mobile",
"title": "我們這一天 第一季",
"do_count": 17496,
"share_url": "https://m.douban.com/movie/subject/26794215",
"seasons_count": 3,
"schedule_url": "",
"episodes_count": "18",
"countries": [
"美國"
],
"genres": [
"喜劇"
],
"collect_count": 54903,
"casts": [
{
"alt": "https://movie.douban.com/celebrity/1000013/",
"avatars": {
"small": "https://img1.doubanio.com/view/celebrity/s_ratio_celebrity/public/p23017.jpg",
"large": "https://img1.doubanio.com/view/celebrity/s_ratio_celebrity/public/p23017.jpg",
"medium": "https://img1.doubanio.com/view/celebrity/s_ratio_celebrity/public/p23017.jpg"
},
"name": "曼迪·摩爾",
"id": "1000013"
},
{
"alt": "https://movie.douban.com/celebrity/1009262/",
"avatars": {
"small": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1214.jpg",
"large": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1214.jpg",
"medium": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1214.jpg"
},
"name": "米洛·文堤米利亞",
"id": "1009262"
},
{
"alt": "https://movie.douban.com/celebrity/1004662/",
"avatars": {
"small": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1475766359.42.jpg",
"large": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1475766359.42.jpg",
"medium": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1475766359.42.jpg"
},
"name": "賈斯汀·哈特雷",
"id": "1004662"
},
{
"alt": "https://movie.douban.com/celebrity/1363698/",
"avatars": {
"small": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1477289499.85.jpg",
"large": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1477289499.85.jpg",
"medium": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1477289499.85.jpg"
},
"name": "克麗絲·梅斯",
"id": "1363698"
}
],
"current_season": "1",
"original_title": "This Is Us",
"summary": "講述一群不同的人,他們其中一些人的共同點就是「同一天生日」,他們的生活故事以有趣的方式交叉在一起。\nMandy Moore扮演Rebecca, Jack可愛的妻子也是最好的朋友。搬到匹茲堡后生了三胞胎。Milo Ventimiglia飾演Jack。\nJustin Har tley 扮演Kevin, 一個英俊且當紅的電視演員,有著異常無趣沒有終期的單身生活。\nSterling Brown扮演Randall,衣著光鮮亮麗在紐約工作的顧家生意人。與老婆Beth\n合作無間地養育著兩個女兒。\nSusan Kelechi Watson 扮演Beth,Randall老婆\nRon Cephas Jones 扮演William, Randall的生父。在Randall一出生的時候就遺棄了他。\nChrissy Metz 扮演Kate, 跟很多女人一樣煩惱著飲食和身材. 她用便條貼貼滿整個公寓來體型自己要控制飲食。她是Kevin的孿生姐姐,但是各方面跟Kevin完全相反。",
"subtype": "tv",
"directors": [
{
"alt": "https://movie.douban.com/celebrity/1317350/",
"avatars": {
"small": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p46966.jpg",
"large": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p46966.jpg",
"medium": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p46966.jpg"
},
"name": "約翰·里夸",
"id": "1317350"
},
{
"alt": "https://movie.douban.com/celebrity/1317347/",
"avatars": {
"small": "https://img1.doubanio.com/view/celebrity/s_ratio_celebrity/public/p46967.jpg",
"large": "https://img1.doubanio.com/view/celebrity/s_ratio_celebrity/public/p46967.jpg",
"medium": "https://img1.doubanio.com/view/celebrity/s_ratio_celebrity/public/p46967.jpg"
},
"name": "格倫·費卡拉",
"id": "1317347"
},
{
"alt": "https://movie.douban.com/celebrity/1022804/",
"avatars": {
"small": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1399135203.4.jpg",
"large": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1399135203.4.jpg",
"medium": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1399135203.4.jpg"
},
"name": "肯·奧林",
"id": "1022804"
},
{
"alt": "https://movie.douban.com/celebrity/1005023/",
"avatars": {
"small": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p47175.jpg",
"large": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p47175.jpg",
"medium": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p47175.jpg"
},
"name": "小喬治·提爾曼",
"id": "1005023"
},
{
"alt": "https://movie.douban.com/celebrity/1301767/",
"avatars": {
"small": "https://img1.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1375348180.38.jpg",
"large": "https://img1.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1375348180.38.jpg",
"medium": "https://img1.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1375348180.38.jpg"
},
"name": "克雷格·茲斯克",
"id": "1301767"
},
{
"alt": "https://movie.douban.com/celebrity/1302681/",
"avatars": {
"small": "https://img1.doubanio.com/f/movie/ca527386eb8c4e325611e22dfcb04cc116d6b423/pics/movie/celebrity-default-small.png",
"large": "https://img3.doubanio.com/f/movie/63acc16ca6309ef191f0378faf793d1096a3e606/pics/movie/celebrity-default-large.png",
"medium": "https://img1.doubanio.com/f/movie/8dd0c794499fe925ae2ae89ee30cd225750457b4/pics/movie/celebrity-default-medium.png"
},
"name": "西拉斯霍華德",
"id": "1302681"
},
{
"alt": "https://movie.douban.com/celebrity/1350502/",
"avatars": {
"small": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1460537179.25.jpg",
"large": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1460537179.25.jpg",
"medium": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1460537179.25.jpg"
},
"name": "莎拉·皮亞·安德森",
"id": "1350502"
},
{
"alt": "https://movie.douban.com/celebrity/1360492/",
"avatars": {
"small": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1507708620.86.jpg",
"large": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1507708620.86.jpg",
"medium": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1507708620.86.jpg"
},
"name": "烏塔·布里茲維茨",
"id": "1360492"
},
{
"alt": "https://movie.douban.com/celebrity/1019017/",
"avatars": {
"small": "https://img1.doubanio.com/view/celebrity/s_ratio_celebrity/public/p39678.jpg",
"large": "https://img1.doubanio.com/view/celebrity/s_ratio_celebrity/public/p39678.jpg",
"medium": "https://img1.doubanio.com/view/celebrity/s_ratio_celebrity/public/p39678.jpg"
},
"name": "海倫·亨特",
"id": "1019017"
},
{
"alt": "https://movie.douban.com/celebrity/1019078/",
"avatars": {
"small": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p25251.jpg",
"large": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p25251.jpg",
"medium": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p25251.jpg"
},
"name": "蒂莫西·布斯菲爾德",
"id": "1019078"
},
{
"alt": "https://movie.douban.com/celebrity/1362730/",
"avatars": {
"small": "https://img1.doubanio.com/f/movie/ca527386eb8c4e325611e22dfcb04cc116d6b423/pics/movie/celebrity-default-small.png",
"large": "https://img3.doubanio.com/f/movie/63acc16ca6309ef191f0378faf793d1096a3e606/pics/movie/celebrity-default-large.png",
"medium": "https://img1.doubanio.com/f/movie/8dd0c794499fe925ae2ae89ee30cd225750457b4/pics/movie/celebrity-default-medium.png"
},
"name": "克里斯·科赫",
"id": "1362730"
},
{
"alt": "https://movie.douban.com/celebrity/1276696/",
"avatars": {
"small": "https://img1.doubanio.com/f/movie/ca527386eb8c4e325611e22dfcb04cc116d6b423/pics/movie/celebrity-default-small.png",
"large": "https://img3.doubanio.com/f/movie/63acc16ca6309ef191f0378faf793d1096a3e606/pics/movie/celebrity-default-large.png",
"medium": "https://img1.doubanio.com/f/movie/8dd0c794499fe925ae2ae89ee30cd225750457b4/pics/movie/celebrity-default-medium.png"
},
"name": "溫蒂·斯坦齊勒",
"id": "1276696"
}
],
"comments_count": 21994,
"ratings_count": 64950,
"aka": [
"這就是我們",
"我們的生活",
"同一生日下",
"同一天的我們",
"我們",
"我們在一起"
]
};
const expectedValue_casts = [
{
"alt": "https://movie.douban.com/celebrity/1000013/",
"avatars": {
"small": "https://img1.doubanio.com/view/celebrity/s_ratio_celebrity/public/p23017.jpg",
"large": "https://img1.doubanio.com/view/celebrity/s_ratio_celebrity/public/p23017.jpg",
"medium": "https://img1.doubanio.com/view/celebrity/s_ratio_celebrity/public/p23017.jpg"
},
"name": "曼迪·摩爾",
"id": "1000013"
},
{
"alt": "https://movie.douban.com/celebrity/1009262/",
"avatars": {
"small": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1214.jpg",
"large": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1214.jpg",
"medium": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1214.jpg"
},
"name": "米洛·文堤米利亞",
"id": "1009262"
},
{
"alt": "https://movie.douban.com/celebrity/1004662/",
"avatars": {
"small": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1475766359.42.jpg",
"large": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1475766359.42.jpg",
"medium": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1475766359.42.jpg"
},
"name": "賈斯汀·哈特雷",
"id": "1004662"
},
{
"alt": "https://movie.douban.com/celebrity/1363698/",
"avatars": {
"small": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1477289499.85.jpg",
"large": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1477289499.85.jpg",
"medium": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1477289499.85.jpg"
},
"name": "克麗絲·梅斯",
"id": "1363698"
}
];
describe("describe", function(){
before("Get response", function(){
response = chakram.get("https://api.douban.com/v2/movie/subject/26794215");
});
it("should check the content of JSON ", function () {
expect(response).to.have.json(expectedValue);
return chakram.wait();
});
it("should be a TV show", function(){
expect(response).to.have.json('subtype', 'tv');
return chakram.wait();
});
it("should check sub object casts", function(){
expect(response).to.have.json("casts", expectedValue_casts);
return chakram.wait();
});
it("should check specified object is contained within the body JSON", function(){
expect(response).to.comprise.of.json({
"current_season": "1",
"original_title": "This Is Us",
"year": "2016"
});
return chakram.wait();
})
})
JSON Schema驗證
使用chakram-expectation.schema(subelement, expectedSchema)
來檢查response JSON的schema。這個驗證使用了tv4。schema()
第一個參數subelement是optional的,這個參數的作用是允許sub object的檢查。
const chakram = require('../node_modules/chakram/lib/chakram.js'),
expect = chakram.expect;
describe("Check JSON Schema", function(){
it("should check that the returned JSON object satisifies a JSON schema", function () {
let response = chakram.get("http://httpbin.org/get");
let expectedSchema = {
"type": "object",
properties: {
url: {
type: "string"
},
headers: {
type: "object"
}
}
};
expect(response).to.have.schema('headers', {"required": ["Host", "Accept"]});
expect(response).to.have.schema(expectedSchema);
return chakram.wait();
});
})
Cookie驗證 Cookie presence and value
使用chakram-expectation.cookie(name, value)
檢查cookie是否存在以及cookie的值是否匹配。第二個參數value
是optional的,檢查cookie的值是否匹配期待的字符串或是正則。
const chakram = require('../node_modules/chakram/lib/chakram.js'),
expect = chakram.expect;
describe("Check cookie", function(){
it("should allow checking of HTTP cookies", function () {
var response = chakram.get("http://httpbin.org/cookies/set?chakram=testval");
expect(response).to.have.cookie('chakram');
expect(response).to.have.cookie('chakram', 'testval');
expect(response).to.have.cookie('chakram', /val/);
return chakram.wait();
});
})
Header驗證 Header presence and value
使用chakram-expectation.header(name, value)
來檢查header是否存在以及header的值是否匹配。第二個參數value
是optional的,檢查header的值是否匹配期待的字符串或是正則。
const chakram = require('../node_modules/chakram/lib/chakram.js'),
expect = chakram.expect;
describe("Check Header", function(){
it("should allow checking of HTTP headers", function () {
var response = chakram.get("https://api.douban.com/v2/movie/subject/26794215");
expect(response).to.have.header('content-type');
expect(response).to.have.header('content-type', 'application/json; charset=utf-8');
expect(response).to.have.header('content-type', /json/);
expect(response).to.have.header('content-type', function(contentType) {
expect(contentType).to.equal('application/json; charset=utf-8');
});
return chakram.wait();
});
})
HTTP compression
使用chakram-expectation.deflate()
和chakram-expectation.gzip
來檢查HTTP數據壓縮的方式是deflate還是gzip。
const chakram = require('../node_modules/chakram/lib/chakram.js'),
expect = chakram.expect;
describe("Check compression", function(){
it("should detect deflate compression", function () {
var deflate = chakram.get("http://httpbin.org/deflate");
return expect(deflate).to.be.encoded.with.deflate;
});
it("should detect gzip compression", function () {
var gzip = chakram.get("http://httpbin.org/gzip");
return expect(gzip).to.be.encoded.with.gzip;
});
it("should support shorter language chains", function () {
var deflate = chakram.get("http://httpbin.org/deflate");
expect(deflate).not.to.be.gzip;
expect(deflate).to.be.deflate;
return chakram.wait();
});
})