Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file added tests/harness/__init__.py
Empty file.
43 changes: 43 additions & 0 deletions tests/harness/structured_logger.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import json
import logging
import os
import time
from datetime import datetime

class JsonStructuredFormatter(logging.Formatter):
def __init__(self, test_name="N/A", url="N/A", browser="Python-Requests/Playwright"):
super().__init__()
self.test_name = test_name
self.url = url
self.browser = browser

def format(self, record):
log_entry = {
"timestamp": datetime.fromtimestamp(record.created).isoformat(),
"testName": self.test_name,
"url": self.url,
"level": record.levelname,
"message": record.getMessage(),
"logger": record.name,
"file": f"{record.filename}:{record.lineno}",
"browser": self.browser
}
return json.dumps(log_entry)

def setup_structured_logger(test_name, output_dir="test_artifacts"):
os.makedirs(output_dir, exist_ok=True)

logger = logging.getLogger(test_name)
logger.setLevel(logging.INFO)
# Prevent duplicate handlers if fixture re-runs
if logger.hasHandlers():
logger.handlers.clear()

log_file_path = os.path.join(output_dir, f"structured_logs_{int(time.time())}.json")

file_handler = logging.FileHandler(log_file_path)
formatter = JsonStructuredFormatter(test_name=test_name)
file_handler.setFormatter(formatter)

logger.addHandler(file_handler)
return logger, log_file_path
29 changes: 29 additions & 0 deletions tests/test_structured_logging.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import pytest
import logging
import os
from harness.structured_logger import setup_structured_logger

@pytest.fixture
def structured_log(request):
# Setup the structured logger using the current test's name
test_name = request.node.name
logger, log_path = setup_structured_logger(test_name=test_name)

yield logger

# Verification note to print out where artifact is saved
print(f"\n[Artifact Saved] Structured JSON logs written to: {log_path}")

def test_application_login_scenario(structured_log):
structured_log.info("Starting authentication flow test.")

# Simulating UI/API operations
user_url = "https://api.dev-assistant.internal/login"
structured_log.info(f"Navigating to login endpoint: {user_url}")

# Simulate a warning log entry
structured_log.warning("API response latency exceeded 200ms threshold.")

# Simulate an operational check
assert True
structured_log.info("Authentication flow completed successfully.")