Существует ли элегантный способ тестирования удаленных функций луча с помощью pytest? - PullRequest
1 голос
/ 18 февраля 2020

Скажем, у вас есть такая функция:

@ray.remote
def remote_function():
    return 1

Возможно, вы можете протестировать ее следующим образом:

def test_remote_function():
    ray.init()
    x=ray.get(remote_function.remote())
    assert x==1

Но это означает, что инициализация луча фактически не нужна (я просто хочу проверить саму функцию). В моем случае он даже не должен быть asyn c или с резьбой.

То, что я делаю, atm - это доступ к его защищенной функции:

def test_remote_function():
    assert remote_function._function() == 1

, но это кажется хакерским и Линтер не слушается меня за это:)

Мне бы хотелось, чтобы прибор Pytest был таким:

def test_remote_function(ray):
    x=ray.get(remote_function.remote())
    assert x==1

или

def test_remote_function(ray_sync):
    x=ray.get(remote_function.remote())
    assert x==1

, чтобы явно сделать его синхронизированным c (на самом деле не использовать ray).

Я видел, что во внутренних тестах ray есть какие-то приспособления для pytest, но, я думаю, они не выставлены.

Кто-нибудь знает лучший способ?

1 Ответ

1 голос
/ 21 февраля 2020

Решение на основе комментария Роберта Нишихара :

@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

Таким образом, луч все еще используется / инициализируется, но только один раз для каждого модуля.

В моем случае это добавило ~ 2 секунды общей продолжительности теста, что пренебрежимо мало.

Было бы здорово, если бы луч пришел с набором по умолчанию pytest Светильники.

Спасибо за подсказку!

...