Skip to main content

a-guard-on-the-shared-function-proves-nothing-about-its-call-sites

공유 함수에 테스트를 붙이면 그 함수의 *계산*은 지켜지지만, 그걸 **부르는 쪽의 배선**은 무방비로 남는다. 인자를 틀리게 넘기거나 아예 안 넘겨도 스위트가 전부 초록이다. 감지기는 초록/빨강이 아니라 **호출 지점에서 전선을 끊었을 때도 빨개지는가**다. 호출자가 N 개면 테스트도 N 개 — 한쪽에 붙인 가드는 다른 쪽에 대해 아무 말도 안 한다. 트리거 - 공유 함수에 새 파라미터/콜백 추가, 두 곳 이상에서 같은 메커니즘을 배선, "계산은 테스트했다", 전선 절단이 초록으로 나왔을 때.

Ir a la instalación

Datos de origen

Repositorio
blas1n/claude-skills
Última actividad en el origen
17 de septiembre de 2026 a las 06:32
Idioma detectado de SKILL.md
coreano
Estrellas
2
Forks
0

Opciones de instalación

De forma predeterminada está seleccionado el prompt que primero revisa el origen. Puedes cambiar a un comando directo o descargar una copia local.

Revisa los archivos de origen

Lee SKILL.md y los archivos complementarios que muestra SkillsMP antes de decidir si quieres instalarlo.

Mostrando SKILL.md

SKILL.md
Instrucciones de origen · Vista previa de solo lectura
name
a-guard-on-the-shared-function-proves-nothing-about-its-call-sites
description
공유 함수에 테스트를 붙이면 그 함수의 *계산*은 지켜지지만, 그걸 **부르는 쪽의 배선**은 무방비로 남는다. 인자를 틀리게 넘기거나 아예 안 넘겨도 스위트가 전부 초록이다. 감지기는 초록/빨강이 아니라 **호출 지점에서 전선을 끊었을 때도 빨개지는가**다. 호출자가 N 개면 테스트도 N 개 — 한쪽에 붙인 가드는 다른 쪽에 대해 아무 말도 안 한다. 트리거 - 공유 함수에 새 파라미터/콜백 추가, 두 곳 이상에서 같은 메커니즘을 배선, "계산은 테스트했다", 전선 절단이 초록으로 나왔을 때.
version
1.0.0
task_types
["testing","backend","review"]
triggers
[{"pattern":"공유 헬퍼/함수에 새 파라미터·콜백을 추가하고 호출자를 여러 곳 고칠 때"},{"pattern":"같은 메커니즘을 두 개 이상의 호출 지점에 배선할 때"},{"pattern":"전선 절단(mutation)을 했는데 초록이 나왔을 때"},{"pattern":"'로직은 단위 테스트로 덮었다'고 판단하고 넘어가려 할 때"}]
category
trap
# 공유 함수의 가드는 그 호출자들에 대해 아무것도 증명하지 않는다 ## Problem - **증상**: 새 기능의 단위 테스트가 전부 초록. 그런데 호출 지점에서 `timeout_s=remaining_s` 를 `timeout_s=original` 로 바꾸거나, `redeliver=...` 인자를 **통째로 지워도** 스위트가 여전히 전부 초록이다. - **근본 원인**: 테스트가 공유 함수를 **직접** 부르며 자기가 만든 콜백·인자를 넘긴다. 그래서 그 함수의 *계산*은 검증되지만, **프로덕션 호출자가 무엇을 넘기는지**는 한 번도 실행되지 않는다. 결함이 사는 홉과 가드가 놓인 홉이 다르다. - **흔한 오해**: "핵심 로직에 테스트를 붙였으니 덮였다." → 덮인 건 로직이고, **틀릴 수 있는 곳은 배선**이다. 그리고 배선은 호출자마다 따로 틀린다. ## Solution 1. **전선 절단을 호출 지점에서 따로 하라.** 공유 함수 내부를 끊어 빨개지는 것은 증거가 아니다. 각 호출자에서 *인자를 바꾸기* · *인자를 지우기* 를 따로 해라. 2. **빨개진 개수를 세라.** "1 failed" 가 아니라 *어느* 테스트가 빨개졌는지까지 확인해야 겨냥이 맞았는지 안다. 3. **호출자마다 테스트 하나.** 호출자가 두 곳이면 하나에 붙인 가드는 다른 쪽에 대해 아무 말도 안 한다 — 그리고 대개 **덜 쓰이는 쪽이 조용히 갈라진다.** 4. **배선 테스트는 공유 함수를 스텁해 "받은 인자"를 붙잡는 모양이 가장 싸다.** ```python # 공유 함수를 스텁해 프로덕션 호출자가 실제로 넘긴 것을 붙잡는다 async def _invoke_redeliver(*_a, **kw): redeliver = kw.get("redeliver") assert redeliver is not None, "이 호출자는 재시도 경로 없이 기다린다" await redeliver(120.0) # 호출자의 클로저를 실제로 실행 raise TaskTimeout("forced") monkeypatch.setattr(dispatch, "await_completion", _invoke_redeliver) monkeypatch.setattr(dispatch, "redispatch_task", spy) ... assert spy.calls[0]["timeout_s"] == 120.0 # 원래 예산이 아니라 남은 예산 ``` ## Key Insights - **절단 매트릭스를 돌려라.** 가드 하나당 절단 하나를 스크립트로 만들어 한 번에 돌리면, *초록으로 남는 칸*이 곧 무방비인 홉의 목록이다. 실측: 절단 9건 중 **2건이 초록**이었고 둘 다 호출 지점 배선이었다. - **절단이 문법을 깨면 절단이 아니다.** 스크립트에 `ast.parse` 확인을 넣어라 — 안 그러면 빨강이 나왔다는 이유로 성공처럼 읽힌다. - **"계산을 테스트했다"와 "배선을 테스트했다"는 다른 문장이다.** 새 파라미터를 추가했다면 *그 파라미터의 의미*를 지키는 테스트와, *호출자가 그걸 옳게 채우는지* 지키는 테스트가 **각각** 필요하다. - 같은 모양: mock 이 배선을 가리는 것, 미러된 표면이 덜 테스트되는 쪽으로 갈라지는 것.
Ver en GitHub