Robotframework 测试用例标记为失败后,无法查看设置测试消息日志值

Robotframework 测试用例标记为失败后,无法查看设置测试消息日志值,robotframework,Robotframework,我有以下代码: *** Settings *** Library OperatingSystem Library Process Library String *** Variables *** @{MyList}= item items items2 ${LogStr1} *HTML* *** Test Cases *** #Start Test# [xxxxx] My tests FOR ${item} IN @{MyList}

我有以下代码:

*** Settings ***
Library     OperatingSystem
Library     Process
Library     String


*** Variables ***
@{MyList}=   item   items   items2
${LogStr1}   *HTML*

*** Test Cases *** 
#Start Test#
[xxxxx] My tests
    FOR  ${item}  IN   @{MyList}
        General                test.out         testProfile          ${item}
        [Template]    Run Test                                                                                                                                                         
        [Tags]    TestTags
    END

*** Keywords *** 
Run Test
    [Documentation]    Run the test
    [Arguments]       ${type}     ${profile}     ${file}    ${test}
            When suite config is updated 
            And updated the config in directory ${test}
            Then publish test status

suite config is updated
           [Documentation]    Get the variables list
            Log to Console     "Updating get suite config file"


updated the config in directory ${test}
    [Documentation]    Get the variables list 
         Run keyword if      "${test}" == "items"    Stop Test      "This is stop called"

publish test status 
    [Documentation]    Create and check if any issue found
            ${LogStr}=     Catenate     Test Passed : Log created:     <a href="Hello.txt">Hello</a>
            Log to Console       ${LogStr}
            ${LogStr1}=     Catenate         ${LogStr1}              ${LogStr}\n
            Set Test Variable    ${LogStr1}
            Set Test Message     ${LogStr1}

Stop Test  
    [Documentation]    Stop Execution 
    [Arguments]       ${FIALUREMSG}        
    Log To Console    ${FIALUREMSG}
    ${LogStr1}=     Catenate         ${LogStr1}              ${FIALUREMSG} 
      Fail        ${LogStr1}
  
在提到的关键字中,有两个测试用例通过了套件测试,但报告指出:

现在,如果我使第二个测试用例失败,我将得到以下测试消息日志:

Run keyword if      "${test}" == "items"    Stop Test      "This is stop called"
在提到的关键字中,有两个测试用例通过了套件测试,但报告指出:

同样如果

 Run keyword if      "${test}" == "items2"    Stop Test      "This is stop called"

以此类推——因此,当测试用例被标记为失败时,“设置测试消息”日志值似乎在报告消息中被忽略。请注意,下面是我运行代码将第一个测试用例标记为失败时的log.html内容:

Run keyword if      "${test}" == "item"    Stop Test      "This is stop called"


因此,我的问题是,如果我想让report.html文件显示所有失败和通过的测试用例的日志,我如何实现它?

如果您检查关键字的文档,它会说任何失败都会覆盖消息,但您可以选择从拆卸中覆盖失败消息

在test teardown中,此关键字可以更改可能的失败消息, 但在其他情况下,故障会覆盖由该关键字设置的消息。注意 在拆卸过程中,消息作为内置变量可用
${TEST MESSAGE}

因此,您可以做的不是调用Set Test Message,而是将消息保存到一个测试变量中。然后,您应该添加一个拆卸,在该拆卸中调用Set Test消息,并将测试变量与
${Test Message}
连接起来。例如:

*** Test Cases ***
Test
    [template]    Template
    [setup]    Set Test Variable    ${MSG}    ${EMPTY}    # create empty test variable to store messages
    1
    3
    2
    5
    6
    4
    6
    [teardown]    Set Test Message    ${MSG}\n${TEST MESSAGE}    # concatenate failure messages to normal test messages


*** Keywords ***
Template
    [arguments]    ${number}
    No Operation
    Run Keyword If    ${number} == 2    Fail      fail message ${number}
    Run Keyword If    ${number} == 4    Fail      fail message ${number}
    Set Test Variable    ${MSG}    ${MSG}\nMy test message ${number}    # concatenate next test message
*** Settings ***
Test Template     Template

*** Test Cases ***
Test1    1
Test2    2
Test3    3
Test4    4
Test5    5
Test6    6


*** Keywords ***
Template
    [arguments]    ${number}
    No Operation
    Run Keyword If    ${number} == 2    Fail      fail message ${number}
    Run Keyword If    ${number} == 4    Fail      fail message ${number}
    Set Test Message    My test message ${number}
此示例生成以下报告:

使用这种方法,您可以在特定的robot套件中只有模板测试,因为测试用例表中列出的所有测试都将调用模板



另一个完全不同的解决方案是去掉
FOR
循环,因为
@{MyList}
中的元素是静态的。如果将模板移动到中,然后手动列出所有迭代,则可以将它们中的每一个分离到一个独立的测试用例中。这样,一次迭代中的失败不会影响另一次迭代中的测试消息集。例如:

*** Test Cases ***
Test
    [template]    Template
    [setup]    Set Test Variable    ${MSG}    ${EMPTY}    # create empty test variable to store messages
    1
    3
    2
    5
    6
    4
    6
    [teardown]    Set Test Message    ${MSG}\n${TEST MESSAGE}    # concatenate failure messages to normal test messages


*** Keywords ***
Template
    [arguments]    ${number}
    No Operation
    Run Keyword If    ${number} == 2    Fail      fail message ${number}
    Run Keyword If    ${number} == 4    Fail      fail message ${number}
    Set Test Variable    ${MSG}    ${MSG}\nMy test message ${number}    # concatenate next test message
*** Settings ***
Test Template     Template

*** Test Cases ***
Test1    1
Test2    2
Test3    3
Test4    4
Test5    5
Test6    6


*** Keywords ***
Template
    [arguments]    ${number}
    No Operation
    Run Keyword If    ${number} == 2    Fail      fail message ${number}
    Run Keyword If    ${number} == 4    Fail      fail message ${number}
    Set Test Message    My test message ${number}
这将产生以下报告:


如果您检查关键字的文档,它会说任何故障都会覆盖消息,但您可以选择从拆卸中覆盖故障消息

在test teardown中,此关键字可以更改可能的失败消息, 但在其他情况下,故障会覆盖由该关键字设置的消息。注意 在拆卸过程中,消息作为内置变量可用
${TEST MESSAGE}

因此,您可以做的不是调用Set Test Message,而是将消息保存到一个测试变量中。然后,您应该添加一个拆卸,在该拆卸中调用Set Test消息,并将测试变量与
${Test Message}
连接起来。例如:

*** Test Cases ***
Test
    [template]    Template
    [setup]    Set Test Variable    ${MSG}    ${EMPTY}    # create empty test variable to store messages
    1
    3
    2
    5
    6
    4
    6
    [teardown]    Set Test Message    ${MSG}\n${TEST MESSAGE}    # concatenate failure messages to normal test messages


*** Keywords ***
Template
    [arguments]    ${number}
    No Operation
    Run Keyword If    ${number} == 2    Fail      fail message ${number}
    Run Keyword If    ${number} == 4    Fail      fail message ${number}
    Set Test Variable    ${MSG}    ${MSG}\nMy test message ${number}    # concatenate next test message
*** Settings ***
Test Template     Template

*** Test Cases ***
Test1    1
Test2    2
Test3    3
Test4    4
Test5    5
Test6    6


*** Keywords ***
Template
    [arguments]    ${number}
    No Operation
    Run Keyword If    ${number} == 2    Fail      fail message ${number}
    Run Keyword If    ${number} == 4    Fail      fail message ${number}
    Set Test Message    My test message ${number}
此示例生成以下报告:

使用这种方法,您可以在特定的robot套件中只有模板测试,因为测试用例表中列出的所有测试都将调用模板



另一个完全不同的解决方案是去掉
FOR
循环,因为
@{MyList}
中的元素是静态的。如果将模板移动到中,然后手动列出所有迭代,则可以将它们中的每一个分离到一个独立的测试用例中。这样,一次迭代中的失败不会影响另一次迭代中的测试消息集。例如:

*** Test Cases ***
Test
    [template]    Template
    [setup]    Set Test Variable    ${MSG}    ${EMPTY}    # create empty test variable to store messages
    1
    3
    2
    5
    6
    4
    6
    [teardown]    Set Test Message    ${MSG}\n${TEST MESSAGE}    # concatenate failure messages to normal test messages


*** Keywords ***
Template
    [arguments]    ${number}
    No Operation
    Run Keyword If    ${number} == 2    Fail      fail message ${number}
    Run Keyword If    ${number} == 4    Fail      fail message ${number}
    Set Test Variable    ${MSG}    ${MSG}\nMy test message ${number}    # concatenate next test message
*** Settings ***
Test Template     Template

*** Test Cases ***
Test1    1
Test2    2
Test3    3
Test4    4
Test5    5
Test6    6


*** Keywords ***
Template
    [arguments]    ${number}
    No Operation
    Run Keyword If    ${number} == 2    Fail      fail message ${number}
    Run Keyword If    ${number} == 4    Fail      fail message ${number}
    Set Test Message    My test message ${number}
这将产生以下报告:


除了我的另一个答案之外,您还有第三个选择,但这是一个更高级的解决方案,所以我决定将其作为单独的答案发布

您可以用Python编写一个小的测试库,它也可以作为一个脚本。在这个侦听器库中,您需要三个函数,其中两个是关键字,一个是侦听器函数

  • 第一个功能是
    \u log\u message
    ,如中所述。如果发生任何日志记录,框架将调用此函数。因此,当测试失败时,该关键字将接收失败的日志条目,该条目可保存以供以后使用。此功能(以
    开头)
    在robot套件中不能作为关键字使用

    def\u日志消息(self,message):
    如果消息['level']='FAIL':
    self.test_message=f“{self.test_message}\n{message['message']}”#连接失败消息
    
  • 第二个函数
    add_test_message
    将替换代码中的Set test message关键字。其目的类似,即附加要设置为测试消息的消息。这可以作为关键字从robot套件中调用

    def添加测试消息(self,message):
    self.test_message=f“{self.test_message}\n{message}”连接正常测试消息
    
  • 最后一个功能
    set_final_test_message
    将为您设置实际的测试消息。必须在测试拆卸结束时调用此关键字,以确保没有其他故障会覆盖测试消息。它只是在内部调用Set Test Message关键字,并设置由前两个函数创建的字符串。这可以作为关键字从robot套件中调用

    def set_final_test_消息(self):
    """
    在测试用例拆卸结束时调用此关键字。
    此关键字只能在测试拆卸中使用。
    """
    BuiltIn()。_get_test_in_teardown('Set Final test Message')#检查我们是否在测试拆卸中,如果没有,则失败。
    内置().set_test_消息(self.test_消息)#内部调用set test消息
    
  • 由于库的目的是设置测试消息,因此应该是
    测试用例
    。这意味着将在每个测试用例之前创建一个新的库对象,有效地重置以前测试设置的任何消息

    以下是库(TestMessageLibrary.py)的全部代码:

    来自robot.libraries.Bu的