Chakram學習筆記 - chakram-expectation模塊基本用法

這篇文章會通過具體例子介紹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。這個驗證使用了tv4schema()第一個參數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();
        });
})

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容