测试环境¶
PettingZoo 通过提供了一系列环境的合规性测试。如果你正在添加新的环境,我们鼓励你对自己的环境运行这些测试。
API 测试¶
PettingZoo 的 API 有许多特性和要求。为了确保你的环境与 API 一致,我们提供了 api_test。下面是一个示例
from pettingzoo.test import api_test
from pettingzoo.butterfly import pistonball_v6
env = pistonball_v6.env()
api_test(env, num_cycles=1000, verbose_progress=False)
正如你所见,只需将环境传递给测试即可。测试会在遇到 API 问题时断言或抛出其他错误,如果通过则正常返回。
可选参数为
num_cycles
: 运行环境指定数量的周期,并检查输出是否与 API 一致。verbose_progress
: 打印消息以指示测试的部分完成情况。对于调试环境很有用。
并行 API 测试¶
这是 API 测试的并行版本,用于并行环境。你可以这样使用这个测试
from pettingzoo.test import parallel_api_test
from pettingzoo.butterfly import pistonball_v6
env = pistonball_v6.parallel_env()
parallel_api_test(env, num_cycles=1000)
种子测试¶
为了获得利用随机性但可正确重现的环境,你需要通过为定义随机行为的随机数生成器设置种子,使其在评估期间变为确定性。种子测试检查使用常量调用 seed()
方法是否确实使环境变得确定性。
种子测试接受一个创建 pettingzoo 环境的函数作为输入。例如
from pettingzoo.test import seed_test, parallel_seed_test
from pettingzoo.butterfly import pistonball_v6
env_fn = pistonball_v6.env
seed_test(env_fn, num_cycles=10)
# or for parallel environments
parallel_env_fn = pistonball_v6.parallel_env
parallel_seed_test(parallel_env_fn)
内部有两个独立的测试。
在环境设置种子后,两个独立的环境是否给出相同的结果?
对单个环境调用 seed() 然后 reset() 后是否给出相同的结果?
第一个可选参数 num_cycles
指示环境将运行多长时间以检查确定性。有些环境只有在初始化后很长时间才会测试失败。
第二个可选参数 test_kept_state
允许用户禁用第二个测试。一些基于物理的环境由于缓存等引起的微小差异而未能通过此测试,这些差异并不重要。
最大周期测试¶
最大周期测试检查 max_cycles
环境参数是否存在,以及由此产生的环境是否实际运行了正确的周期数。如果你的环境不接受 max_cycles
参数,则不应运行此测试。此测试存在的原因是在实现 max_cycles
时可能会出现许多差一错误。一个测试用法示例如下
from pettingzoo.test import max_cycles_test
from pettingzoo.butterfly import pistonball_v6
max_cycles_test(pistonball_v6)
渲染测试¶
渲染测试检查渲染 1) 不会崩溃,以及 2) 在给定模式时产生正确类型的输出(仅支持 'human'
、'ansi'
和 'rgb_array'
模式)。
from pettingzoo.test import render_test
from pettingzoo.butterfly import pistonball_v6
env_func = pistonball_v6.env
render_test(env_func)
渲染测试方法接受一个可选参数 custom_tests
,该参数允许在非标准模式下进行额外的测试。
from pettingzoo.test import render_test
from pettingzoo.butterfly import pistonball_v6
env_func = pistonball_v6.env
custom_tests = {
"svg": lambda render_result: isinstance(render_result, str)
}
render_test(env_func, custom_tests=custom_tests)
性能基准测试¶
为了确保我们没有性能退化,我们提供了性能基准测试。此测试只是打印出环境在 5 秒内进行的步数和周期数。此测试需要手动检查其输出结果
from pettingzoo.test import performance_benchmark
from pettingzoo.butterfly import pistonball_v6
env = pistonball_v6.env()
performance_benchmark(env)
保存观测测试¶
保存观测测试是为了目视检查具有图形观测的游戏的观测结果,以确保它们是预期的样子。我们发现观测结果是环境中的巨大 bug 源,因此最好在可能的情况下手动检查它们。此测试仅尝试保存所有智能体的观测结果。如果失败,则仅打印警告。输出需要目视检查其正确性。
from pettingzoo.test import test_save_obs
from pettingzoo.butterfly import pistonball_v6
env = pistonball_v6.env()
test_save_obs(env)