iT邦幫忙

0

Day15.Postman 加入自動檢查(少量)

  • 分享至 

  • xImage
  •  
  1. 今天要做什麼
    前面 Day 5 我們已經按按鈕試過了,確定 API 打得通。但只靠眼睛看,很容易漏掉欄位沒回或時間不是 ISO 8601等等。今天就是在 Postman 裡幫每一支 API 加幾條基本檢查,之後按一次 Send 就能看到綠燈/紅燈。
  2. 要檢查哪三件事
    •有成功嗎?狀態碼要是 200。
    •該有的欄位有回嗎?必填欄位不能不見。
    •數值正常嗎?倒數不能是負的,狀態字要在我們定義裡面,時間要是 ISO 8601。
  3. 三支 API 要檢查的欄位
    (1) /bus/routes
    •回來要有路線資料(routes 陣列)。
    •每一筆要有 routeId、routeName(至少要有 routeName.zh)、updateTime。
    (2) /bus/stops
    •要有 routeId。
    •要有 direction,且只能是 0 或 1。
    •要有 stops 陣列,不能是 null。
    •stops[] 裡每一筆要有 stopId、stopName(至少 stopName.zh)、sequence。
    •要有 updateTime。
    (3) /bus/eta
    •要有 routeId、stopId。
    •estimateSeconds 跟 stopStatus 至少要有一個。
    •有 estimateSeconds 時要是整數秒而且 ≥ 0。
    •有 stopStatus 時要在 normal / last / suspended / noData 裡面。
    •要有 updateTime。
  4. 寫進 Postman 的測試
    以下貼在 Postman 的 Tests 分頁中,可依實際 API 微調。
    (1) /bus/routes 的測試
    // 1. 狀態碼要 200
    pm.test("status = 200", function () {
    pm.response.to.have.status(200);
    });

// 2. 至少要有 routes 或資料陣列
const json = pm.response.json();
pm.test("有路線資料", function () {
pm.expect(json.routes || json.length > 0).to.be.ok;
});

// 3. 第一筆要有 routeId + routeName + updateTime
pm.test("路線基本欄位齊全", function () {
const item = json.routes ? json.routes[0] : json[0];
pm.expect(item).to.have.property("routeId");
pm.expect(item).to.have.property("routeName");
pm.expect(item).to.have.property("updateTime");
});
(2) /bus/stops 的測試
pm.test("status = 200", function () {
pm.response.to.have.status(200);
});

const data = pm.response.json();

// 1. 一定要有 routeId + direction
pm.test("有路線與方向", function () {
pm.expect(data).to.have.property("routeId");
pm.expect(data).to.have.property("direction");
pm.expect([0,1]).to.include(data.direction);
});

// 2. stops 一定要是陣列
pm.test("有 stops 陣列", function () {
pm.expect(Array.isArray(data.stops)).to.be.true;
pm.expect(data.stops.length).to.be.above(0);
});

// 3. 第一個站的欄位要齊
pm.test("站點欄位齊全", function () {
const s = data.stops[0];
pm.expect(s).to.have.property("stopId");
pm.expect(s).to.have.property("stopName");
pm.expect(s).to.have.property("sequence");
});
(3) /bus/eta 的測試
pm.test("status = 200", function () {
pm.response.to.have.status(200);
});

const eta = pm.response.json();

// 1. 基本識別一定要在
pm.test("有識別欄位", function () {
pm.expect(eta).to.have.property("routeId");
pm.expect(eta).to.have.property("stopId");
});

// 2. estimateSeconds 跟 stopStatus 至少要有一個
pm.test("有時間或有狀態", function () {
const hasSeconds = eta.hasOwnProperty("estimateSeconds");
const hasStatus = eta.hasOwnProperty("stopStatus");
pm.expect(hasSeconds || hasStatus).to.be.true;
});

// 3. 如果有 estimateSeconds,就要是 >= 0 的整數
if (eta.hasOwnProperty("estimateSeconds")) {
pm.test("estimateSeconds 合理", function () {
pm.expect(eta.estimateSeconds).to.be.a("number");
pm.expect(eta.estimateSeconds).to.be.at.least(0);
});
}

// 4. 如果有 stopStatus,就要在定義的四個裡
if (eta.hasOwnProperty("stopStatus")) {
pm.test("stopStatus 在允許的清單裡", function () {
pm.expect(["normal", "last", "suspended", "noData"]).to.include(eta.stopStatus);
});
}


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言