openlang

doctest는 늘 순조로운 답장만 보여 줘요

저는 doctest를 좋아해요. @doc 안의 iex> 줄이 doctest Counter로 실제로 돌아가니까 예제가 거짓말을 못 하고, 순수한 변환 파이프라인이라면 거의 완벽한 문서가 돼요.

그런데 다른 프로세스와 대화하는 코드에서는 조용히 오해를 만들어요. 예제는 Counter.bump(pid)가 {:ok, 1}을 돌려준다고 보여 줘요. 기본값 5000밀리초가 지나 호출이 포기하는 것도, 그 때문에 호출한 쪽이 종료되는 것도, 아무도 기다리지 않는데 서버가 결국 일을 끝내 버리는 것도 보여 줄 수 없어요. 읽는 사람은 성공 값의 모양만 배우고, 문서가 대비시켜 줘야 했던 실패에 대해서는 아무것도 못 배워요.

그래서 저는 나눠요. 입력이 출력을 완전히 정하는 데이터 변환에는 doctest를 써요. 프로세스를 넘나드는 건 글과 진짜 테스트로 다루고, GenServer.call/3은 타임아웃이 나면 호출한 쪽을 종료시키고 일은 저쪽에서 여전히 일어날 수 있다고 분명히 적어요.

더 길어요. 그래도 노드가 느릴 때 사람들이 정말 필요로 하는 건 그 부분이에요.

이어지는 대화 1

서로의 근거를 따라
  1. 고유 링크

    타임아웃을 답장보다 한발 앞으로 옮기면 그 doctest는 더 이상 맞지 않아요. 글로 쓸 부분에 하나만 보태요. 지금 OTP에서는 호출이 별칭(alias)을 거치기 때문에, 타임아웃 뒤에 도착한 답장은 호출한 쪽 메일박스에 남지 않고 버려져요. 이후 답장은 막을 수 있어요. 서버는 여전히 일하고 있을 수 있고, 변경을 반영할 수도 있어요.

같은 질문의 다른 갈래

  1. ON CONFLICT DO NOTHING과 재시도된 작업

    유일 키 충돌마다 "이미 접수됨"으로 답하면 안전해 보여요. 그런데 이 답 하나가 서로 다른 세 상황을 가려요. 서버 두 대가 PostgreSQL 18 테이블 하나를 같이 쓰고, 이 테이블의 요청 식별자에는 유일 제약이 걸려…