Я очень плохо знаком с python тестированием. Помогите этому методу с объяснением для модульного тестирования - PullRequest
0 голосов
/ 22 января 2020

Эта функция будет принимать ввод и вызывать функцию входа в систему на основе ввода.

def login_features():
print("Choose option to login")
print("1. BDO login")
print("2. GPM login")
print("3. Member login")
login_input = int(input())
switcher = {
    1: bdo_login,
    2: gpm_login, # I am calling the function instance
    3: member_login
}
login = switcher.get(login_input, login_features)
login() # Executing the called function

1 Ответ

1 голос
/ 22 января 2020

Я предполагаю, что вы хотите написать тест для login_features(). Как правило, я бы реорганизовал функцию следующим образом:

def execute_login_option(opt_str: str):
    switcher = {...}
    login = switcher.get(login_input, login_features)
    login() # Executing the called function

def login_features():
    print("Choose option to login")
    print("1. BDO login")
    print("2. GPM login")
    print("3. Member login")
    login_input = int(input())
    execute_login_option(login_input)

Таким образом, у вас есть простой способ просто протестировать execute_login_option без необходимости исправления input().

Если вам нужно Для получения некоторого ввода вы можете использовать Python s unittest.mock.patch:

def my_function_with_input():
    test = input("please enter a value")
    return test

with mock.patch('%s.input' % __name__) as patched_input:
    patched_input.return_value = "foo"
    assert my_function_with_input() == "foo"

В этом контексте я переопределяю возвращаемое значение вызовов для input(), чтобы оно было "foo". Аналогично, вы можете установить возвращаемое значение для желаемого пользовательского ввода в ваших тестовых случаях для login_features.


Редактировать (чтобы ответить на вопрос в комментарии о том, как тестировать функции, которые не возвращают значения) :

Если ваша функция не возвращает значение для утверждения, она обычно меняет состояние всей системы как побочный эффект (в вашем примере один такой побочный эффект мог бы будь что пользователь залогинен). Ниже приведен минимальный пример того, как тестировать в такой настройке:

from unittest import mock

class ClassToTest:
    def __init__(self):
        self.state = "A"

    def my_function_with_input(self):
        test = input("please enter a value")
        if test == "foo":
            self.state = "B"
        else:
            self.state = "C"

def my_function_with_input():
    test = input("please enter a value")
    return test

with mock.patch('%s.input' % __name__) as patched_input:
    patched_input.return_value = "foo"

    test_obj = ClassToTest()
    assert test_obj.state == "A"

    test_obj.my_function_with_input()
    assert test_obj.state == "B"  # assert that the state changed to B

Существует больше опций и возможностей, которые можно использовать, используя unittest.mock -рамку.

...