Package: pytest-elk-reporter
pytest-elk-reporterA plugin to send pytest test results toELKstack, with extra context dataFeaturesReporting into Elasticsearch each test result, as the test finishAutomatically append context data to each test:git information such asbranchorlast commitand moreall of CI env variablesJenkinsTravisCircle CIGithub Actionsusername if availableReport a test summery to Elastic for each session with all the context datacan append any user data into the context sent to elasticRequirementshavingpytesttests writtenInstallationYou can install "pytest-elk-reporter" viapipfromPyPIpipinstallpytest-elk-reporterElasticSearch configurationWe need this auto_create_index enable for the indexes that are going to be used,
since we don't have code to create the indexes, this is the defaultcurl-XPUT"localhost:9200/_cluster/settings"-H'Content-Type: application/json'-d'{"persistent": {"action.auto_create_index": "true"}}'For more info on this elasticsearch feature check theirindex documentionUsageRun and configure from command linepytest--es-address127.0.0.1:9200# or if you need user/password to authenticatepytest--es-addressmy-elk-server.io:9200--es-usernamefruch--es-password'passwordsarenicetohave'Configure from code (ideally in conftest.py)frompytest_elk_reporterimportElkReporterdefpytest_plugin_registered(plugin,manager):ifisinstance(plugin,ElkReporter):# TODO: get credentials in more secure fashion programmatically, maybe AWS secrets or the likes# or put them in plain-text in the code... what can ever go wrong...plugin.es_address="my-elk-server.io:9200"plugin.es_user='fruch'plugin.es_password='passwordsarenicetohave'plugin.es_index_name='test_data'Configure from pytest ini file# put this in pytest.ini / tox.ini / setup.cfg[pytest]es_address=my-elk-server.io:9200es_user=fruches_password=passwordsarenicetohavees_index_name=test_dataseepytest docsfor more about how to configure using .ini filesCollect context data for the whole sessionFor example, with this I'll be able to build a dash board per versionimportpytest@pytest.fixture(scope="session",autouse=True)defreport_formal_version_to_elk(request):"""Append my own data specific, for example which of the code uner test is used"""# TODO: take it programticly of of the code under test...my_data={"formal_version":"1.0.0-rc2"}elk=request.config.pluginmanager.get_plugin("elk-reporter-runtime")elk.session_data.update(**my_data)Collect data for specific testsimportrequestsdeftest_my_service_and_collect_timings(request,elk_reporter):response=requests.get("http://my-server.io/api/do_something")assertresponse.status_code==200elk_reporter.append_test_data(request,{"do_something_response_time":response.elapsed.total_seconds()})# now doing response time per version dashboard quite easy# and yeah, it's not exactly real usable metric, it's just an example...Or viarecord_propertybuilt-in fixture (that is normally used to collect data into the junitxml):importrequestsdeftest_my_service_and_collect_timings(record_property):response=requests.get("http://my-server.io/api/do_something")assertresponse.status_code==200record_property("do_something_response_time",response.elapsed.total_seconds())# now doing response time per version dashboard quite easy# and yeah, it's not exactly real usable metric, it's just an example...Split tests base on historyCool thing that can be done now that you have history of the tests
is to split the test base on their actually runtime when passing.
for integration test which might be long (minutes to hours),
this would be priceless.In this example we going to split the run in maximum 4min slices
while any test that doesn't have history information would be assumed to be 60sec long# pytest --collect-only --es-splice --es-max-splice-time=4 --es-default-test-time=60...0:0:04:00-3-['test_history_slices.py::test_should_pass_1','test_history_slices.py::test_should_pass_2','test_history_slices.py::test_should_pass_3']1:0:04:00-2-['test_history_slices.py::test_with_history_data','test_history_slices.py::test_that_failed']...# cat include000.txttest_history_slices.py::test_should_pass_1
test_history_slices.py::test_should_pass_2
test_history_slices.py::test_should_pass_3# cat include000.txttest_history_slices.py::test_with_history_data
test_history_slices.py::test_that_failed### now we can run the each slice on it's own machines### on machine1# pytest $(cat include000.txt)### on machine2# pytest $(cat include001.txt)ContributingContributions are very welcome. Tests can be run withtox, please ensure
the coverage at least stays the same before you submit a pull request.LicenseDistributed under the terms of theMITlicense, "pytest-elk-reporter" is free and open source softwareIssuesIf you encounter any problems, pleasefile an issuealong with a detailed description.ThanksThispytestplugin was generated withCookiecutteralong with@hackebrot'scookiecutter-pytest-plugintemplate.