Напиши файл тестов на pytest для функции ниже. Верни один блок кода, который запускается командой pytest -v без правок и без дописывания.
Код: [КОД:
def shipping_cost(weight_kg, zone, express=False):
if weight_kg <= 0:
raise ValueError("вес должен быть больше нуля")
base = {"msk": 300, "region": 500}[zone]
cost = base + max(0, weight_kg - 1) * 80
return round(cost * 1.6) if express else round(cost)
]
Строка импорта: [ИМПОРТ: from delivery.pricing import shipping_cost]
Что нельзя дёргать из тестов: [ВНЕШНЕЕ: ничего, функция чистая]
Собери так: на каждую ветку кода — свой тест с говорящим именем; параметризация @pytest.mark.parametrize там, где тесты отличаются только числами; исключения — через pytest.raises с проверкой текста сообщения; фикстура появляется только тогда, когда один и тот же набор данных нужен разным тестам; мок — только для того, что названо в поле ВНЕШНЕЕ. Не больше двенадцати тестов.
Отсечка. Не пиши тестов к тому, как функция должна была бы работать: валидацию, которой в коде нет, никто не проверяет. Не импортируй из выдуманного модуля — бери строку из поля ИМПОРТ как есть. Не обкладывай код пояснениями до и после: комментарий уместен внутри теста и только там, где неочевидно ожидаемое число. Строка assert result без ожидаемого значения тестом не считается.
Проверка. Прогони файл в уме как интерпретатор: импорты собраны сверху, каждая фикстура объявлена раньше, чем использована, в parametrize число аргументов совпадает с числом параметров, ни один тест не зависит от порядка запуска и от сегодняшней даты. Потом пересчитай каждое ожидаемое значение по формуле из кода — взятое на глаз число превращает тест в фиксацию случайного результата, такой тест убери.
Собрать под себя — поля заполнены рабочими значениями, меняйте их и промпт выше обновится сам