<?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>Skip on Tarragon</title><link>https://tarrragon.github.io/blog/tags/skip/</link><description>Recent content in Skip on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Mon, 20 Jul 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/skip/index.xml" rel="self" type="application/rss+xml"/><item><title>Skip vs Fail Semantics（跳過與失敗的語意）</title><link>https://tarrragon.github.io/blog/testing/knowledge-cards/skip-vs-fail-semantics/</link><pubDate>Mon, 20 Jul 2026 00:00:00 +0800</pubDate><guid>https://tarrragon.github.io/blog/testing/knowledge-cards/skip-vs-fail-semantics/</guid><description>&lt;p>Skip 與 Fail 是兩種語意不同的測試訊號：skip 回答「這次沒能驗證」，fail 回答「驗證了、結果不對」。兩者的分界依成因分兩類——環境暫時不可達走 skip，需要人介入才能恢復走 fail。跟 &lt;a href="https://tarrragon.github.io/blog/testing/knowledge-cards/quarantine/" data-link-title="Quarantine（隔離）" data-link-desc="把已知 flaky 的測試從主要執行路徑移開、保留修復壓力的治理機制；與 skip 的語意差異在於 quarantine 有負責人和回收期限">quarantine&lt;/a> 的分工不同：quarantine 處理「已知會紅、暫時擋住」的測試，這裡處理的是同一次執行內、依成因分岔的兩種輸出路徑。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>分岔點在「連不上」與「連得上但被拒」之間：連線層錯誤（TCP 逾時、DNS 解析失敗）代表環境當下不可達，這是暫時狀態，環境恢復後測試自然轉綠，語意上等同尚未執行；應用層拒絕（HTTP 401/403 這類）代表憑證或設定已經腐化，需要人更新，語意上是「驗證完成、結果是壞的」。混在一起處置的代價是需要人介入的問題被歸類成環境噪音，沒人會去看。這條區分是&lt;a href="https://tarrragon.github.io/blog/testing/knowledge-cards/real-backend-verification-test/" data-link-title="Real-Backend Verification Test（真實後端驗證測試）" data-link-desc="對共用測試環境常駐斷言後端業務行為的測試；紅、綠、跳過各有語意，承接假後端固化行為的漂移警報">真實後端驗證測試&lt;/a>整體設計裡分量最重的一條，也是&lt;a href="https://tarrragon.github.io/blog/testing/knowledge-cards/environment-identification/" data-link-title="Test Environment Identification（測試環境判定）" data-link-desc="會寫入的自動化測試在執行前確認目標環境的機制；它是憑證管理與真實後端驗證的共同上游依賴，判定不了時的預設行為決定這條防線的強度">測試環境判定&lt;/a>之後的下一層防線——環境判定回答「連的是哪裡」，這裡回答「連不上時該怎麼回報」。&lt;/p>
&lt;h2 id="可觀察訊號與例子">可觀察訊號與例子&lt;/h2>
&lt;p>實作上的訊號是「單一 try-catch 有沒有把兩層錯誤一起吞掉」——把連線層例外與應用層例外分開捕捉，才能讓登入被拒不會被誤歸成跳過。憑證管理場景是這條區分最常出現的地方：憑證存在但無法登入（HTTP 401/403）要明確失敗、不降級為跳過；連不上後端則降級為跳過並附原因。CI 的 skip 計數若持續上升、失敗計數卻不動，是這條區分沒有落地的間接訊號——真正該亮紅的問題被吞成了噪音。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>實作時把連線層例外（socket 逾時、DNS 失敗）與應用層例外（HTTP 4xx）放進不同的 catch 分支、對應不同的測試結果，是這條語意分岔唯一可靠的落地方式。判定失敗時的預設值也要保守：無法歸類的例外比照「需要人看」的一側處理，而非預設為環境噪音——這與環境判定失敗時預設拒絕的保守方向一致。skip 計數要有行動閾值（連續 N 次全 skip 視為防線失效），否則 skip 會變成一個被長期忽略的靜默訊號。&lt;/p></description><content:encoded><![CDATA[<p>Skip 與 Fail 是兩種語意不同的測試訊號：skip 回答「這次沒能驗證」，fail 回答「驗證了、結果不對」。兩者的分界依成因分兩類——環境暫時不可達走 skip，需要人介入才能恢復走 fail。跟 <a href="/blog/testing/knowledge-cards/quarantine/" data-link-title="Quarantine（隔離）" data-link-desc="把已知 flaky 的測試從主要執行路徑移開、保留修復壓力的治理機制；與 skip 的語意差異在於 quarantine 有負責人和回收期限">quarantine</a> 的分工不同：quarantine 處理「已知會紅、暫時擋住」的測試，這裡處理的是同一次執行內、依成因分岔的兩種輸出路徑。</p>
<h2 id="概念位置">概念位置</h2>
<p>分岔點在「連不上」與「連得上但被拒」之間：連線層錯誤（TCP 逾時、DNS 解析失敗）代表環境當下不可達，這是暫時狀態，環境恢復後測試自然轉綠，語意上等同尚未執行；應用層拒絕（HTTP 401/403 這類）代表憑證或設定已經腐化，需要人更新，語意上是「驗證完成、結果是壞的」。混在一起處置的代價是需要人介入的問題被歸類成環境噪音，沒人會去看。這條區分是<a href="/blog/testing/knowledge-cards/real-backend-verification-test/" data-link-title="Real-Backend Verification Test（真實後端驗證測試）" data-link-desc="對共用測試環境常駐斷言後端業務行為的測試；紅、綠、跳過各有語意，承接假後端固化行為的漂移警報">真實後端驗證測試</a>整體設計裡分量最重的一條，也是<a href="/blog/testing/knowledge-cards/environment-identification/" data-link-title="Test Environment Identification（測試環境判定）" data-link-desc="會寫入的自動化測試在執行前確認目標環境的機制；它是憑證管理與真實後端驗證的共同上游依賴，判定不了時的預設行為決定這條防線的強度">測試環境判定</a>之後的下一層防線——環境判定回答「連的是哪裡」，這裡回答「連不上時該怎麼回報」。</p>
<h2 id="可觀察訊號與例子">可觀察訊號與例子</h2>
<p>實作上的訊號是「單一 try-catch 有沒有把兩層錯誤一起吞掉」——把連線層例外與應用層例外分開捕捉，才能讓登入被拒不會被誤歸成跳過。憑證管理場景是這條區分最常出現的地方：憑證存在但無法登入（HTTP 401/403）要明確失敗、不降級為跳過；連不上後端則降級為跳過並附原因。CI 的 skip 計數若持續上升、失敗計數卻不動，是這條區分沒有落地的間接訊號——真正該亮紅的問題被吞成了噪音。</p>
<h2 id="設計責任">設計責任</h2>
<p>實作時把連線層例外（socket 逾時、DNS 失敗）與應用層例外（HTTP 4xx）放進不同的 catch 分支、對應不同的測試結果，是這條語意分岔唯一可靠的落地方式。判定失敗時的預設值也要保守：無法歸類的例外比照「需要人看」的一側處理，而非預設為環境噪音——這與環境判定失敗時預設拒絕的保守方向一致。skip 計數要有行動閾值（連續 N 次全 skip 視為防線失效），否則 skip 會變成一個被長期忽略的靜默訊號。</p>
]]></content:encoded></item></channel></rss>