Search code examples
robotframeworkrobotframework-ide

robot framework: test case cannot load keyword in resource file that import in the test suite's parent test suite folder


enter image description here

Hi, I am using robot framework to automate testing of a website, and the image above is the structure of test in the RIDE:

  • Test: a test suite folder, and I import resource file here, which is in the "init.robot" under the folder
  • Sub1: a sub test suite, import nothing
  • test: a test case

My problem is: in the test case "test", robot cannot recognize the keyword that imported in the "Test" test suite folder, because there will be more sub test suites, like sub2, sub3, how can I import resource in one place? I don't want to import the resource file in every test suite, is there a way to do that?


Solution

  • You can chain an imports. Below is an example of such a chain and reuse. In this example we have a single resources.robot that imports all of the different sub*.robot files. This is the only file that imports these.

    Then there are two testcases*.robot files that proceed to import resources.robot and are able to access the content of the sub*.robot keywords.

    resources.robot

    *** Settings ***
    Resource    ../resources/sub1.robot
    Resource    ../resources/sub2.robot
    Resource    ../resources/sub1.robot
    

    testcases1.robot

    *** Settings ***
    Resource    ../resources/resources.robot
    
    *** Test Cases ***
    TC
       No Operation
    

    testcases2.robot

    *** Settings ***
    Resource    ../resources/resources.robot
    
    *** Test Cases ***
    TC
       No Operation
    

    As discussed in the comments, that any keyword imported in the __init__.robot file is not available beyond that file. This is clearly described in the Robot Framework User Guide section on Initialization files.

    That said, if the effort of including the master resource file in each suite file undesirable, then an alternative approach is to load the resource file using a listener at the start of each Suite. The documentation on Listeners can be found here: Docs

    A new example:

    AddResourceListener.py

    from robot.libraries.BuiltIn import BuiltIn
    
    class AddResourceListener(object):
        ROBOT_LISTENER_API_VERSION = 2
    
        def __init__(self):
            pass
    
        def start_suite(self, name, attributes):
            BuiltIn().import_resource('${EXECDIR}/resource.robot')
    

    resource.robot

    *** Keywords ***
    Resource Keyword
        Log    "Keyword Executed from Resource File"
    

    TestCase.robot

    *** Test Cases ***
    TC
        Resource Keyword
    

    Then run your regular robot command with the additional argument --listener AddResourceListener.py and you'll be able to use the keyword regardless if it's imported or not.