Package: pytest-fluentbit
pytest-fluentA Python package in order to extend pytest by fluentd loggingDescriptionPytest is one of the most powerful testing suites with a lot of functionality and many plugins. Fluentd is a well-established log collector which is used in many modern web architectures. So, why not putting both worlds together in order to gain real-time log access to your distributed test runs.pytest-fluent enables you to forward your test data immediately to your prefered log-sink from any node spread around your infrastructure. The streamed data are available for each pytest stage and formatted in JSON.Each pytest session gets an unique identifier (UID) assigned as well as each executed test case. With these UIDs, you can filter easily for sessions and testcase data entries, for instance in your favorite database.InstallationThe package is available at pypi.org and can be installed by typingpipinstallpytest-fluentbitUsagepytest-fluent-logging forwards meta data from pytest to Fluentd for further processing. The meta data areunique session IDunique test IDstatus of the session respectively test casetest case nametest resultsrecord_propertyentriescustom testcase informationcustom session informationFurthermore, the Python logging instance can be extended in order to forward test case runtime logging.fromloggingimportgetLoggerdeftest_my_runtime_log():value=1getLogger().info(f"Setting value to{value}")assertvalue==1orfromloggingimportgetLoggerdeftest_my_runtime_log():value=1getLogger('fluent').info(f"Setting value to{value}")assertvalue==1FixturesIn order to create your own logger, request the following fixturedeftest_my_runtime_log(get_logger):logger=get_logger('my.Logger')value=1logger.info(f"Setting value to{value}")assertvalue==1If you want to get the current UIDs, use the following fixturesdeftest_unique_identifier(session_uid,test_uid):logger=get_logger('fluent')logger.info(f"Session ID:{session_uid}")logger.info(f"Test ID:{test_uid}")value=1assertvalue==1CallbacksIf you want to add custom data to the datasets of thepytest_sessionstartandpytest_runtest_logstartstages, decorate your callback functions with the following decorators.frompytest_fluentbitimport(additional_session_information_callback,additional_test_information_callback)@additional_session_information_callbackdefprovide_more_session_information()->dict:return{"more":"session information"}@additional_test_information_callbackdefprovide_more_test_information()->dict:return{"more":"test information"}pytest CLI extensionsThe pytest CLI can be called with the following arguments in order to configure fluent-logging.argumentdescriptiondefault--session-uuidUse a custom externally created UUID, e.g. link a CI job with the pytest session.--fluentd-hostFluentd host address. If not provided, a local Fluentd instance will be called.--fluentd-portFluent host port24224--fluentd-tagSet a custom Fluentd tag'test'--fluentd-labelSet a custom Fluentd label'pytest'--extend-loggingExtend the Python logging with a Fluent handlerFalse--add-docstringsAdd test docstrings to testcase call messagesIni Configuration SupportDefault values of the CLI arguments for a project could also be defined in one of the following ini configuration files:pytest.ini: Arguments are defined under pytest section in the file. This file takes precedence over all other configuration files even if empty.[pytest]addopts=--session-uuid="ac2f7600-a079-46cf-a7e0-6408b166364c"--fluentd-port=24224--fluentd-host=localhost--fluentd-tag='dummytest'--fluentd-label='pytest'--extend-loggingpyproject.toml: are considered for configuration when they contain a tool.pytest.ini_options section is available[tool.pytest.ini_options]addopts="--fluentd-port=24224 --fluentd-host=localhost --fluentd-tag='test' --fluentd-label='pytest' --extend-logging"tox.ini: can also be used to hold pytest configuration if they have a [pytest] section.[pytest]addopts=--fluentd-port=24224--fluentd-host=localhost--fluentd-tag='test'--fluentd-label='pytest'If the same option is specified in both CLI and ini file, then CLI option would have higher priority and override the ini file values.What data are sent?pytest-fluent sends any information, e.g. stage information or logging from a test case, as a single chunk. For instance, the data collection fromtest_addoptions.pytest looks as following[{"status":"start","stage":"session","sessionId":"d8f01de3-8416-4801-9406-0ea3d5cfe3c0"},{"status":"start","stage":"testcase","sessionId":"d8f01de3-8416-4801-9406-0ea3d5cfe3c0","testId":"6b444275-4450-4eff-b5d9-8355f0f99ab0","name":"test_fluentd_logged_parameters.py::test_base"},{"type":"logging","host":"myComputer","where":"test_fluentd_logged_parameters.test_base","level":"INFO","stack_trace":"None","message":"Logged from test_base","sessionId":"d8f01de3-8416-4801-9406-0ea3d5cfe3c0","testId":"6b444275-4450-4eff-b5d9-8355f0f99ab0","stage":"testcase"},{"type":"logging","host":"myComputer","where":"test_fluentd_logged_parameters.test_base","level":"INFO","stack_trace":"None","message":"Logged from test_base","sessionId":"d8f01de3-8416-4801-9406-0ea3d5cfe3c0","testId":"6b444275-4450-4eff-b5d9-8355f0f99ab0","stage":"testcase"},{"name":"test_fluentd_logged_parameters.py::test_base","outcome":"passed","duration":0.0013457999999999526,"markers":{"test_base":1,"test_fluentd_logged_parameters.py":1,"test_fluentd_logged_parameters0":1},"stage":"testcase","when":"call","sessionId":"d8f01de3-8416-4801-9406-0ea3d5cfe3c0","testId":"6b444275-4450-4eff-b5d9-8355f0f99ab0"},{"status":"finish","stage":"testcase","sessionId":"d8f01de3-8416-4801-9406-0ea3d5cfe3c0","testId":"6b444275-4450-4eff-b5d9-8355f0f99ab0","name":"test_fluentd_logged_parameters.py::test_base"},{"status":"finish","duration":0.00297708511352539,"stage":"session","sessionId":"d8f01de3-8416-4801-9406-0ea3d5cfe3c0"}]whereat each object in the array is sent independently via Fluentd.ChangelogThe changelog.ContributingWe welcome any contributions, enhancements, and bug-fixes. Open anissueonGithubandsubmit a pull request.