interview / tests /test_06_info_stats.py
Lee93whut
feat(env): Gymnasium maze env, 3-channel obs, BFS reachability
fe0625d
"""
测试模块 06 —— info 统计字段
需求覆盖
--------
* RF3:info 新增字段(hit_wall_count / success)的累计语义
对应用例
--------
TC-16, TC-17
"""
from __future__ import annotations
import pytest
from maze_env import MazeEnv
class TestInfoStats:
"""验证 hit_wall_count 与 success 字段在整个幕期间的累计行为。"""
# ------------------------------------------------------------------ #
# TC-16 hit_wall_count 累计 #
# ------------------------------------------------------------------ #
@pytest.mark.unit
def test_hit_wall_count_accumulates(self, env_zero_rewards: MazeEnv) -> None:
"""TC-16a:连续 3 次撞墙,hit_wall_count 应累计为 3。
输入: reset(),action=0(撞边界墙)× 3
期望: 最终 info["hit_wall_count"] == 3
实测: 每步 info["hit_wall_count"]
"""
env_zero_rewards.reset()
for i in range(3):
_, _, _, _, info = env_zero_rewards.step(0)
assert info["hit_wall_count"] == i + 1, \
f"第 {i+1} 次撞墙后计数应为 {i+1}"
@pytest.mark.unit
def test_hit_wall_count_reset_between_episodes(
self, env_zero_rewards: MazeEnv) -> None:
"""TC-16b:reset() 后 hit_wall_count 归零,不跨幕累计。
输入: 第一幕:撞墙 2 次;reset();再撞墙 1 次
期望: 第二幕第 1 步后 hit_wall_count == 1(而非 3)
实测: info["hit_wall_count"]
"""
env_zero_rewards.reset()
env_zero_rewards.step(0)
env_zero_rewards.step(0)
env_zero_rewards.reset()
_, _, _, _, info = env_zero_rewards.step(0)
assert info["hit_wall_count"] == 1, \
"reset() 后撞墙计数应从 0 重新开始"
@pytest.mark.unit
def test_normal_move_no_wall_count(self, env_zero_rewards: MazeEnv) -> None:
"""TC-16c:正常移动不增加 hit_wall_count。
输入: reset(),action=3(右,无障碍)
期望: info["hit_wall_count"] == 0
实测: step() 返回的 info
"""
env_zero_rewards.reset()
_, _, _, _, info = env_zero_rewards.step(3)
assert info["hit_wall_count"] == 0
# ------------------------------------------------------------------ #
# TC-17 success 字段 #
# ------------------------------------------------------------------ #
@pytest.mark.integration
def test_success_true_on_goal(self) -> None:
"""TC-17a:到达终点后 success=True,且后续 reset 后恢复 False。
输入: 引导 agent 到 goal;验证 success;reset();验证 success 归零
期望: 到达终点时 success=True,reset() 后 info["success"]=False
实测: step() 与 reset() 返回的 info
"""
env = MazeEnv(grid_size=6, obstacle_density=0.0, seed=0)
env.reset()
for _ in range(3):
env.step(3)
for _ in range(2):
env.step(1)
_, _, _, _, info = env.step(1)
assert info["success"] is True
# 新一幕
_, info_new = env.reset()
assert info_new["success"] is False, "reset() 后 success 应复位为 False"
@pytest.mark.unit
def test_success_false_during_episode(self, env_zero: MazeEnv) -> None:
"""TC-17b:幕中(未到终点)success 始终为 False。
输入: reset(),向右移动一步(未到终点)
期望: info["success"] is False
实测: step() 返回的 info
"""
env_zero.reset()
_, _, _, _, info = env_zero.step(3)
assert info["success"] is False