Python 有没有一种优雅的方法可以用pytest测试ray远程功能?
假设你有这样一个函数:Python 有没有一种优雅的方法可以用pytest测试ray远程功能?,python,ray,Python,Ray,假设你有这样一个函数: @ray.remote def remote_function(): return 1 您可以像这样测试它: def test_remote_function(): ray.init() x=ray.get(remote_function.remote()) assert x==1 但这意味着在不需要它的情况下初始化ray(我只想测试函数本身)。在我的例子中,它甚至不必是异步的或线程化的 我所做的是访问其受保护的包装功能: def te
@ray.remote
def remote_function():
return 1
您可以像这样测试它:
def test_remote_function():
ray.init()
x=ray.get(remote_function.remote())
assert x==1
但这意味着在不需要它的情况下初始化ray(我只想测试函数本身)。在我的例子中,它甚至不必是异步的或线程化的
我所做的是访问其受保护的包装功能:
def test_remote_function():
assert remote_function._function() == 1
但这让我感觉很不舒服,而且门楣也因此不服从我:)
我想要的是这样的pytest夹具:
def test_remote_function(ray):
x=ray.get(remote_function.remote())
assert x==1
或
明确地使其同步(实际上不使用光线)
我看到ray的内部测试有一些pytest装置,但我想没有暴露出来
有人知道更好的方法吗?基于以下内容的解决方案:
像这样使用它:
def test_remote_function(ray_fix):
x=ray.get(remote_function.remote())
assert x==1
这样,ray仍然使用/初始化,但每个模块仅使用一次
在我的例子中,这增加了约2秒的总测试持续时间,可以忽略不计
如果ray附带了一套默认的pytest装置,那就太好了
谢谢你的提示 为什么不在测试中初始化Ray?是避免调用
ray.init()
的开销的原因吗?一些建议。首先,可以调用ray.init(num\u cpus=1)
,以避免启动太多不必要的工作进程。第二,您可以定义一个模块级的pytest夹具,该夹具对Ray进行一次初始化,这样您就不会为每个测试初始化Ray。您还可以将ray.shutdown()
添加到夹具中,以便在测试结束时关闭ray。
@pytest.fixture(scope="module")
def ray_fix():
ray.init(num_cpus=1)
yield None
ray.shutdown()
def test_remote_function(ray_fix):
x=ray.get(remote_function.remote())
assert x==1