LINUX.ORG.RU

pytest и DBUS

 


0

1

День добрый!

Написал обёртку для работы с bluetooth устройством через DBUS.

А с написанием теста появились проблемы.

Вызов блокирует выполнение теста:

mainloop = GLib.MainLoop()
mainloop.run()

Попробовал таким способом:

@pytest.fixture(scope="session")
def loop():
    while gtk.events_pending():
       gtk.main_iteration_do(False)

Работает частично – устройство подключается, характеристика читается, но в функции тестирования всегда возвращается None.

Подскажите, как правильно написать тест?


Попробуй взять asyncio-glib, а тесты объявлять async и обмазывать декоратором @pytest.mark.asyncio.

i-rinat ★★★★★
()
Ответ на: комментарий от UVV


pytest.Device=BluezDevice('hci0', 'D6:91:AD:38:C5:16')

@pytest.mark.run(order=1)
def test_connect():
    pytest.Device.Connect()
    time.sleep(1)
    assert pytest.Device.Connected == 1
    time.sleep(1)
    assert pytest.Device.ServicesResolved == 1


@pytest.mark.run(order=2)
def test_char_ManufacturerName():
    charName = BluezChar(pytest.Device.hciX, mac_address=pytest.Device.mac_address,char_uuid='00002a29-0000-1000-8000-00805f9b34fb')

    ManufacturerName = charName.ReadValue(call_async=False)

    ManufacturerNameString = bytearray(ManufacturerName).decode() if ManufacturerName else None
    print(ManufacturerNameString)

    assert ManufacturerNameString == 'test'
isdv
() автор топика
Ответ на: комментарий от i-rinat

Не могу сказать, что понял, но поразбираюсь.

Спасибо.

isdv
() автор топика

В таком варианте заработало:

mainloop = GLib.MainLoop()

pytest.Device = BluezDevice('hci0', 'D6:91:AD:38:C5:16')

@pytest.fixture(scope='session')
def loop():
    global mainloop
    yield mainloop

def test_connect(loop):
    pytest.Device.Connect()
    assert bool(pytest.Device.Connected)

    pytest.Device.Disconnect()
    assert not bool(pytest.Device.Connected)

    GLib.idle_add(loop.quit)
#    GLib.timeout_add(2000, loop.quit)

    loop.run()
isdv
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.