Из вашего примера и описания я понимаю, что может существовать очень фундаментальное заблуждение относительно того, как должен выглядеть тест.Каждый тест так или иначе стимулирует своего субъекта (тестируемая система, также называемая SUT), а затем проверяет, что результат соответствует ожидаемому.
На очень абстрактном уровне тест выглядит следующим образом:
def myTest():
<Prepare the SUT for the test>
<Stimulate the SUT>
<check if the result matches the expectation>
Предполагается, что неудачный тест укажет на наличие ошибки в SUT.Правильно реализованный код не должен привести к провалу теста.(*)
В вашем примере кода вы стимулировали SUT и проверили результат следующим образом:
assert computeShippingCost(20) == 3 #incorrect
Из реализации computeShippingCost
ясно, что результатв этом случае будет 5
, а не 3
.Теперь есть две возможности:
A) computeShippingCost
реализован правильно.Тогда ожидание в этом случае должно быть 5
.Утверждение против чего-либо еще, кроме 5
, потерпит неудачу.Это нарушает указанную выше цель (*), потому что у вас будет неудачный тест, хотя код реализован правильно.
B) computeShippingCost
имеет ошибку, и в действительности она должна выдать 3
в этой ситуации.Затем это утверждение представляет собой полезный тест, и тот факт, что оно не выполнено, указывает на то, что в вашей функции есть ошибка.