02.05.04 — TestSuite[Driver] — parallelized engine#
Source file:
src/ocarina/dsl/testing/oc_test_suite.pyOne job: run a sequence of
Tests in parallel, handle saturation, ID filtering, and pre-execution invariant validation.
Constructor#
def __init__(
self,
*,
name: str,
tests: Sequence[Test[Driver]],
create_logger: Thunk[ILogger],
drivers_pool: WebDriversPool[Driver],
take_screenshot: ITakeScreenshot[Driver],
act_counter: ActCounter | None = None,
transient_errors: tuple[type[Exception], ...] = (),
copy_indicator: str = "COPY",
put_space_after_copy_indicator: bool = True,
max_retries_per_test: int | None = None,
autoscreen_on_fail: bool = False,
saturate_workers: bool | None = None,
only_ids: Iterable[str] = (),
exclude_ids: Iterable[str] = (),
) -> None:
self._guards_on_invoke(tests)
# ... assignments ...
self._tests = filter_tests_by_ids(
tests,
only=only_ids,
exclude=exclude_ids,
logger=create_logger().set_prefix(lambda: f"{self.name}: filtering tests..."),
)| Parameter | Type | Role | Default |
|---|---|---|---|
name | str | Suite name (appears in logs & reports) | — |
tests | Sequence[Test[Driver]] | List of tests to run | — |
create_logger | Thunk[ILogger] | Logger factory | — |
drivers_pool | WebDriversPool[Driver] | Shared pool | — |
take_screenshot | ITakeScreenshot[Driver] | Callable (driver, logger, category) -> None | — |
act_counter | ActCounter | None | If None → ThreadsBasedActCounter() | None |
transient_errors | tuple[type[Exception], ...] | Exceptions that trigger a retry | () |
copy_indicator | str | Prefix for saturation-cloned tests | "COPY" |
put_space_after_copy_indicator | bool | [COPY 1] (True) vs [COPY1] (False) | True |
max_retries_per_test | int | None | Max retries for a potentially flaky test | None → _DEFAULT_MAX_RETRIES_PER_TEST (8) |
autoscreen_on_fail | bool | Automatically capture one or several screenshots (burst) on failure | False |
saturate_workers | bool | None | Clone tests to saturate every worker if the pool is large enough | None → cascade: suite > campaign > bootstrap |
only_ids | Iterable[str] | --only filter | () |
exclude_ids | Iterable[str] | --exclude filter | () |
Guardrails#
At __init__ time#
def _guards_on_invoke(self, tests: Sequence[Test[Driver]]) -> None:
validate_test_runners_ids(tests=tests, name="tests").execute().raise_if_invalid()→ Every test_id must be unique. Otherwise: AggregateInvariantViolationError. Raised at construction, before any execution attempt. Duplicate a test_id by accident and you find out instantly.