02.05.04 — TestSuite[Driver] — moteur parallélisé#
Fichier source :
src/ocarina/dsl/testing/oc_test_suite.pyResponsabilité unique : exécuter une séquence de
Testen parallèle, gérer la saturation, le filtrage par IDs, et la validation des invariants pré-exécution.
Constructeur#
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)
# ... assignations ...
self._tests = filter_tests_by_ids(
tests,
only=only_ids,
exclude=exclude_ids,
logger=create_logger().set_prefix(lambda: f"{self.name}: filtering tests..."),
)| Paramètre | Type | Rôle | Défaut |
|---|---|---|---|
name | str | Nom de la suite (apparaît dans logs & rapports) | — |
tests | Sequence[Test[Driver]] | Liste des tests à exécuter | — |
create_logger | Thunk[ILogger] | Factory de logger | — |
drivers_pool | WebDriversPool[Driver] | Pool partagée | — |
take_screenshot | ITakeScreenshot[Driver] | Callable (driver, logger, category) -> None | — |
act_counter | ActCounter | None | Si None → ThreadsBasedActCounter() | None |
transient_errors | tuple[type[Exception], ...] | Exceptions qui déclenchent un retry | () |
copy_indicator | str | Préfixe pour les tests clonés en saturation | "COPY" |
put_space_after_copy_indicator | bool | [COPY 1] (True) vs [COPY1] (False) | True |
max_retries_per_test | int | None | Nombre maximum de retentatives d’un test potentiellement flaky | None → _DEFAULT_MAX_RETRIES_PER_TEST (8) |
autoscreen_on_fail | bool | Capture automatiquement un ou des screenshots (rafale) en cas d’échec | False |
saturate_workers | bool | None | Clonage des tests pour saturer tous les workers si la pool est suffisamment grosse | None → cascade : suite > campaign > bootstrap |
only_ids | Iterable[str] | Filtre --only | () |
exclude_ids | Iterable[str] | Filtre --exclude | () |
Garde-fous#
Au moment du __init__#
def _guards_on_invoke(self, tests: Sequence[Test[Driver]]) -> None:
validate_test_runners_ids(tests=tests, name="tests").execute().raise_if_invalid()→ Tous les test_id doivent être uniques. Sinon : AggregateInvariantViolationError. Levé dès la construction, avant la moindre tentative d’exécution. Si l’utilisateur a dupliqué un test_id par erreur, il l’apprend immédiatement.