Robot Framework导入库实例不包含已定义的方法

时间:2017-11-25 14:04:59

标签: python object import robotframework class-method

我在Robot Framework编写了一个测试用例,它使用Test Suite关键字在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'.

我放在console__init__中的WebServiceUtil版本会返回:

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

如您所见,类方法列在dir()的输出中,但未显示在self.__dict__的输出中。

我也尝试将ROBOT_LIBRARY_SCOPE更改为GLOBAL,但它没有改变任何内容。

任何想法是什么原因?

编辑1:

我还尝试在类__init__的方法super的开头调用__init__类的WebServiceUtil方法:

super(WebServiceUtil, self).__init__()

相同的结果。

编辑2:

我尝试在没有WebServiceUtil的情况下调用CALL METHOD方法,因为@Bryan用两种方法说:

  1. ${result} = webserviceutil get_report_a
  2. ${result} = get_report_a
  3. 第一个返回No keyword with name 'webserviceutil.get_report_a' found.,第二个返回No keyword with name 'get_report_a' found.

    编辑3:

    有两件事似乎在我脑海中创造了这个问题:

    1. 我覆盖了__init__方法。
    2. 方法不是静态方法。
    3. 之前我曾使用Robot Framework中的类,但没有一个符合上述规格;所以,我想这可能就是问题所在。

2 个答案:

答案 0 :(得分:1)

如果要导入它,则方法将成为关键字。您无需使用ViewDidDisappear()。在您的示例中,当您导入LoginViewController时,您可以访问名为call methodWebServiceUtilget report A的关键字。

get report B

答案 1 :(得分:1)

正如我在编辑问题中提到的,该问题与覆盖的__init__方法有关,并以其他方式使用了我的类变量。我不知道为什么,但删除__init__解决了问题。方法仍然是类方法;这意味着static和class方法在这里处理相同。