RobotFramework พร้อม asyncio ของ Python

ฉันกำลังพยายามเรียกใช้ RobotFramework ด้วย asyncio ของ Python3.6

Python-Code ที่เกี่ยวข้องมีลักษณะดังนี้:

""" 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()

หากฉันเรียกใช้ไฟล์นี้ใน python ไฟล์จะพิมพ์ตามที่คาดไว้:

I'm doing something

ในการรันโค้ดใน Robot-Framework ฉันเขียนไฟล์ .robot ต่อไปนี้:

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

แต่ถ้าฉันเรียกใช้ไฟล์ .robot นี้ ฉันได้รับข้อผิดพลาดต่อไปนี้:

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')

ใครสามารถอธิบายให้ฉันฟังได้ว่าทำไมหรือฉันจะแก้ไขปัญหานี้ได้อย่างไร

ขอบคุณมาก!

แก้ไข

ขอบคุณ @Dandekar ฉันได้เพิ่มเอาต์พุต Debug บางส่วน ดูโค้ดด้านบน และรับเอาต์พุตต่อไปนี้จากหุ่นยนต์:

- 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

อย่างที่ฉันเห็น ปัญหาคือมันเริ่ม Thread ก่อนเคสทดสอบแล้ว แปลกถ้าผมเอาเส้นออก

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

ดูเหมือนว่าจะผ่านไปได้ - แต่ฉันไม่สามารถอธิบายได้ว่าทำไม ... แต่นี่ไม่ใช่วิธีแก้ปัญหาที่ใช้งานได้จริงเนื่องจากฉันไม่สามารถเข้าถึง __proto เช่นนี้ได้ ...


person IsQb    schedule 10.04.2017    source แหล่งที่มา


คำตอบ (1)


แก้ไข: แสดงความคิดเห็นส่วนที่โค้ดของคุณทำงานเมื่อเริ่มต้น

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

ชิ้นส่วนนั้นจะถูกเรียกใช้เมื่อคุณนำเข้าสคริปต์ของคุณในกรอบงานโรบ็อต (ทำให้พอร์ตถูกครอบครอง)

นอกจากนี้: หากคุณเพียงพยายามเรียกใช้คำหลักแบบอะซิงโครนัส มีไลบรารีที่ทำเช่นนั้น (แม้ว่าฉันจะไม่ได้ลองด้วยตัวเองก็ตาม)

robotframework-async

person AkshayDandekar    schedule 10.04.2017
comment
ขอบคุณมากสำหรับข้อเสนอแนะ แต่ในกรณีของฉันคงจะดีถ้าใช้ robotframework ปกติเท่านั้น เพื่อให้สามารถอ่านอย่างต่อเนื่องใน Python จาก IP และขอส่ง / วิเคราะห์จาก RobotFramework - person IsQb; 11.04.2017
comment
ฉันไม่สามารถเข้าถึง asyncio ได้เนื่องจากเวอร์ชัน python ของฉัน แต่จากโค้ดของคุณ ฉันจะบอกว่าคุณสามารถสุ่มพอร์ตและดูว่าใช้งานได้หรือไม่ from random import choice จากนั้นตำแหน่งที่คุณตั้งค่าพอร์ต port=choice(range(8000,9000)) หากวิธีนี้ใช้ได้ผล คุณสามารถปรับปรุงโค้ดเพื่อทำให้พอร์ตสุ่มได้อย่างแท้จริง - person AkshayDandekar; 13.04.2017
comment
จริงๆแล้วฉันคิดว่าฉันพบปัญหาแล้ว ใส่ความคิดเห็นส่วนการทำงานอัตโนมัติของโค้ด if __name__ ==... - person AkshayDandekar; 13.04.2017
comment
โปรดแก้ตัว ฉันตรวจสอบโพสต์ของคุณอย่างสมบูรณ์แล้ว - ขอบคุณมาก! น่าเสียดายที่มันไม่ได้ช่วยอะไร ส่วน if __name__... ไม่ได้ถูกดำเนินการใน Robot Framework ถ้าฉันเพิ่ม from robot.api import logger ... if __name__=="__main__": logger.console("- Hello world :-)") ... ฉันไม่เห็นข้อความ Hello world เมื่อรัน Robot Framework - person IsQb; 28.04.2017
comment
เนื่องจากฉันไม่มีสิทธิ์เข้าถึงหรือสามารถเพิ่ม asyncio ได้ ฉันจึงไม่สามารถจำลองสิ่งนี้ในที่ทำงานได้ จะพยายามทำซ้ำที่บ้านครับว่า error อะไร แต่เธรดจะเริ่มต้นและครอบครองพอร์ตก่อนที่การทดสอบของคุณจะดำเนินการ ดังนั้นอย่างน้อยที่สุดปัญหาก็ได้รับการระบุแล้ว - person AkshayDandekar; 01.05.2017