iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0

整合測試(Integration Test)與單元測試的區別如其字面上意思。整合測試是針對多個單元測試之間的交互進行測試。通常也使用 Jest、Mocha.js 等框架執行,並且也會搭配測試替身進行。因為這邊討論的是前端的整合測試,所以通常不涉及應用程式後端的資料處理。比較著重在 components 間,不同功能的測試。

舉個例子而言,今天寫了一個抽籤系統,每天早上十點會抽出中午午餐要吃什麼,並會於中午十二點播放鬧鐘鈴聲。我可以寫一個 lunchlottery.js 檔案。

// 午餐菜單
const lunchMenu = ['chicken', 'beef', 'pork', 'fish', 'vegetable'];

// 隨機選擇午餐
function chooseLunch() {
const randomIndex = Math.floor(Math.random() * lunchMenu.length);
return lunchMenu[randomIndex];
}

// 播放鬧鐘鈴聲
function playAlarm() {
console.log('是時候吃午餐囉!');
}

// 定義每天早上十點的時間
const lunchTime = new Date();
lunchTime.setHours(10, 0, 0, 0);

// 設定定時器,每天早上十點抽籤
const intervalId = setInterval(() => {
const currentTime = new Date();
if (currentTime >= lunchTime) {
  clearInterval(intervalId); // 停止定時器
  const selectedLunch = chooseLunch();
  console.log(`今天的午餐是:${selectedLunch}`);
}
}, 1000); // 每秒檢查一次

// 模擬中午十二點播放鬧鐘鈴聲
setTimeout(playAlarm, 2 * 60 * 60 * 1000); // 兩小時後播放鬧鐘鈴聲

我們可以針對上述的程式碼,進行幾個整合測試
1.系統有從菜單中隨機選擇出一個午餐
2.系統有在 12 點鐘播放鬧鈴

可新增一個測試檔案 lunchlottery.test.js

const { chooseLunch, playAlarm } = require('./lunchlottery');

// jest 的 useFakeTimers 搭配 advanceTimerByTime 可模擬時間快進
jest.useFakeTimers();

test('系統有從菜單中隨機選擇出一個午餐', () => {
  jest.advanceTimersByTime(10 * 60 * 1000);

  // 以 spy 方式模擬 console.log
  console.log = jest.fn();
  require('./lunchDrawer');
  expect(console.log).toHaveBeenCalledWith(expect.stringMatching(/^今天的午餐是:(chicken|beef|pork|fish|vegetable)$/));
});

test('系統有在 12 點鐘播放鬧鈴', () => {
  jest.advanceTimersByTime(2 * 60 * 60 * 1000);

  // 以 spy 方式模擬 console.log
  console.log = jest.fn();
  require('./lunchDrawer');
  expect(console.log).toHaveBeenCalledWith('叮咚叮咚~吃午餐時間到囉!!!');
});

上述例子即可驗證不同函式之間的互相交互,有沒有產生預期的結果,此即為整合測試。


上一篇
[Day 13] 理解單元測試(四)- 測試替身
下一篇
[Day 15] 理解整合測試(二)- 何時該寫整合測試
系列文
手動測試好累喔!一起來寫前端自動化測試吧~30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言