From af2b541426e16ebe658dc40136ad64844f9c6e22 Mon Sep 17 00:00:00 2001 From: Naufan Rizal Date: Tue, 25 Mar 2025 13:22:16 +1100 Subject: [PATCH 1/2] add `--json` option to save collector payload to JSON --- .../pytest_plugin/__init__.py | 16 ++++++++++++++++ .../pytest_plugin/buildkite_plugin.py | 7 ++++++- .../pytest_plugin/test_plugin.py | 12 ++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/buildkite_test_collector/pytest_plugin/__init__.py b/src/buildkite_test_collector/pytest_plugin/__init__.py index 2bebc4a..242ba0b 100644 --- a/src/buildkite_test_collector/pytest_plugin/__init__.py +++ b/src/buildkite_test_collector/pytest_plugin/__init__.py @@ -48,5 +48,21 @@ def pytest_unconfigure(config): if not hasattr(config, "workerinput"): submit(plugin.payload) + jsonpath = config.option.jsonpath + if jsonpath: + plugin.save_payload_as_json(jsonpath) + del config._buildkite config.pluginmanager.unregister(plugin) + +def pytest_addoption(parser): + """add custom option to pytest""" + group = parser.getgroup('buildkite', 'Buildkite Test Collector') + group.addoption( + '--json', + default=None, + action='store', + dest="jsonpath", + metavar="path", + help='save json file at given path' + ) diff --git a/src/buildkite_test_collector/pytest_plugin/buildkite_plugin.py b/src/buildkite_test_collector/pytest_plugin/buildkite_plugin.py index bc82ea7..3311d94 100644 --- a/src/buildkite_test_collector/pytest_plugin/buildkite_plugin.py +++ b/src/buildkite_test_collector/pytest_plugin/buildkite_plugin.py @@ -1,10 +1,10 @@ """Buildkite test collector plugin for Pytest""" +import json from uuid import uuid4 from ..collector.payload import TestData - class BuildkitePlugin: """Buildkite test collector plugin for Pytest""" @@ -51,3 +51,8 @@ def pytest_runtest_logreport(self, report): del self.in_flight[nodeid] self.payload = self.payload.push_test_data(test_data) + + def save_payload_as_json(self, path): + """ Save payload into a json file """ + with open(path, "w", encoding="utf-8") as f: + json.dump(self.payload.as_json(), f) diff --git a/tests/buildkite_test_collector/pytest_plugin/test_plugin.py b/tests/buildkite_test_collector/pytest_plugin/test_plugin.py index 6351444..97e7c38 100644 --- a/tests/buildkite_test_collector/pytest_plugin/test_plugin.py +++ b/tests/buildkite_test_collector/pytest_plugin/test_plugin.py @@ -1,6 +1,8 @@ from buildkite_test_collector.pytest_plugin import BuildkitePlugin from buildkite_test_collector.collector.payload import Payload +from pathlib import Path +import json def test_runtest_logstart_with_unstarted_payload(fake_env): payload = Payload.init(fake_env) @@ -11,3 +13,13 @@ def test_runtest_logstart_with_unstarted_payload(fake_env): plugin.pytest_runtest_logstart("wat::when", [1, 2]) assert plugin.payload.started_at is not None + + +def test_save_json_payload(fake_env, tmp_path): + payload = Payload.init(fake_env) + plugin = BuildkitePlugin(payload) + + path = tmp_path / "result.json" + plugin.save_payload_as_json(path) + + assert path.read_text() == json.dumps(payload.as_json()) From 5d1db20df8a2a9014bdb5e59399d0def27a4c547 Mon Sep 17 00:00:00 2001 From: Naufan Rizal Date: Tue, 25 Mar 2025 16:53:12 +1100 Subject: [PATCH 2/2] Save only test data to json, excluding run_env and format --- .../pytest_plugin/buildkite_plugin.py | 2 +- .../buildkite_test_collector/pytest_plugin/test_plugin.py | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/buildkite_test_collector/pytest_plugin/buildkite_plugin.py b/src/buildkite_test_collector/pytest_plugin/buildkite_plugin.py index 3311d94..3d009e0 100644 --- a/src/buildkite_test_collector/pytest_plugin/buildkite_plugin.py +++ b/src/buildkite_test_collector/pytest_plugin/buildkite_plugin.py @@ -55,4 +55,4 @@ def pytest_runtest_logreport(self, report): def save_payload_as_json(self, path): """ Save payload into a json file """ with open(path, "w", encoding="utf-8") as f: - json.dump(self.payload.as_json(), f) + json.dump(self.payload.as_json()["data"], f) diff --git a/tests/buildkite_test_collector/pytest_plugin/test_plugin.py b/tests/buildkite_test_collector/pytest_plugin/test_plugin.py index 97e7c38..ccb60d6 100644 --- a/tests/buildkite_test_collector/pytest_plugin/test_plugin.py +++ b/tests/buildkite_test_collector/pytest_plugin/test_plugin.py @@ -15,11 +15,14 @@ def test_runtest_logstart_with_unstarted_payload(fake_env): assert plugin.payload.started_at is not None -def test_save_json_payload(fake_env, tmp_path): +def test_save_json_payload(fake_env, tmp_path, successful_test): payload = Payload.init(fake_env) + payload = Payload.started(payload) + payload = payload.push_test_data(successful_test) + plugin = BuildkitePlugin(payload) path = tmp_path / "result.json" plugin.save_payload_as_json(path) - assert path.read_text() == json.dumps(payload.as_json()) + assert path.read_text() == json.dumps([successful_test.as_json(payload.started_at)])