#python #robotframework
Вопрос:
Я получаю ошибку «Ошибка типа: Подписанные генераторы не могут использоваться с проверками классов и экземпляров» при попытке использовать isinstance()
функцию только при использовании через RobotFramework.
Пожалуйста, дайте мне знать, не делаю ли я что-то не так.
Создана следующая структура каталогов,
|
|- lib/
| |- mylib.py
|- tests/
|- mytest.robot
Вот содержание mylib.py
from typing import Union, List
class mylib:
@staticmethod
def fun(x: Union[str, List[str]]):
if isinstance(x, str):
x = [x]
print(x)
Содержание mytest.robot
*** Settings ***
Library ../lib/mylib.py
*** Test Cases ***
My Test
${y}= Create List abc xyz
mylib.fun x=${y}
Вот результат выполнения,
D:tmprobot>python -m robot --loglevel DEBUG tests
==============================================================================
Tests
==============================================================================
Tests.Mytest
==============================================================================
My Test | FAIL |
TypeError: Subscripted generics cannot be used with class and instance checks
------------------------------------------------------------------------------
Tests.Mytest | FAIL |
1 test, 0 passed, 1 failed
==============================================================================
Tests | FAIL |
1 test, 0 passed, 1 failed
==============================================================================
Output: D:tmprobotoutput.xml
Log: D:tmprobotlog.html
Report: D:tmprobotreport.html
В log.html показывает следующую ошибку,
Если я запускаю тот же код через интерпретатор Python (используя Python 3.8.5), он работает!
>>> from typing import Union, List
>>>
>>> class mylib:
... @staticmethod
... def fun(x: Union[str, List[str]]):
... if isinstance(x, str):
... x = [x]
... print(x)
...
>>> mylib.fun('abc')
['abc']
>>> mylib.fun(['abc', 'xyz'])
['abc', 'xyz']
>>>
Используя приведенную ниже версию RobotFramework.
C:Usersamit_tendulkar>python -m robot --version
Robot Framework 4.0.1 (Python 3.8.5 on win32)
Что может пойти не так в работе с роботами?
ОБНОВЛЕНИЕ: Если я изменю определение функции на приведенное ниже ( List
вместо List[str]
), тест начнет проходить,
class mylib:
@staticmethod
def fun(x: Union[str, List]):
if isinstance(x, str):
x = [x]
print(x)
Ответ №1:
Похоже, проблема была в более старой версии RobotFramework (4.0.1).
Я обновил свой каркас робота до версии 4.2, и приведенный выше тестовый пример начал работать без каких-либо проблем.
PS D:personalrobot_experiment> py -m robot --version
Robot Framework 4.1.2 (Python 3.8.10 on win32)