# -*- coding: utf-8 -*- """Автотесты лабораторной 8 (MPI). Если mpi4py не установлен — тесты пропускаются (SKIPPED), но сама работа сдаётся с запуском через mpiexec -n 2/4 (проверяет преподаватель). Тесты выполняются в режиме ОДНОГО ранга (без mpiexec): в этом режиме scatter/gather работают тривиально, но корректность схемы и checksum проверяются. Многоранговую корректность гарантирует эталон и проверка преподавателем через mpiexec. """ import os import sys from pathlib import Path import pytest ROOT = Path(__file__).resolve().parents[1] sys.path.insert(0, str(ROOT)) mpi4py = pytest.importorskip("mpi4py", reason="mpi4py не установлен") from conftest import close, load_solution # noqa: E402 from common.tasks import run_sequential, smoke_params # noqa: E402 LAB = "lab08_mpi" def test_variant_number_set(): mod = load_solution(LAB) assert 1 <= getattr(mod, "VARIANT_NUMBER", 0) <= 20, ( "Укажите свой VARIANT_NUMBER (1..20) в solution.py") def test_mpi_run_single_rank(): """Один ранг: checksum должен совпадать с последовательным запуском.""" mod = load_solution(LAB) from common.tasks import get_variant name = get_variant(mod.VARIANT_NUMBER)["task_name"] sp = smoke_params(name) expected, _ = run_sequential(name, sp, parts=1) got = mod.mpi_run(name, sp) assert got is not None, "mpi_run должна вернуть checksum (на любом ранге)" assert close(got, expected), f"checksum {got} != {expected}" def test_mpi_pi(): mod = load_solution(LAB) pi = mod.mpi_pi(100_000) assert 3.0 < pi < 3.3, f"pi = {pi} — вне допустимого диапазона для 100k бросков"