Turn a Kibana JSON log export into a runnable pytest suite using the secure-log2test CLI. Use when the user has a Kibana or Elasticsearch JSON export of API traffic and wants a regression suite from production logs, when extracting test cases from staging traffic, when scrubbing auth headers or secret-looking body fields before logs leave the laptop, when bridging Kibana-captured requests into a pytest-based suite for CI, when the user mentions Kibana logs, Elasticsearch JSON export, log-to-test conversion, log replay tests, auth header redaction, PII in logs, or regression tests from production traffic.
92
100%
Does it follow best practices?
Impact
93%
1.00xAverage score across 2 eval scenarios
Passed
No known issues
{
"context": "Tests whether the agent uses the --redact-marker flag to produce [SCRUBBED] placeholders, verifies the generated file is self-contained with only the expected imports, checks that test names follow the slug+index naming convention, confirms requests.request() is used with timeout=10 and correct body arguments (json= vs data=), and verifies repr() escaping is used for log-derived values.",
"type": "weighted_checklist",
"checklist": [
{
"name": "Custom redact marker used",
"description": "The generated file contains the string '[SCRUBBED]' (the custom marker passed via --redact-marker)",
"max_score": 12
},
{
"name": "Default marker absent",
"description": "The generated file does NOT contain the string '***REDACTED***' (the default marker)",
"max_score": 8
},
{
"name": "Self-contained imports",
"description": "The generated file imports only os, pytest, and requests — no other third-party or internal imports appear",
"max_score": 10
},
{
"name": "No conftest required",
"description": "The generated file does not reference or require conftest.py (no fixture imports, no conftest-dependent fixtures in the test functions)",
"max_score": 8
},
{
"name": "requests.request() call form",
"description": "Each generated test uses requests.request(method=..., url=BASE_URL + ...) — not requests.get/post/put/etc.",
"max_score": 10
},
{
"name": "timeout=10 present",
"description": "Each requests.request() call includes timeout=10",
"max_score": 8
},
{
"name": "Status code assertion",
"description": "Each test asserts response.status_code == <status from the log entry>",
"max_score": 8
},
{
"name": "json= for dict body",
"description": "At least one test passes the dict/JSON body via the json= keyword argument (not data=)",
"max_score": 8
},
{
"name": "data= for string body",
"description": "At least one test passes the plain-text body via the data= keyword argument (not json=)",
"max_score": 8
},
{
"name": "Slug+index function names",
"description": "Test function names follow the pattern test_<method_slug>_<url_slug>_<index> with a numeric suffix disambiguator (e.g. test_post_api_v1_users_1)",
"max_score": 10
},
{
"name": "repr() escaping",
"description": "Log-derived string values (URLs, method names, header values, body strings) appear inside repr() calls or as quoted Python literals in the generated source — not as raw unescaped strings",
"max_score": 10
}
]
}.tessl-plugin
evals
scenario-1
scenario-2
secure_log2test
tests