Skip to content

Commit b9d972e

Browse files
committed
テストの待ち時間を、確かめたいことに要る長さまで縮める
43 秒のうち 19 秒が待ち時間だった。1 本ごとは小さく見えても、本数を掛けると 走らせる気が失せる長さになる。 直したのは 4 か所。後片付けの見回り(HTTPServer.serve_forever の既定は 0.5 秒で、 テスト 1 本ごとに払っていた。15 本で 7.5 秒)、繋がらない相手を待つ既定(5 秒)、 1 行ずつ眠らせる読み手(2 秒)、締め切りより長く眠る子プロセス。 確かめたいのは「その扱いになること」であって、何秒かかるかではない。締め切りを 超えたことが分かる長さがあれば足りる。 43 秒 → 27 秒。テストは 1 本も減らしていない。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent 7bcae5b commit b9d972e

4 files changed

Lines changed: 24 additions & 5 deletions

File tree

CLAUDE.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2818,6 +2818,13 @@ GeoNames 全世界地名辞典 = `geonames`(いずれも 348 言語版・195 か
28182818
「Ukraine (with Crimea)」や複数国をまとめた抽出)は `OVERRIDES` に人手で書く
28192819
— Geofabrik の ISO コードには取り違え(トケラウに `VU` 等)があり、そのまま引くと
28202820
「トケラウ = バヌアツ」のような誤表示になるため
2821+
- **テストで待つときは、確かめたいことに要る長さだけ待つ。** 1 本ごとの待ちは
2822+
小さく見えても、本数を掛けると走らせる気が失せる長さになる。実測で直した 4 か所:
2823+
後片付けの見回り(`HTTPServer.serve_forever` の既定は 0.5 秒で、**テスト 1 本ごと**
2824+
払っていた)、繋がらない相手を待つ既定(5 秒)、1 行ずつ眠らせる読み手(2 秒)、
2825+
締め切りより長く眠る子プロセス。**確かめたいのは「その扱いになること」で、
2826+
何秒かかるかではない** —— 締め切りを超えたことが分かる長さがあれば足りる
2827+
(43 秒 → 27 秒。テストは 1 本も減らしていない)
28212828
- `run_tests.sh` — テスト実行のラッパー(引数はそのまま pytest へ)。手元に依存が
28222829
揃っていればそれで、無ければ **CI と同じ Python 3.12 のイメージを組み立てて** Docker で
28232830
回す。ホストの python が 3.12 でない環境(依存に C 拡張があるので import から落ちる)で

tests/test_bridge.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -898,7 +898,8 @@ def test_a_timeout_carries_what_the_cli_said(self, bridge, monkeypatch):
898898
monkeypatch.setattr(server, "IMAGE_TIMEOUT", 0.5)
899899
monkeypatch.setattr(
900900
server, "image_command",
901-
lambda out_dir, model="": ["sh", "-c", "echo 権限の確認を待っています; sleep 2"],
901+
# 締め切り(0.5 秒)より長ければよい。長くするほどこの 1 本が待つ
902+
lambda out_dir, model="": ["sh", "-c", "echo 権限の確認を待っています; sleep 1"],
902903
)
903904

904905
with pytest.raises(fastapi.HTTPException) as got:

tests/test_extract.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1065,8 +1065,11 @@ def test_a_slow_reader_does_not_run_out_the_clock(self, tmp_path):
10651065

10661066
seen = 0
10671067
for _row in db.stream(path, "SELECT n FROM t ORDER BY n", timeout=0.05):
1068-
# 1 行の手間は小さいが、行数を掛けると締め切りをはるかに超える
1069-
time.sleep(0.0001)
1068+
# **合計で締め切りを超えれば足りる。** 1 行ずつ眠らせると 2 秒かかるので、
1069+
# まとめて休む —— 確かめたいのは「読み手の手間を締め切りに数えない」ことで、
1070+
# どれだけ細かく休むかではない
1071+
if seen % 100 == 0:
1072+
time.sleep(0.002)
10701073
seen += 1
10711074

10721075
assert seen == self.ROWS

tests/test_remote_plugins.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,11 @@ def plugin():
7474
_Handler.docs = DOCS
7575
_Handler.refuse = None
7676
server = HTTPServer(("127.0.0.1", 0), _Handler)
77-
thread = threading.Thread(target=server.serve_forever, daemon=True)
77+
# **見に来る間隔を詰める。** `shutdown()` は次の見回りまで戻らないので、
78+
# 既定(0.5 秒)のままだと**テスト 1 本ごとに 0.5 秒**を後片付けに払う
79+
thread = threading.Thread(
80+
target=lambda: server.serve_forever(poll_interval=0.02), daemon=True,
81+
)
7882
thread.start()
7983
try:
8084
yield f"http://127.0.0.1:{server.server_port}"
@@ -94,8 +98,12 @@ def test_empty_setting_means_no_plugins(self):
9498
assert remote.catalog("") == []
9599
assert remote.catalog(" , ") == []
96100

97-
def test_unreachable_plugin_is_skipped(self, caplog):
101+
def test_unreachable_plugin_is_skipped(self, caplog, monkeypatch):
98102
"""落ちていても本体は動く(警告のみ)。別コンテナなので一時的な不通は正常。"""
103+
# **待つ時間は縮める。** 確かめたいのは「繋がらなければ飛ばす」ことで、
104+
# 何秒待つかではない —— 既定のまま待つと、この 1 本で 5 秒かかる
105+
monkeypatch.setattr(remote, "CATALOG_TIMEOUT", 0.2)
106+
99107
assert remote.catalog("http://127.0.0.1:9") == []
100108
assert "catalog unavailable" in caplog.text
101109

0 commit comments

Comments
 (0)