Initial commit
This commit is contained in:
7
skills/test-report-generator/assets/README.md
Normal file
7
skills/test-report-generator/assets/README.md
Normal file
@@ -0,0 +1,7 @@
|
||||
# Assets
|
||||
|
||||
Bundled resources for test-report-generator skill
|
||||
|
||||
- [ ] report_template.html: HTML template for generating test reports.
|
||||
- [ ] example_config.yaml: Example configuration file for the test report generator.
|
||||
- [ ] sample_test_results.json: Sample test results in JSON format.
|
||||
51
skills/test-report-generator/assets/example_config.yaml
Normal file
51
skills/test-report-generator/assets/example_config.yaml
Normal file
@@ -0,0 +1,51 @@
|
||||
# Configuration file for the test-report-generator plugin
|
||||
|
||||
# --- General Settings ---
|
||||
report_name: "Automated Test Report" # Name of the report
|
||||
output_directory: "./reports" # Directory to store generated reports
|
||||
report_format: "html" # Report output format (html, pdf, json)
|
||||
timestamp_format: "%Y-%m-%d %H:%M:%S" # Format for timestamps in the report
|
||||
|
||||
# --- Data Sources ---
|
||||
test_results:
|
||||
type: "junit" # Type of test result files (junit, pytest, etc.)
|
||||
path: "./test-results/*.xml" # Path to the test result files (supports glob patterns)
|
||||
# For multiple data sources, define additional entries:
|
||||
# - type: "pytest"
|
||||
# path: "./pytest-results/results.xml"
|
||||
|
||||
coverage_data:
|
||||
type: "cobertura" # Type of coverage data (cobertura, lcov)
|
||||
path: "./coverage.xml" # Path to the coverage data file
|
||||
# If no coverage data is available, leave this section commented out:
|
||||
# type: "none"
|
||||
# path: ""
|
||||
|
||||
# --- Report Customization ---
|
||||
logo_path: "YOUR_LOGO_PATH_HERE" # Path to a logo to include in the report (optional)
|
||||
report_title: "REPLACE_ME - Project Test Report" # Title displayed in the report
|
||||
report_description: "Comprehensive test report for REPLACE_ME project, including test results and code coverage." # Description of the report
|
||||
|
||||
# --- Thresholds and Alerts ---
|
||||
pass_rate_threshold: 0.95 # Minimum pass rate (as a fraction) to be considered successful
|
||||
coverage_threshold: 0.80 # Minimum code coverage (as a fraction) to be considered successful
|
||||
alert_on_failure: true # Send alerts if any tests fail
|
||||
alert_recipients: # List of email addresses or channels to send alerts to
|
||||
- "YOUR_EMAIL_ADDRESS_HERE"
|
||||
# - "another_recipient@example.com"
|
||||
|
||||
# --- Historical Data ---
|
||||
historical_data:
|
||||
enabled: false # Enable historical data tracking and comparisons
|
||||
database_url: "sqlite:///test_report_history.db" # URL for the database storing historical data (e.g., SQLite, PostgreSQL)
|
||||
retention_period: "30d" # How long to retain historical data (e.g., 30d, 90d, 1y)
|
||||
|
||||
# --- Advanced Options ---
|
||||
include_stacktraces: true # Include stack traces in the report
|
||||
collapse_long_messages: true # Collapse long test messages for readability
|
||||
debug_mode: false # Enable debug mode for more verbose logging
|
||||
|
||||
# --- Plugin-Specific Options ---
|
||||
# These options are specific to this test report generator plugin
|
||||
failure_analysis_enabled: true # Enables automated failure analysis
|
||||
stakeholder_format: "executive" # Format for stakeholder-friendly report (executive, detailed)
|
||||
145
skills/test-report-generator/assets/report_template.html
Normal file
145
skills/test-report-generator/assets/report_template.html
Normal file
@@ -0,0 +1,145 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{report_title}}</title>
|
||||
<style>
|
||||
/* Inline CSS for consistent rendering */
|
||||
body {
|
||||
font-family: sans-serif;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background-color: #f4f4f4;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.container {
|
||||
max-width: 960px;
|
||||
margin: 20px auto;
|
||||
padding: 20px;
|
||||
background-color: #fff;
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
h1 {
|
||||
text-align: center;
|
||||
color: #007bff;
|
||||
}
|
||||
|
||||
h2 {
|
||||
margin-top: 20px;
|
||||
border-bottom: 2px solid #eee;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
th, td {
|
||||
padding: 8px;
|
||||
text-align: left;
|
||||
border-bottom: 1px solid #ddd;
|
||||
}
|
||||
|
||||
th {
|
||||
background-color: #f2f2f2;
|
||||
}
|
||||
|
||||
.passed {
|
||||
color: green;
|
||||
}
|
||||
|
||||
.failed {
|
||||
color: red;
|
||||
}
|
||||
|
||||
.skipped {
|
||||
color: orange;
|
||||
}
|
||||
|
||||
.coverage-bar {
|
||||
height: 10px;
|
||||
background-color: #ddd;
|
||||
margin-top: 5px;
|
||||
border-radius: 5px;
|
||||
overflow: hidden; /* Ensure the inner bar stays within the container */
|
||||
}
|
||||
|
||||
.coverage-bar-fill {
|
||||
height: 10px;
|
||||
background-color: #28a745; /* Green for coverage */
|
||||
width: {{coverage_percentage}}%; /* Dynamic width based on coverage */
|
||||
display: block; /* Make it a block-level element to control height and width */
|
||||
}
|
||||
|
||||
.trend-chart {
|
||||
width: 100%;
|
||||
height: 300px; /* Adjust height as needed */
|
||||
background-color: #eee; /* Placeholder for the chart */
|
||||
text-align: center;
|
||||
line-height: 300px;
|
||||
color: #777;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/* Responsive adjustments */
|
||||
@media (max-width: 768px) {
|
||||
.container {
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
table {
|
||||
font-size: 0.9em;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<h1>{{report_title}}</h1>
|
||||
<p>Generated on: {{report_date}}</p>
|
||||
|
||||
<h2>Summary</h2>
|
||||
<p>Total Tests: {{total_tests}}</p>
|
||||
<p class="passed">Passed: {{passed_tests}}</p>
|
||||
<p class="failed">Failed: {{failed_tests}}</p>
|
||||
<p class="skipped">Skipped: {{skipped_tests}}</p>
|
||||
|
||||
<h2>Test Results</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Test Name</th>
|
||||
<th>Status</th>
|
||||
<th>Duration (ms)</th>
|
||||
<th>Error Message</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{test_results}}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h2>Coverage</h2>
|
||||
<p>Overall Coverage: {{coverage_percentage}}%</p>
|
||||
<div class="coverage-bar">
|
||||
<div class="coverage-bar-fill"></div>
|
||||
</div>
|
||||
|
||||
<h2>Trend Analysis</h2>
|
||||
<div class="trend-chart">
|
||||
<!-- Placeholder for Trend Chart. Replace with actual chart implementation -->
|
||||
Trend Chart Placeholder
|
||||
</div>
|
||||
|
||||
<h2>Failure Analysis</h2>
|
||||
<p>{{failure_analysis}}</p>
|
||||
|
||||
<p>Generated by Test Report Generator Plugin</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
128
skills/test-report-generator/assets/sample_test_results.json
Normal file
128
skills/test-report-generator/assets/sample_test_results.json
Normal file
@@ -0,0 +1,128 @@
|
||||
{
|
||||
"_comment": "Sample test results for test-report-generator plugin",
|
||||
"report_metadata": {
|
||||
"report_id": "test-report-2024-10-27-1430",
|
||||
"generated_at": "2024-10-27T14:30:00Z",
|
||||
"test_environment": "Production",
|
||||
"report_version": "1.0",
|
||||
"_comment": "Version of the report format. Allows for future schema changes."
|
||||
},
|
||||
"summary": {
|
||||
"total_tests": 100,
|
||||
"passed": 95,
|
||||
"failed": 3,
|
||||
"skipped": 2,
|
||||
"pass_rate": 95.0,
|
||||
"fail_rate": 3.0,
|
||||
"skip_rate": 2.0,
|
||||
"total_duration_seconds": 120.5,
|
||||
"_comment": "Overall summary of the test run"
|
||||
},
|
||||
"test_suites": [
|
||||
{
|
||||
"suite_name": "User Authentication",
|
||||
"total_tests": 20,
|
||||
"passed": 19,
|
||||
"failed": 1,
|
||||
"skipped": 0,
|
||||
"duration_seconds": 25.2,
|
||||
"tests": [
|
||||
{
|
||||
"test_name": "Valid login",
|
||||
"status": "passed",
|
||||
"duration_seconds": 1.2,
|
||||
"error_message": null,
|
||||
"stack_trace": null
|
||||
},
|
||||
{
|
||||
"test_name": "Invalid password",
|
||||
"status": "failed",
|
||||
"duration_seconds": 0.8,
|
||||
"error_message": "Authentication failed",
|
||||
"stack_trace": "at UserAuthentication.InvalidPasswordTest(UserAuthentication.cs:25)"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"suite_name": "Payment Processing",
|
||||
"total_tests": 30,
|
||||
"passed": 28,
|
||||
"failed": 1,
|
||||
"skipped": 1,
|
||||
"duration_seconds": 45.8,
|
||||
"tests": [
|
||||
{
|
||||
"test_name": "Successful payment",
|
||||
"status": "passed",
|
||||
"duration_seconds": 1.5,
|
||||
"error_message": null,
|
||||
"stack_trace": null
|
||||
},
|
||||
{
|
||||
"test_name": "Insufficient funds",
|
||||
"status": "failed",
|
||||
"duration_seconds": 1.1,
|
||||
"error_message": "Payment declined: Insufficient funds",
|
||||
"stack_trace": "at PaymentProcessing.InsufficientFundsTest(PaymentProcessing.cs:42)"
|
||||
},
|
||||
{
|
||||
"test_name": "Timeout",
|
||||
"status": "skipped",
|
||||
"duration_seconds": 0,
|
||||
"error_message": "External API timeout",
|
||||
"stack_trace": null
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"suite_name": "Data Validation",
|
||||
"total_tests": 50,
|
||||
"passed": 48,
|
||||
"failed": 1,
|
||||
"skipped": 1,
|
||||
"duration_seconds": 49.5,
|
||||
"tests": [
|
||||
{
|
||||
"test_name": "Valid data input",
|
||||
"status": "passed",
|
||||
"duration_seconds": 0.7,
|
||||
"error_message": null,
|
||||
"stack_trace": null
|
||||
},
|
||||
{
|
||||
"test_name": "Invalid email format",
|
||||
"status": "failed",
|
||||
"duration_seconds": 0.9,
|
||||
"error_message": "Invalid email format",
|
||||
"stack_trace": "at DataValidation.InvalidEmailTest(DataValidation.cs:17)"
|
||||
},
|
||||
{
|
||||
"test_name": "Empty field",
|
||||
"status": "skipped",
|
||||
"duration_seconds": 0,
|
||||
"error_message": "Pending implementation",
|
||||
"stack_trace": null
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"coverage": {
|
||||
"line_coverage": 85.2,
|
||||
"branch_coverage": 70.5,
|
||||
"function_coverage": 90.1,
|
||||
"_comment": "Code coverage metrics"
|
||||
},
|
||||
"trends": {
|
||||
"pass_rate_history": [
|
||||
{"date": "2024-10-20", "pass_rate": 92.0},
|
||||
{"date": "2024-10-21", "pass_rate": 93.5},
|
||||
{"date": "2024-10-22", "pass_rate": 94.0},
|
||||
{"date": "2024-10-23", "pass_rate": 94.5},
|
||||
{"date": "2024-10-24", "pass_rate": 94.7},
|
||||
{"date": "2024-10-25", "pass_rate": 94.8},
|
||||
{"date": "2024-10-26", "pass_rate": 94.9},
|
||||
{"date": "2024-10-27", "pass_rate": 95.0}
|
||||
],
|
||||
"_comment": "Historical trend of pass rates over time"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user