單元測試的基本概念 | 單元測試的藝術 第 3 版 | 閱讀筆記

「單元測試的藝術」讀書會 - 單元測試的基本概念 (The Art of Unit Testing, 3e - The Basics of Unit Testing) 閱讀筆記。

投影片

Hi

The Basics of Unit Testing - The Art of Unit Testing, 3e

大家好,我是 Summer,今天想跟大家分享的是「The Basics of Unit Testing」這個章節。

Agenda

The Basics of Unit Testing - The Art of Unit Testing, 3e

這是這次分享的大綱,會談到怎麼界定單元測試的範圍、怎麼樣寫好單元測試、單元測試與整合測試的差異,以及推行 TDD 有什麼好處、怎麼推行 TDD。

計時器

The Basics of Unit Testing - The Art of Unit Testing, 3e

我們先來看一個例子,這裡有一個 <Timer> 元件,它的功能是倒數計時,會顯示還剩下的秒數,它會在經過 3 秒後倒數結束,並且在結束時顯示 Time's Up 訊息。

The Basics of Unit Testing - The Art of Unit Testing, 3e

這是 <Timer> 元件的程式碼。

const Timer = () => {
  // entry point 函式被呼叫
  const [seconds, setSeconds] = useState(3);
  const intervalIDRef = useRef(null);

  const startTimer = useCallback(() => {
    // exit point 呼叫外部函式
    intervalIDRef.current = setInterval(
      () => setSeconds((prev) => prev - 1), // exit point 改變狀態
      timerTickInterval // timerTickInterval is a constant value 1000
    );
  }, []);

  const stopTimer = useCallback(() => {
    clearInterval(intervalIDRef.current); // exit point 呼叫外部函式
    intervalIDRef.current = null;
  }, []);

  useEffect(() => {
    startTimer();
    return () => clearInterval(intervalIDRef.current); // exit point 呼叫外部函式
  }, []);

  useEffect(() => {
    if (seconds === 0) {
      stopTimer();
    }
  }, [seconds]);

  // exit point 函式回傳結果
  return (
    <div>{seconds === 0 ? `Time\'s Up` : `Remaining seconds: ${seconds}`}</div>
  );
};

點此看 demo

SUT

Unit of Work

Entry Point

The Basics of Unit Testing - The Art of Unit Testing, 3e

在觀察程式碼的流程的時候,如果我們要看跟測試有關係的部份,主要是要看怎麼觸發還有會產生怎樣的影響,「怎麼觸發」稱為 entry point;會產生怎樣的影響,也就是會造成流程改變的地方,稱為 exit point。

Exit Point

The Basics of Unit Testing - The Art of Unit Testing, 3e

The Basics of Unit Testing - The Art of Unit Testing, 3e

單元測試的特質

The Basics of Unit Testing - The Art of Unit Testing, 3e

The Basics of Unit Testing - The Art of Unit Testing, 3e

The Basics of Unit Testing - The Art of Unit Testing, 3e

前面談論的是怎麼界定單元測試的範圍,接下來要談的是怎麼樣寫好單元測試。

首先要來看怎樣是單元測試?怎樣不是單元測試?以下任一條件不符會需要對程式碼進行重構讓它符合條件,或是歸類到整合測試。

單元測試 vs 整合測試

The Basics of Unit Testing - The Art of Unit Testing, 3e

比較單元測試與整合測試的差異。

良好的單元測試

The Basics of Unit Testing - The Art of Unit Testing, 3e

良好的單元測試具備哪些特質?

TDD

推行 TDD 有什麼好處

The Basics of Unit Testing - The Art of Unit Testing, 3e

怎麼推行 TDD

The Basics of Unit Testing - The Art of Unit Testing, 3e

推行 TDD 成功的三要素:

在我個人的開發經驗裡面,TDD 很難落實的主要原因是:

不過儘管是這樣,TDD 始終沒有成為我待過的任何一個組織的常態工作流程,大多成為個人愛好或習慣而已。

總結

The Basics of Unit Testing - The Art of Unit Testing, 3e

The Basics of Unit Testing - The Art of Unit Testing, 3e

相關閱讀

參考資料


The Art of Unit Testing Unit Test Integration Test TDD front end testing Jest React Testing Library 單元測試 整合測試 自動化測試 閱讀筆記 讀書會 sharing