Robot Framework导入库实例不包含定义的方法
Robot Framework import library instance does not contain defined methods
我在 Robot Framework
中编写了一个测试用例,它使用 Builtin.Import_Library
关键字在 Test Suite
中间创建了一个 class 的实例,然后使用 Builtin.Import_Library
调用它的方法Builtin.Call_Method
:
*** Settings ***
Resource MyKeywords.robot
Test Suite Initiate My Test
*** Keywords ***
Initiate My Test
${ip} = SET VARIABLE localhost
${port} = SET VARIABLE 2020
IMPORT LIBRARY src/Interface/Utility/WebServiceUtil.py
... ws_ip=${ip} ws_port=${port} WITH NAME webserviceutil
*** Test Cases ***
Test Report A
${result} = CALL METHOD webserviceutil get_report_a
LOG Result: ${result} console=${TRUE}
文件 src/Interface/Utility/WebServiceUtil.py
包含:
# -*- encoding: utf-8 -*-
import requests
import json
from robot.api import logger
class WebServiceUtil(object):
ROBOT_LIBRARY_SCOPE = 'TEST SUITE'
def __init__(self, ws_ip, ws_port):
self.reporter_a = ReportA(ip=ws_ip, port=ws_port)
self.reporter_b = ReportB(ip=ws_ip, port=ws_port)
self.reporter_c = ReportC(ip=ws_ip, port=ws_port)
logger.console('>> ZiZi >> webserviceutil has been initialized successfully!')
logger.console('>> ZiZi >> self.__dict__: ' + str(self.__dict__))
logger.console('>> ZiZi >> dir(self): ' + str(dir(self)))
def get_report_a(self):
return self.reporter_a.get_report()
def get_report_b(self):
return self.reporter_b.get_report()
def get_report_c(self):
return self.reporter_c.get_report()
class Report(object):
def get_report():
return 'This is abstract class!'
class ReportA(Report):
def get_report():
return 'This is class A!'
class ReportB(Report):
def get_report():
return 'This is class B!'
class ReportC(Report):
def get_report():
return 'This is class C!'
我在测试执行中遇到这个错误:
Object 'webserviceutil' does not have method 'get_sponsor_report'.
我在class__init__
WebServiceUtil
returns:
的console
打印
>> ZiZi >> webserviceutil has been initialized successfully!
>> ZiZi >> self.__dict__: {'reporter_a': <WebServiceUtil.ReportA object at 0x7fc18d96a8d0>, 'reporter_b': <WebServiceUtil.ReportB object at 0x7fc18d96abd0>, 'reporter_c': <WebServiceUtil.ReportC object at 0x7fc18d96a910>}
>> ZiZi >> dir(self): ['ROBOT_LIBRARY_SCOPE', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'get_report_a', 'get_report_b', 'get_report_c', 'reporter_a', 'reporter_b', 'reporter_c']
如您所见,class 方法列在 dir()
的输出中,但未显示在 self.__dict__
的输出中。
我也尝试将 ROBOT_LIBRARY_SCOPE
更改为 GLOBAL
,但没有任何改变。
知道是什么原因吗?
编辑 1:
我也试过在class的方法__init__
的开头调用super
class的__init__
方法WebServiceUtil
:
super(WebServiceUtil, self).__init__()
相同的结果。
编辑 2:
我尝试在没有 CALL METHOD
的情况下调用 WebServiceUtil
方法,正如@Bryan 用两种方法所说:
${result} = webserviceutil get_report_a
${result} = get_report_a
第一个返回 No keyword with name 'webserviceutil.get_report_a' found.
,第二个返回 No keyword with name 'get_report_a' found.
。
编辑 3:
在我看来,有两件事似乎造成了这个问题:
- 我已经覆盖了
__init__
方法。
- 方法不是静态方法。
我以前在 Robot Framework
中使用过 classes,其中 none 有以上规格;所以,我想也许这些是这里的问题。
如果您正在导入它,方法将成为关键字。您不需要使用 call method
。在您的示例中,当您导入 WebServiceUtil
时,您可以访问名为 get report A
、get report B
和 get report C
.
的关键字
*** Test Cases ***
Test Report A
${result} = get report A
LOG Result: ${result} console=${TRUE}
正如我在问题编辑中提到的,问题与覆盖的 __init__
方法有关,并以其他方式使用了我的 class 变量。我不知道为什么,但删除 __init__
解决了问题。方法仍然是 class 方法;这意味着静态方法和 class 方法在此处的处理方式相同。
我在 Robot Framework
中编写了一个测试用例,它使用 Builtin.Import_Library
关键字在 Test Suite
中间创建了一个 class 的实例,然后使用 Builtin.Import_Library
调用它的方法Builtin.Call_Method
:
*** Settings ***
Resource MyKeywords.robot
Test Suite Initiate My Test
*** Keywords ***
Initiate My Test
${ip} = SET VARIABLE localhost
${port} = SET VARIABLE 2020
IMPORT LIBRARY src/Interface/Utility/WebServiceUtil.py
... ws_ip=${ip} ws_port=${port} WITH NAME webserviceutil
*** Test Cases ***
Test Report A
${result} = CALL METHOD webserviceutil get_report_a
LOG Result: ${result} console=${TRUE}
文件 src/Interface/Utility/WebServiceUtil.py
包含:
# -*- encoding: utf-8 -*-
import requests
import json
from robot.api import logger
class WebServiceUtil(object):
ROBOT_LIBRARY_SCOPE = 'TEST SUITE'
def __init__(self, ws_ip, ws_port):
self.reporter_a = ReportA(ip=ws_ip, port=ws_port)
self.reporter_b = ReportB(ip=ws_ip, port=ws_port)
self.reporter_c = ReportC(ip=ws_ip, port=ws_port)
logger.console('>> ZiZi >> webserviceutil has been initialized successfully!')
logger.console('>> ZiZi >> self.__dict__: ' + str(self.__dict__))
logger.console('>> ZiZi >> dir(self): ' + str(dir(self)))
def get_report_a(self):
return self.reporter_a.get_report()
def get_report_b(self):
return self.reporter_b.get_report()
def get_report_c(self):
return self.reporter_c.get_report()
class Report(object):
def get_report():
return 'This is abstract class!'
class ReportA(Report):
def get_report():
return 'This is class A!'
class ReportB(Report):
def get_report():
return 'This is class B!'
class ReportC(Report):
def get_report():
return 'This is class C!'
我在测试执行中遇到这个错误:
Object 'webserviceutil' does not have method 'get_sponsor_report'.
我在class__init__
WebServiceUtil
returns:
console
打印
>> ZiZi >> webserviceutil has been initialized successfully!
>> ZiZi >> self.__dict__: {'reporter_a': <WebServiceUtil.ReportA object at 0x7fc18d96a8d0>, 'reporter_b': <WebServiceUtil.ReportB object at 0x7fc18d96abd0>, 'reporter_c': <WebServiceUtil.ReportC object at 0x7fc18d96a910>}
>> ZiZi >> dir(self): ['ROBOT_LIBRARY_SCOPE', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'get_report_a', 'get_report_b', 'get_report_c', 'reporter_a', 'reporter_b', 'reporter_c']
如您所见,class 方法列在 dir()
的输出中,但未显示在 self.__dict__
的输出中。
我也尝试将 ROBOT_LIBRARY_SCOPE
更改为 GLOBAL
,但没有任何改变。
知道是什么原因吗?
编辑 1:
我也试过在class的方法__init__
的开头调用super
class的__init__
方法WebServiceUtil
:
super(WebServiceUtil, self).__init__()
相同的结果。
编辑 2:
我尝试在没有 CALL METHOD
的情况下调用 WebServiceUtil
方法,正如@Bryan 用两种方法所说:
${result} = webserviceutil get_report_a
${result} = get_report_a
第一个返回 No keyword with name 'webserviceutil.get_report_a' found.
,第二个返回 No keyword with name 'get_report_a' found.
。
编辑 3:
在我看来,有两件事似乎造成了这个问题:
- 我已经覆盖了
__init__
方法。 - 方法不是静态方法。
我以前在 Robot Framework
中使用过 classes,其中 none 有以上规格;所以,我想也许这些是这里的问题。
如果您正在导入它,方法将成为关键字。您不需要使用 call method
。在您的示例中,当您导入 WebServiceUtil
时,您可以访问名为 get report A
、get report B
和 get report C
.
*** Test Cases ***
Test Report A
${result} = get report A
LOG Result: ${result} console=${TRUE}
正如我在问题编辑中提到的,问题与覆盖的 __init__
方法有关,并以其他方式使用了我的 class 变量。我不知道为什么,但删除 __init__
解决了问题。方法仍然是 class 方法;这意味着静态方法和 class 方法在此处的处理方式相同。