iT邦幫忙

2021 iThome 鐵人賽

DAY 29
0
Modern Web

自動化 End-End 測試 Nightwatch.js系列 第 29

自動化 End-End 測試 Nightwatch.js 串接 Google sheet

  • 分享至 

  • xImage
  •  

之前撰寫測試時有提到串接 BrowserStack 的服務,而執行時也可以透過 nightwatch-html-reporter 產生好看的報告。不過如果當這項自動化測試部署到 gitlab 或其他可以串接 CI/CD 的服務時:

  • BrowserStack 的 session name 只能使用英文,不一定方便對應測試的內容
    • 此外,BrowserStack 如果一個 test.spec.js 中任何一項有錯誤,最後一項必定顯示錯誤
  • nightwatch-html-reporter 看不到

解決 session name 最方便的作法是產生一組對應的 UUID: https://www.uuidgenerator.net/

或是利用 Javascript 產生(畢竟是寫 Javascript)

const uuid = () => crypto.randomUUID();

參考:https://github.com/WICG/uuid

而為了可以產生方便查看的測試結果,就可以利用 google sheet

Google Apps Script

Google Apps Script (GAS) 即是利用 JavaScript 語法,透過 RESTful API 與 google 提供的服務做互動

而這邊主要是利用 Google sheet

而 Google sheet 的欄位大致上可以規劃為

  • 測試項目
  • 環境
  • UUID
  • 結果

https://ithelp.ithome.com.tw/upload/images/20211014/20120250nPhDgY8C8N.png

接著就可以來著手寫 GAS 了

UUID

首先先點開 工具 > 指令碼編輯器
應該會有以下畫面

https://ithelp.ithome.com.tw/upload/images/20211014/20120250bsElDyIAnb.png

接著先從簡單的建立 UUID 開始,雖然前面有提到利用 crypto 來產生,不過 GAS 有 Utilities 可以幫助我們建立:

function uuid() {
  return Utilities.getUuid().toUpperCase();
}

於是就可以在任何一格使用 =uuid() 來產生 UUID 了~

doPost

doPost() 為 GAS 處理 post 請求的函數

在撰寫處理 doPost 之前,保持 TDD 以測試為優先的想法,先思考要怎麼測試

可以預期我們 doPost 應該會有幾個 parameters

  • browser
  • UUID
  • result

因為使用 UUID 定位,因此測項名稱不需考量,也因此想打什麼文都可以XD

預期會發送給 doPost() 的 request 應該可以程式化為:

function testDoPost() {
  doPost(
    {
      parameters: {
        url: 'GOOGLE SHEET URL',
        UUID: 'b7644a8e-8010-4517-9e20-f359b325b71c',
        browser: 'FIREFOX',
        result: 'PASSED',
       }
    }
  );
}

因此在 doPost() 就需要這樣接:

function doPost(e) {
  let { url, UUID, browser, result } = e.parameters;
}

隨後定位 UUID 的欄位,並填寫內容

var uuidArr = Sheet.getSheetValues(1, 3, SpreadSheet.getLastRow(), 1);

for(let i = 0; i< uuidArr.length; ++i) {
    const uuidStrArr = uuidArr[i][0];
    if(uuidStrArr.pop() === UUID ) {
      targetRow = i + 4;
      break;
    }
}

Logger.log(targetRow)

const writeResult = SpreadSheet.getRange('D' + targetRow);
writeResult.setValue(result);

const writeBrowser = SpreadSheet.getRange('B' + targetRow);
writeBrowser.setValue(browser);

完成 GAS 後,就可以在每次測試完成寫入 google sheet 填寫 pass/fail 了

afterEach: function(browser, done) {
    browser.end(() => done());

    let status = `passed`;
    if (browser.currentTest.results.failed > 0) {
      status = `failed`;
    }
    
    setGoogleSheet(UUID, status);
}
const setGoogleSheet = async (UUID, status) => {
  const bodyObj = {
    url: process.env.SHEET,
    browser: process.env.BROWSER,
    UUID,
    result: status,
  };

  const body = Object.keys(bodyObj)
    .map(function(keyName) {
      return (
        encodeURIComponent(keyName) + '=' + encodeURIComponent(bodyObj[keyName])
      );
    })
    .join('&');

  const option = {
    url: `Google App Script 網頁應用程式的網址`,
    method: 'POST',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded',
    },
    body,
  };

  request(option, function(error, response, body) {
    if (!error && response.statusCode == 200) {
      return body;
    }
    return error;
  });
};

上一篇
自動化 End-End 測試 Nightwatch.js 串接 gitlab CI/CD
下一篇
總結篇 — Nightwatch.js E2E 之旅
系列文
自動化 End-End 測試 Nightwatch.js30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言