Как успешно провести юнит тест в Python? - PullRequest
0 голосов
/ 12 февраля 2019

Итак, я пытаюсь запустить модульное тестирование, при котором проходит только одно правильное решение, а все остальные неправильные решения должны проваливаться.Но дело в том, что модульный тест должен учитывать широкий спектр тестовых случаев, даже отрицательных значений.Как я могу сделать это, при котором проходит только одно решение, а любое другое не помогает?Я слышал о людях, которые делают это эффективно, используя хеш-таблицы, в которых ввод - это ключ, а вывод - значение.

То, что я сделал ниже, явно недостаточно для юнит-теста и помечено как неправильное.

Unit_Test / lecture / MainObject.py

def computeShippingCost(input):
    if (0 < input <= 30):
        return 5
    elif (input > 30):
        return ((input - 30) * 0.25) + 5

Unit_Test / tests / Testing.py

from lecture.MainObject import computeShippingCost

class Testing(object):
    def Test(self):
        assert computeShippingCost(20) == 3 #incorrect
        assert computeShippingCost(-30) == -8 #incorrect
        assert computeShippingCost(40) == -20 #incorrect
        assert computeShippingCost(50) == 10 #correct

1 Ответ

0 голосов
/ 14 февраля 2019

Из вашего примера и описания я понимаю, что может существовать очень фундаментальное заблуждение относительно того, как должен выглядеть тест.Каждый тест так или иначе стимулирует своего субъекта (тестируемая система, также называемая 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 в этой ситуации.Затем это утверждение представляет собой полезный тест, и тот факт, что оно не выполнено, указывает на то, что в вашей функции есть ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...