1
0
mirror of https://github.com/esphome/esphome.git synced 2025-10-13 15:23:49 +01:00
This commit is contained in:
J. Nick Koston
2025-10-08 16:59:11 -10:00
parent a944342ccd
commit 073f779cea

View File

@@ -284,50 +284,35 @@ def run_grouped_test(
return False return False
def test_components( def run_grouped_component_tests(
component_patterns: list[str], all_tests: dict[str, list[Path]],
platform_filter: str | None, platform_filter: str | None,
platform_bases: dict[str, list[Path]],
tests_dir: Path,
build_dir: Path,
esphome_command: str, esphome_command: str,
continue_on_fail: bool, continue_on_fail: bool,
enable_grouping: bool = True, ) -> tuple[set[tuple[str, str]], list[str], list[str]]:
) -> int: """Run grouped component tests.
"""Test components with optional intelligent grouping.
Args: Args:
component_patterns: List of component name patterns all_tests: Dictionary mapping component names to test files
platform_filter: Optional platform to filter by platform_filter: Optional platform to filter by
platform_bases: Platform base files mapping
tests_dir: Path to tests/components directory
build_dir: Path to build directory
esphome_command: ESPHome command (config/compile) esphome_command: ESPHome command (config/compile)
continue_on_fail: Whether to continue on failure continue_on_fail: Whether to continue on failure
enable_grouping: Whether to enable component grouping
Returns: Returns:
Exit code (0 for success, 1 for failure) Tuple of (tested_components, passed_tests, failed_tests)
""" """
# Setup paths tested_components = set()
repo_root = Path(__file__).parent.parent passed_tests = []
tests_dir = repo_root / "tests" / "components" failed_tests = []
build_components_dir = repo_root / "tests" / "test_build_components"
build_dir = build_components_dir / "build"
build_dir.mkdir(parents=True, exist_ok=True)
# Get platform base files
platform_bases = get_platform_base_files(build_components_dir)
# Find all component tests
all_tests = {}
for pattern in component_patterns:
all_tests.update(find_component_tests(tests_dir, pattern))
if not all_tests:
print(f"No components found matching: {component_patterns}")
return 1
print(f"Found {len(all_tests)} components to test")
# Group components by platform and bus signature # Group components by platform and bus signature
grouped_components: dict[tuple[str, str], list[str]] = defaultdict(list) grouped_components: dict[tuple[str, str], list[str]] = defaultdict(list)
if enable_grouping:
print("\n" + "=" * 80) print("\n" + "=" * 80)
print("Analyzing components for intelligent grouping...") print("Analyzing components for intelligent grouping...")
print("=" * 80) print("=" * 80)
@@ -395,9 +380,7 @@ def test_components(
) )
if individual_tests: if individual_tests:
print( print(f"\n{len(individual_tests)} components will be tested individually:")
f"\n{len(individual_tests)} components will be tested individually:"
)
for comp in sorted(individual_tests[:10]): for comp in sorted(individual_tests[:10]):
print(f" - {comp}") print(f" - {comp}")
if len(individual_tests) > 10: if len(individual_tests) > 10:
@@ -417,13 +400,7 @@ def test_components(
) )
print("=" * 80 + "\n") print("=" * 80 + "\n")
# Run tests # Execute grouped tests
failed_tests = []
passed_tests = []
tested_components = set() # Track which components were tested in groups
# First, run grouped tests if grouping is enabled
if enable_grouping:
for (platform, signature), components in grouped_components.items(): for (platform, signature), components in grouped_components.items():
# Only group if we have multiple components with same signature # Only group if we have multiple components with same signature
if len(components) <= 1: if len(components) <= 1:
@@ -476,6 +453,66 @@ def test_components(
else: else:
failed_tests.append(test_id) failed_tests.append(test_id)
return tested_components, passed_tests, failed_tests
def test_components(
component_patterns: list[str],
platform_filter: str | None,
esphome_command: str,
continue_on_fail: bool,
enable_grouping: bool = True,
) -> int:
"""Test components with optional intelligent grouping.
Args:
component_patterns: List of component name patterns
platform_filter: Optional platform to filter by
esphome_command: ESPHome command (config/compile)
continue_on_fail: Whether to continue on failure
enable_grouping: Whether to enable component grouping
Returns:
Exit code (0 for success, 1 for failure)
"""
# Setup paths
repo_root = Path(__file__).parent.parent
tests_dir = repo_root / "tests" / "components"
build_components_dir = repo_root / "tests" / "test_build_components"
build_dir = build_components_dir / "build"
build_dir.mkdir(parents=True, exist_ok=True)
# Get platform base files
platform_bases = get_platform_base_files(build_components_dir)
# Find all component tests
all_tests = {}
for pattern in component_patterns:
all_tests.update(find_component_tests(tests_dir, pattern))
if not all_tests:
print(f"No components found matching: {component_patterns}")
return 1
print(f"Found {len(all_tests)} components to test")
# Run tests
failed_tests = []
passed_tests = []
tested_components = set() # Track which components were tested in groups
# First, run grouped tests if grouping is enabled
if enable_grouping:
tested_components, passed_tests, failed_tests = run_grouped_component_tests(
all_tests=all_tests,
platform_filter=platform_filter,
platform_bases=platform_bases,
tests_dir=tests_dir,
build_dir=build_dir,
esphome_command=esphome_command,
continue_on_fail=continue_on_fail,
)
# Then run individual tests for components not in groups # Then run individual tests for components not in groups
for component, test_files in sorted(all_tests.items()): for component, test_files in sorted(all_tests.items()):
for test_file in test_files: for test_file in test_files: