Listener
| Введение | |
| message | |
| Suite и Test | |
| Похожие статьи |
Введение
Listener - это скрипт на Python который подключается к тестам с помощью опции --listener и могут мониторить многие события с помощью доступных методов.
Скрипт для плоской структуры вида
robot/ ├── my_test.robot └── MyListener.py
Подключается следующим оригинальным образом.
python -m robot --listener MyListener.py my_test.robot
message
Начнём с метода message().
Рассмотрим проект со следующей структурой.
listener/ ├── demo.robot └── MessageListener.py
Класс должен называться также как и файл
class MessageListener(): ROBOT_LISTENER_API_VERSION = 3 def __init__(self): pass def message(self, message): print(f"message: {message}")
*** Settings *** *** Test Cases *** First Should Be Equal As Strings ${1} 1 Second Should Be Equal 1 2 Third Should Be Equal As Integers ${2} 2
Даже после запуска такого простого теста мы увидим большое количество сообщений
python -m robot --listener MessageListener.py demo.robot
message: Robot Framework 7.2.2 (Python 3.12.10 on win32) message: Arguments: demo.robot message: Settings: ConsoleColors: AUTO ConsoleLinks: AUTO ConsoleMarkers: AUTO ConsoleType: verbose ConsoleTypeDotted: False ConsoleTypeQuiet: False ConsoleWidth: 78 DebugFile: None Doc: None DryRun: False Exclude: [] ExitOnError: False ExitOnFailure: False ExpandKeywords: [] Extension: ('.robot', '.rbt', '.robot.rst') FlattenKeywords: [] Include: [] Language: [] LegacyOutput: False Listeners: ['MessageListener.py'] Log: log.html LogLevel: INFO LogTitle: None MaxAssignLength: 200 MaxErrorLines: 40 Metadata: [] Name: None Output: output.xml OutputDir: C:\robot\listener ParseInclude: [] Parsers: [] PreRebotModifiers: [] PreRunModifiers: [] PythonPath: [] RPA: None Randomize: NONE ReRunFailed: None ReRunFailedSuites: None RemoveKeywords: [] Report: report.html ReportBackground: ('#9e9', '#f66', '#fed84f') ReportTitle: None RunEmptySuite: False SetTag: [] Skip: [] SkipOnFailure: [] SkipTeardownOnExit: False SplitLog: False StatusRC: True StdErr: None StdOut: None SuiteNames: [] SuiteStatLevel: -1 TagDoc: [] TagStatCombine: [] TagStatExclude: [] TagStatInclude: [] TagStatLink: [] TaskNames: [] TestNames: [] TimestampOutputs: False VariableFiles: [] Variables: [] VisibleLogLevel: INFO XUnit: None message: Parsing file 'C:\robot\listener\demo.robot'. message: Imported listener class 'C:\robot\listener\MessageListener.py' from 'C:\robot\listener\MessageListener.py'. message: No debug file message: Initializing namespace for suite 'Demo'. message: message: Imported library class 'robot.libraries.BuiltIn' from 'C:\robot\venv\Lib\site-packages\robot\libraries\BuiltIn.py'. message: In library 'BuiltIn': Adding keyword 'ROBOT_LIBRARY_SCOPE' failed: Not a method or function. message: In library 'BuiltIn': Adding keyword 'ROBOT_LIBRARY_VERSION' failed: Not a method or function. message: Created keyword 'Call Method'. message: Created keyword 'Catenate'. message: Created keyword 'Comment'. message: Created keyword 'Continue For Loop'. message: Created keyword 'Continue For Loop If'. message: Created keyword 'Convert To Binary'. message: Created keyword 'Convert To Boolean'. message: Created keyword 'Convert To Bytes'. message: Created keyword 'Convert To Hex'. message: Created keyword 'Convert To Integer'. message: Created keyword 'Convert To Number'. message: Created keyword 'Convert To Octal'. message: Created keyword 'Convert To String'. message: Created keyword 'Create Dictionary'. message: Created keyword 'Create List'. message: In library 'BuiltIn': Adding keyword 'dry_run_active' failed: Not a method or function. message: Created keyword 'Evaluate'. message: Created keyword 'Exit For Loop'. message: Created keyword 'Exit For Loop If'. message: Created keyword 'Fail'. message: Created keyword 'Fatal Error'. message: Created keyword 'Get Count'. message: Created keyword 'Get Length'. message: Created keyword 'Get Library Instance'. message: Created keyword 'Get Time'. message: Created keyword 'Get Variable Value'. message: Created keyword 'Get Variables'. message: Created keyword 'Import Library'. message: Created keyword 'Import Resource'. message: Created keyword 'Import Variables'. message: Created keyword 'Keyword Should Exist'. message: Created keyword 'Length Should Be'. message: Created keyword 'Log'. message: Created keyword 'Log Many'. message: Created keyword 'Log To Console'. message: Created keyword 'Log Variables'. message: Created keyword 'No Operation'. message: Created keyword 'Pass Execution'. message: Created keyword 'Pass Execution If'. message: Created keyword 'Regexp Escape'. message: Created keyword 'Reload Library'. message: Created keyword 'Remove Tags'. message: Created keyword 'Repeat Keyword'. message: Created keyword 'Replace Variables'. message: Created keyword 'Reset Log Level'. message: Created keyword 'Return From Keyword'. message: Created keyword 'Return From Keyword If'. message: In library 'BuiltIn': Adding keyword 'robot_running' failed: Not a method or function. message: Created keyword 'Run Keyword'. message: Created keyword 'Run Keyword And Continue On Failure'. message: Created keyword 'Run Keyword And Expect Error'. message: Created keyword 'Run Keyword And Ignore Error'. message: Created keyword 'Run Keyword And Return'. message: Created keyword 'Run Keyword And Return If'. message: Created keyword 'Run Keyword And Return Status'. message: Created keyword 'Run Keyword And Warn On Failure'. message: Created keyword 'Run Keyword If'. message: Created keyword 'Run Keyword If All Tests Passed'. message: Created keyword 'Run Keyword If Any Tests Failed'. message: Created keyword 'Run Keyword If Test Failed'. message: Created keyword 'Run Keyword If Test Passed'. message: Created keyword 'Run Keyword If Timeout Occurred'. message: Created keyword 'Run Keyword Unless'. message: Created keyword 'Run Keywords'. message: Created keyword 'Set Global Variable'. message: Created keyword 'Set Library Search Order'. message: Created keyword 'Set Local Variable'. message: Created keyword 'Set Log Level'. message: Created keyword 'Set Suite Documentation'. message: Created keyword 'Set Suite Metadata'. message: Created keyword 'Set Suite Variable'. message: Created keyword 'Set Tags'. message: Created keyword 'Set Task Variable'. message: Created keyword 'Set Test Documentation'. message: Created keyword 'Set Test Message'. message: Created keyword 'Set Test Variable'. message: Created keyword 'Set Variable'. message: Created keyword 'Set Variable If'. message: Created keyword 'Should Be Empty'. message: Created keyword 'Should Be Equal'. message: Created keyword 'Should Be Equal As Integers'. message: Created keyword 'Should Be Equal As Numbers'. message: Created keyword 'Should Be Equal As Strings'. message: Created keyword 'Should Be True'. message: Created keyword 'Should Contain'. message: Created keyword 'Should Contain Any'. message: Created keyword 'Should Contain X Times'. message: Created keyword 'Should End With'. message: Created keyword 'Should Match'. message: Created keyword 'Should Match Regexp'. message: Created keyword 'Should Not Be Empty'. message: Created keyword 'Should Not Be Equal'. message: Created keyword 'Should Not Be Equal As Integers'. message: Created keyword 'Should Not Be Equal As Numbers'. message: Created keyword 'Should Not Be Equal As Strings'. message: Created keyword 'Should Not Be True'. message: Created keyword 'Should Not Contain'. message: Created keyword 'Should Not Contain Any'. message: Created keyword 'Should Not End With'. message: Created keyword 'Should Not Match'. message: Created keyword 'Should Not Match Regexp'. message: Created keyword 'Should Not Start With'. message: Created keyword 'Should Start With'. message: Created keyword 'Skip'. message: Created keyword 'Skip If'. message: Created keyword 'Sleep'. message: Created keyword 'Variable Should Exist'. message: Created keyword 'Variable Should Not Exist'. message: Created keyword 'Wait Until Keyword Succeeds'. message: Imported library 'BuiltIn' with arguments [ ] (version 7.2.2, class type, GLOBAL scope, 107 keywords). message: message: Imported library module 'robot.libraries.Easter' from 'C:\robot\venv\Lib\site-packages\robot\libraries\Easter.py'. message: In library 'Easter': Adding keyword 'logger' failed: Not a method or function. message: Created keyword 'None Shall Pass'. message: Imported library 'Easter' with arguments [ ] (version <unknown>, module type, GLOBAL scope, 1 keywords). ============================================================================== Demo ============================================================================== First | PASS | ------------------------------------------------------------------------------ Second | FAIL | 1 != 2 ------------------------------------------------------------------------------ Third | PASS | ------------------------------------------------------------------------------ Demo | FAIL | 3 tests, 2 passed, 1 failed ============================================================================== Output: C:\robot\listener\output.xml message: Tests execution ended. Statistics: 3 tests, 2 passed, 1 failed Log: C:\robot\listener\log.html Report: C:\robot\listener\report.html
Две самые большие группы сообщений это Settings и уведомления о созданных ключевых словах.
Suite и Test
Создадим новый Listener - SuiteAndTestListener.py и подключим его к тому же тесту
class SuiteAndTestListener(): ROBOT_LISTENER_API_VERSION = 3 def __init__(self): pass def start_suite(self, suite, result): print(f"Suite '{suite.name}' starting.") print(f"Suite '{suite.name}' result is: {result}.") print(f"Suite '{suite.name}' setup is: {suite.setup}.") print(f"Suite '{suite.name}' teardown is: {suite.teardown}.") print(f"Suite '{suite.name}' tests are: {suite.tests}.") def start_test(self, test, result): print("\n\n") print(f"Start test '{test.name}'") print(f"Test '{test.name}' tags are: {test.tags}.") print(f"Test '{test.name}' setup is: {test.setup}.") print(f"Test '{test.name}' teardown is: {test.teardown}.") print(f"Test '{test.name}' template is: {test.template}.") def end_test(self, test, result): print(f"End of '{test.name}' test") print(f"Test '{test.name}' result is: {result.status}.") print(f"Test '{test.name}' elapsed time is: {result.elapsed_time.total_seconds()}.") def end_suite(self, suite, result): print(f"End of '{suite.name}' suite") print(f"Suite '{suite.name}' result is: {result}.")
python -m robot --listener SuiteAndTestListener.py demo.robot
============================================================================== Demo ============================================================================== Suite 'Demo' starting. Suite 'Demo' result is: robot.result.TestSuite(name='Demo'). Suite 'Demo' setup is: None. Suite 'Demo' teardown is: None. Suite 'Demo' tests are: [robot.running.TestCase(name='First'), robot.running.TestCase(name='Second'), robot.running.TestCase(name='Third')]. First Start test 'First' Test 'First' tags are: []. Test 'First' setup is: None. Test 'First' teardown is: None. Test 'First' template is: None. .End of 'First' test Test 'First' result is: PASS. Test 'First' elapsed time is: 0.00098. First | PASS | ------------------------------------------------------------------------------ Second Start test 'Second' Test 'Second' tags are: []. Test 'Second' setup is: None. Test 'Second' teardown is: None. Test 'Second' template is: None. FEnd of 'Second' test Test 'Second' result is: FAIL. Test 'Second' elapsed time is: 0.000977. Second | FAIL | 1 != 2 ------------------------------------------------------------------------------ Third Start test 'Third' Test 'Third' tags are: []. Test 'Third' setup is: None. Test 'Third' teardown is: None. Test 'Third' template is: None. .End of 'Third' test Test 'Third' result is: PASS. Test 'Third' elapsed time is: 0.000976. Third | PASS | ------------------------------------------------------------------------------ End of 'Demo' suite Suite 'Demo' result is: robot.result.TestSuite(name='Demo'). Demo | FAIL | 3 tests, 2 passed, 1 failed ============================================================================== Output: C:\robot\listener\output.xml Log: C:\robot\listener\log.html Report: C:\robot\listener\report.html
Автор статьи: Андрей Олегович
| Listener |