Files
Seg_Data_Server_Net/backend/tests/test_progress.py

61 lines
1.9 KiB
Python

from pathlib import Path
from app.progress import parse_progress, progress_from_log_path
def test_parse_ultralytics_epoch_progress():
progress = parse_progress(
"""
Epoch GPU_mem box_loss seg_loss cls_loss dfl_loss Instances Size
3/10 0G 1.234 2.345 0.456 0.789 2 640: 100%|##########| 2/2
""",
status="running",
)
assert progress["percent"] == 30
assert progress["current"] == 3
assert progress["total"] == 10
assert progress["unit"] == "epoch"
assert progress["stage"] == "training"
def test_parse_mmengine_epoch_uses_total_epochs_from_command():
progress = parse_progress(
"""
COMMAND: python tools/train.py config.py --max-epochs 5
Epoch(train) [2][25/50] lr: 1.0000e-03 eta: 0:00:10
""",
status="running",
)
assert progress["percent"] == 30
assert progress["label"] == "Epoch 2/5 · iter 25/50"
assert progress["current"] == 2
assert progress["total"] == 5
def test_parse_tqdm_percent_fallback():
progress = parse_progress("Predict: 42%|#### | 21/50 [00:01<00:02]\n", status="running")
assert progress["percent"] == 42
assert progress["unit"] == "percent"
assert progress["stage"] == "prediction"
def test_terminal_success_overrides_percent_but_keeps_context():
progress = parse_progress("Epoch 2/4 loss=0.5\n", status="success")
assert progress["percent"] == 100
assert progress["stage"] == "completed"
assert progress["label"] == "已完成 · Epoch 2/4"
def test_progress_from_log_path_reads_tail(tmp_path: Path):
log_path = tmp_path / "train.log"
log_path.write_text("Epoch 1/2 loss=0.8\n", encoding="utf-8")
progress = progress_from_log_path(log_path, status="running")
assert progress["percent"] == 50
assert progress["source"] == "epoch_word"