2017-11-25 228 views
1

我在Robot Framework它可以創建Builtin.Import_Library關鍵字在Test Suite中間的類的實例編寫測試用例的方法,然後使用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打印,我已經把在課堂WebServiceUtil回報__init__

>> 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:

我也打過電話super__init__方法WebServiceUtil類的方法__init__的開頭:

super(WebServiceUtil, self).__init__() 

相同的結果。

編輯2:

我打過電話WebServiceUtil方法不CALL METHOD爲@Bryan有兩種方法說:

  1. ${result} = webserviceutil get_report_a
  2. ${result} = get_report_a

第一個返回No keyword with name 'webserviceutil.get_report_a' found.一個第二個返回No keyword with name 'get_report_a' found.

編輯3:

有跡象表明,似乎在我的腦海要創建這個問題兩件事情:

  1. 我已經覆蓋__init__方法。
  2. 方法不是靜態方法。

我以前使用過Robot Framework中的類,但都沒有上述規格;所以,我想也許這些是在這裏提出問題。

回答

0

正如我在這個問題編輯提到的問題涉及到覆蓋__init__方法和使用我的類變量在其他方面。我不知道爲什麼,但刪除__init__解決了這個問題。方法仍然是類方法;這意味着靜態方法和類方法在這裏都是相同的。

1

如果您正在導入它,方法將成爲關鍵字。您不需要使用call method。在您的示例中,當您導入WebServiceUtil時,您可以訪問名爲get report Aget report Bget report C的關鍵字。

*** Test Cases *** 
Test Report A 
    ${result} =  get report A 
    LOG Result: ${result}  console=${TRUE} 
+1

附加說明:正如在導入庫的文檔中所述,這個KW應該用於動態加載庫,以防在機器人執行之前libs不可用。在其他情況下,最好使用庫在*** Settings ***部分顯式導入庫。由IMPORT LIBRARY導入的庫在整個套件文件中可見,就像從設置導入 – jozefow

+0

@jozefow,類在測試執行前存在,但它的參數應該從配置文件中提取;它們不是我可以明確使用的常量。 –

+0

@Bryan,我用兩種方式得到報告A;沒有希望。請查看我的編輯。 –