<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Checking on Tarragon</title><link>https://tarrragon.github.io/blog/tags/checking/</link><description>Recent content in Checking on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Mon, 24 Aug 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/checking/index.xml" rel="self" type="application/rss+xml"/><item><title>Testing vs Checking（探究與檢查）</title><link>https://tarrragon.github.io/blog/testing/knowledge-cards/testing-vs-checking/</link><pubDate>Mon, 24 Aug 2026 00:00:00 +0800</pubDate><guid>https://tarrragon.github.io/blog/testing/knowledge-cards/testing-vs-checking/</guid><description>&lt;p>Checking 是對一個已經被決定的事實作二元評估：判準事先寫下、執行過程不需要判斷、原則上可以交給機器。Testing 是對產品的探究——設計判準本身、發現沒有人想到要問的問題、判斷觀察到的現象算不算問題。這組區分由 Rapid Software Testing 一派提出，用意是把「自動化測試」這個詞裡混在一起的兩件事拆開：能自動化的是 checking，而 checking 的品質取決於當初設計它的那次 testing。這個分界跟 &lt;a href="https://tarrragon.github.io/blog/testing/knowledge-cards/test-oracle/" data-link-title="Test Oracle（測試判準來源）" data-link-desc="一個測試憑什麼判定通過或失敗說不清楚、或被測對象沒有可逐例算出的正確答案時，用來定位判準的來源，以及每一種來源的射程">test oracle&lt;/a> 是同一個問題的兩端——oracle 寫得下來的部分是 checking，寫不下來的部分留在 testing。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>站內的測試三層（unit / &lt;a href="https://tarrragon.github.io/blog/testing/knowledge-cards/protocol-integration-test/" data-link-title="Protocol Integration Test" data-link-desc="驗證程式碼和真實外部服務之間的協議互動是否正確的 test 層級">protocol integration&lt;/a> / &lt;a href="https://tarrragon.github.io/blog/testing/knowledge-cards/screen-state-test/" data-link-title="Screen State Test" data-link-desc="驗證使用者可見的畫面狀態覆蓋度和狀態間轉換完整性的 test 層級">screen state&lt;/a>）全部落在 checking 這一側：它們都是事先寫好判準、之後重複執行。Testing 在這個結構裡是產生前三層的那個活動，而不是它們之外的第四層——決定哪些協議差異值得驗、哪些畫面狀態需要覆蓋、&lt;a href="https://tarrragon.github.io/blog/testing/05-test-design-judgment/mock-boundary-decision/" data-link-title="Mock 邊界判斷決策表" data-link-desc="什麼時候 mock 夠用、什麼時候需要真實服務 — 從 API 層 / 協議層 / 環境層的斷裂點判斷 mock 的適用範圍">mock 的邊界&lt;/a>畫在哪，都是判準設計而非判準執行。&lt;/p>
&lt;p>這個分界在斷言的生產成本趨近於零時才變得可操作。過去 checking 的數量受限於有人願意寫多少，於是「寫了多少測試」跟「想清楚多少事」大致同步成長；斷言可以被整批產生之後兩者脫鉤，套件規模不再是思考量的代理指標。&lt;/p>
&lt;h2 id="可觀察訊號與例子">可觀察訊號與例子&lt;/h2>
&lt;p>判別一項驗證工作屬於哪一側，問它的判準在執行之前存不存在。「登入失敗三次後帳號鎖定」的判準事先寫得下來，是 checking。「這個錯誤訊息會不會讓使用者以為是自己打錯」需要在看到畫面的當下判斷，是 testing。同一個功能通常兩側都有：鎖定次數是 checking，鎖定之後的求助路徑通不通則要有人走一次。&lt;/p>
&lt;p>一個常見的錯位是把 testing 的產出誤當成 checking 的產出來衡量。套件從 200 個斷言長到 2000 個，如果新增的都是同一批判準的變體，探究的覆蓋面沒有變化——&lt;a href="https://tarrragon.github.io/blog/testing/knowledge-cards/mutation-testing/" data-link-title="Mutation Testing（突變測試）" data-link-desc="行覆蓋率很高卻仍漏掉 bug、或要挑一個比覆蓋率難灌水的測試品質指標時，用來判斷這套測試實際擋得住什麼">mutation testing&lt;/a> 生出來的測試就屬於這一類，它補的是運算子層的漏洞，不會提出新的問題。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Checking 交給機器之後，人的時間要移到 checking 產生不了的地方：判準本身的設計、&lt;a href="https://tarrragon.github.io/blog/testing/knowledge-cards/test-provenance/" data-link-title="Test Provenance（測試出處）" data-link-desc="測試與被測實作由同一來源產出時（同一次生成、同一輪對話、同一個人同時寫），用來判斷這組測試還剩下多少驗證力">出處獨立&lt;/a>的驗收條件、以及那些沒有被任何斷言涵蓋的問題。把省下來的時間拿去讀機器寫的斷言，等於把人放回機器已經做得比較好的那一側。&lt;/p>
&lt;p>這個分界也給了自動化程度一個誠實的說法。宣稱「測試全自動化」時實際成立的是「checking 全自動化」，而 checking 的完整性由當初那次 testing 決定——沒有人問過的問題不會因為套件變大而被回答。&lt;/p></description><content:encoded><![CDATA[<p>Checking 是對一個已經被決定的事實作二元評估：判準事先寫下、執行過程不需要判斷、原則上可以交給機器。Testing 是對產品的探究——設計判準本身、發現沒有人想到要問的問題、判斷觀察到的現象算不算問題。這組區分由 Rapid Software Testing 一派提出，用意是把「自動化測試」這個詞裡混在一起的兩件事拆開：能自動化的是 checking，而 checking 的品質取決於當初設計它的那次 testing。這個分界跟 <a href="/blog/testing/knowledge-cards/test-oracle/" data-link-title="Test Oracle（測試判準來源）" data-link-desc="一個測試憑什麼判定通過或失敗說不清楚、或被測對象沒有可逐例算出的正確答案時，用來定位判準的來源，以及每一種來源的射程">test oracle</a> 是同一個問題的兩端——oracle 寫得下來的部分是 checking，寫不下來的部分留在 testing。</p>
<h2 id="概念位置">概念位置</h2>
<p>站內的測試三層（unit / <a href="/blog/testing/knowledge-cards/protocol-integration-test/" data-link-title="Protocol Integration Test" data-link-desc="驗證程式碼和真實外部服務之間的協議互動是否正確的 test 層級">protocol integration</a> / <a href="/blog/testing/knowledge-cards/screen-state-test/" data-link-title="Screen State Test" data-link-desc="驗證使用者可見的畫面狀態覆蓋度和狀態間轉換完整性的 test 層級">screen state</a>）全部落在 checking 這一側：它們都是事先寫好判準、之後重複執行。Testing 在這個結構裡是產生前三層的那個活動，而不是它們之外的第四層——決定哪些協議差異值得驗、哪些畫面狀態需要覆蓋、<a href="/blog/testing/05-test-design-judgment/mock-boundary-decision/" data-link-title="Mock 邊界判斷決策表" data-link-desc="什麼時候 mock 夠用、什麼時候需要真實服務 — 從 API 層 / 協議層 / 環境層的斷裂點判斷 mock 的適用範圍">mock 的邊界</a>畫在哪，都是判準設計而非判準執行。</p>
<p>這個分界在斷言的生產成本趨近於零時才變得可操作。過去 checking 的數量受限於有人願意寫多少，於是「寫了多少測試」跟「想清楚多少事」大致同步成長；斷言可以被整批產生之後兩者脫鉤，套件規模不再是思考量的代理指標。</p>
<h2 id="可觀察訊號與例子">可觀察訊號與例子</h2>
<p>判別一項驗證工作屬於哪一側，問它的判準在執行之前存不存在。「登入失敗三次後帳號鎖定」的判準事先寫得下來，是 checking。「這個錯誤訊息會不會讓使用者以為是自己打錯」需要在看到畫面的當下判斷，是 testing。同一個功能通常兩側都有：鎖定次數是 checking，鎖定之後的求助路徑通不通則要有人走一次。</p>
<p>一個常見的錯位是把 testing 的產出誤當成 checking 的產出來衡量。套件從 200 個斷言長到 2000 個，如果新增的都是同一批判準的變體，探究的覆蓋面沒有變化——<a href="/blog/testing/knowledge-cards/mutation-testing/" data-link-title="Mutation Testing（突變測試）" data-link-desc="行覆蓋率很高卻仍漏掉 bug、或要挑一個比覆蓋率難灌水的測試品質指標時，用來判斷這套測試實際擋得住什麼">mutation testing</a> 生出來的測試就屬於這一類，它補的是運算子層的漏洞，不會提出新的問題。</p>
<h2 id="設計責任">設計責任</h2>
<p>Checking 交給機器之後，人的時間要移到 checking 產生不了的地方：判準本身的設計、<a href="/blog/testing/knowledge-cards/test-provenance/" data-link-title="Test Provenance（測試出處）" data-link-desc="測試與被測實作由同一來源產出時（同一次生成、同一輪對話、同一個人同時寫），用來判斷這組測試還剩下多少驗證力">出處獨立</a>的驗收條件、以及那些沒有被任何斷言涵蓋的問題。把省下來的時間拿去讀機器寫的斷言，等於把人放回機器已經做得比較好的那一側。</p>
<p>這個分界也給了自動化程度一個誠實的說法。宣稱「測試全自動化」時實際成立的是「checking 全自動化」，而 checking 的完整性由當初那次 testing 決定——沒有人問過的問題不會因為套件變大而被回答。</p>
]]></content:encoded></item></channel></rss>