RobotFramework dengan asyncio Python

Saya mencoba menjalankan RobotFramework dengan asyncio Python3.6.

Kode Python yang relevan terlihat sebagai berikut:

""" SampleProtTest.py """

import asyncio
import threading

class SubscriberClientProtocol(asyncio.Protocol):
    """
    Generic, Asynchronous protocol that allows sending using a synchronous accessible queue
    Based on http://stackoverflow.com/a/30940625/4150378
    """
    def __init__(self, loop):
        self.loop = loop

    """ Functions follow for reading... """


class PropHost:
    def __init__(self, ip: str, port: int = 50505) -> None:
        self.loop = asyncio.get_event_loop()
        self.__coro = self.loop.create_connection(lambda: SubscriberClientProtocol(self.loop), ip, port)
        _, self.__proto = self.loop.run_until_complete(self.__coro)
        # run the asyncio-loop in background thread
        threading.Thread(target=self.runfunc).start()

    def runfunc(self) -> None:
        self.loop.run_forever()

    def dosomething(self):
        print("I'm doing something")


class SampleProtTest(object):
    def __init__(self, ip='127.0.0.1', port=8000):
        self._myhost = PropHost(ip, port)

    def do_something(self):
        self._myhost.dosomething()

if __name__=="__main__":
    tester = SampleProtTest()
    tester.do_something()

Jika saya menjalankan file ini dengan python, ia akan mencetak, seperti yang diharapkan:

I'm doing something

Untuk menjalankan kode di Robot-Framework, saya menulis file .robot berikut:

*** Settings ***
Documentation     Just A Sample
Library           SampleProtTest.py
*** Test Cases ***
Do anything
    do_something

Tetapi jika saya menjalankan file .robot ini, saya mendapatkan kesalahan berikut:

Initializing test library 'SampleProtTest' with no arguments failed: This event loop is already running
Traceback (most recent call last):
  File "SampleProtTest.py", line 34, in __init__
    self._myhost = PropHost(ip, port)
  File "SampleProtTest.py", line 21, in __init__
    _, self.__proto = self.loop.run_until_complete(self.__coro)
  File "appdata\local\programs\python\python36\lib\asyncio\base_events.py", line 454, in run_until_complete
    self.run_forever()
  File "appdata\local\programs\python\python36\lib\asyncio\base_events.py", line 408, in run_forever
    raise RuntimeError('This event loop is already running')

Dapatkah seseorang menjelaskan kepada saya mengapa atau bagaimana saya dapat mengatasi hal ini?

Terima kasih banyak!

EDIT

Berkat @Dandekar saya menambahkan beberapa keluaran Debug, lihat kode di atas, dan dapatkan keluaran berikut dari robot:

- Loop until complete...
- Starting Thread...
- Running in thread...
==============================================================================
Sample :: Just A Sample                                                       
==============================================================================
Do anything                                                           - Loop until complete...
| FAIL |
Initializing test library 'SampleProtTest' with no arguments failed: This event loop is already running
Traceback (most recent call last):
  File "C:\share\TestAutomation\SampleProtTest.py", line 42, in __init__
    self._myhost = PropHost(ip, port)
  File "C:\share\TestAutomation\SampleProtTest.py", line 24, in __init__
    _, self.__proto = self.loop.run_until_complete(self.__coro)
  File "c:\users\muechr\appdata\local\programs\python\python36\lib\asyncio\base_events.py", line 454, in run_until_complete
    self.run_forever()
  File "c:\users\muechr\appdata\local\programs\python\python36\lib\asyncio\base_events.py", line 408, in run_forever
    raise RuntimeError('This event loop is already running')
------------------------------------------------------------------------------
Sample :: Just A Sample                                               | FAIL |
1 critical test, 0 passed, 1 failed
1 test total, 0 passed, 1 failed
==============================================================================
Output:  C:\share\TestAutomation\results\output.xml
Log:     C:\share\TestAutomation\results\log.html
Report:  C:\share\TestAutomation\results\report.html

Menurut saya, masalahnya adalah Thread tersebut sudah dimulai SEBELUM test case. Anehnya, jika saya menghapus garis tersebut

_, self.__proto = self.loop.run_until_complete(self.__coro)

Tampaknya berhasil - tetapi saya tidak dapat menjelaskan alasannya... Tapi ini bukan solusi praktis karena saya tidak dapat mengakses __proto seperti ini...


person IsQb    schedule 10.04.2017    source sumber


Jawaban (1)


Sunting: Beri komentar pada bagian di mana kode Anda dijalankan di awal

# if __name__=="__main__":
#    tester = SampleProtTest()
#    tester.do_something()

Bagian itu dijalankan ketika Anda mengimpor skrip Anda dalam kerangka robot (menyebabkan port terisi).

Juga: Jika Anda hanya mencoba menjalankan kata kunci secara asinkron, ada perpustakaan yang melakukan itu (walaupun saya sendiri belum mencobanya).

robotframework-async

person AkshayDandekar    schedule 10.04.2017
comment
Terima kasih banyak atas sarannya, tetapi alangkah baiknya dalam kasus saya menggunakan robotframework biasa saja, agar dapat terus membaca dengan Python dari IP dan meminta pengiriman/analisis dari RobotFramework. - person IsQb; 11.04.2017
comment
Saya tidak memiliki akses ke asyncio karena versi python saya, tetapi dari kode Anda, menurut saya, Anda cukup mengacak port dan melihat apakah itu berfungsi. from random import choice dan kemudian di mana Anda mengatur portnya, port=choice(range(8000,9000)). Jika ini berhasil, Anda dapat menyempurnakan kode untuk membuat port benar-benar acak. - person AkshayDandekar; 13.04.2017
comment
Sebenarnya, saya rasa saya telah menemukan masalahnya. Komentari bagian autorun dari kode tersebut. if __name__ ==... - person AkshayDandekar; 13.04.2017
comment
Mohon maaf, saya sepenuhnya mengawasi postingan Anda - terima kasih banyak! Sayangnya, hal itu tidak membantu. Bagian if __name__... tidak dijalankan di Robot Framework. Jika saya menambahkan from robot.api import logger ... if __name__=="__main__": logger.console("- Hello world :-)") ... saya tidak melihat pesan Hello world saat menjalankan Robot Framework. - person IsQb; 28.04.2017
comment
Karena saya tidak memiliki akses atau kemampuan untuk menambahkan asyncio, saya tidak dapat meniru yang ini di tempat kerja. Akan mencoba mereplikasi di rumah dan melihat apa kesalahannya. Namun thread tersebut memulai dan menempati port sebelum pengujian Anda dijalankan, jadi setidaknya masalahnya telah teridentifikasi. - person AkshayDandekar; 01.05.2017