123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- """Runs the benchmarks and inserts the results into the database."""
- import json
- import os
- import sys
- import pytest
- from helpers import insert_benchmarking_data
- def get_lighthouse_scores(directory_path: str) -> dict:
- """Extracts the Lighthouse scores from the JSON files in the specified directory.
- Args:
- directory_path (str): The path to the directory containing the JSON files.
- Returns:
- dict: The Lighthouse scores.
- """
- scores = {}
- try:
- for filename in os.listdir(directory_path):
- if filename.endswith(".json") and filename != "manifest.json":
- file_path = os.path.join(directory_path, filename)
- with open(file_path, "r") as file:
- data = json.load(file)
- # Extract scores and add them to the dictionary with the filename as key
- scores[data["finalUrl"].replace("http://localhost:3000/", "")] = {
- "performance_score": data["categories"]["performance"]["score"],
- "accessibility_score": data["categories"]["accessibility"][
- "score"
- ],
- "best_practices_score": data["categories"]["best-practices"][
- "score"
- ],
- "seo_score": data["categories"]["seo"]["score"],
- "pwa_score": data["categories"]["pwa"]["score"],
- }
- except Exception as e:
- print(e)
- return {"error": "Error parsing JSON files"}
- return scores
- def run_pytest_and_get_results(test_path=None) -> dict:
- """Runs pytest and returns the results.
- Args:
- test_path: The path to the tests to run.
- Returns:
- dict: The results of the tests.
- """
- # Set the default path to the current directory if no path is provided
- if not test_path:
- test_path = os.getcwd()
- # Ensure you have installed the pytest-json plugin before running this
- pytest_args = ["-v", "--benchmark-json=benchmark_report.json", test_path]
- # Run pytest with the specified arguments
- pytest.main(pytest_args)
- # Print ls of the current directory
- print(os.listdir())
- with open("benchmark_report.json", "r") as file:
- pytest_results = json.load(file)
- return pytest_results
- def extract_stats_from_json(json_data) -> list[dict]:
- """Extracts the stats from the JSON data and returns them as a list of dictionaries.
- Args:
- json_data: The JSON data to extract the stats from.
- Returns:
- list[dict]: The stats for each test.
- """
- # Load the JSON data if it is a string, otherwise assume it's already a dictionary
- data = json.loads(json_data) if isinstance(json_data, str) else json_data
- # Initialize an empty list to store the stats for each test
- test_stats = []
- # Iterate over each test in the 'benchmarks' list
- for test in data.get("benchmarks", []):
- stats = test.get("stats", {})
- test_name = test.get("name", "Unknown Test")
- min_value = stats.get("min", None)
- max_value = stats.get("max", None)
- mean_value = stats.get("mean", None)
- stdev_value = stats.get("stddev", None)
- test_stats.append(
- {
- "test_name": test_name,
- "min": min_value,
- "max": max_value,
- "mean": mean_value,
- "stdev": stdev_value,
- }
- )
- return test_stats
- def main():
- """Runs the benchmarks and inserts the results into the database."""
- # Get the commit SHA and JSON directory from the command line arguments
- commit_sha = sys.argv[1]
- json_dir = sys.argv[2]
- # Get the PR title and database URL from the environment variables
- pr_title = os.environ.get("PR_TITLE")
- db_url = os.environ.get("DATABASE_URL")
- if db_url is None or pr_title is None:
- sys.exit("Missing environment variables")
- # Run pytest and get the results
- results = run_pytest_and_get_results()
- cleaned_results = extract_stats_from_json(results)
- # Get the Lighthouse scores
- lighthouse_scores = get_lighthouse_scores(json_dir)
- # Insert the data into the database
- insert_benchmarking_data(
- db_url, lighthouse_scores, cleaned_results, commit_sha, pr_title
- )
- if __name__ == "__main__":
- main()
|