Как выполнить модульное тестирование функции с внешним вызовом функции с помощью pytest - PullRequest
0 голосов
/ 09 мая 2018

У меня есть функция foo (par1) с внутренним вызовом функции (db_fetch), который является вызовом базы данных с использованием SQLAlchemy для получения сохраненного значения, как показано ниже:

def foo(par1):
    db_value = db_fetch(par1)
    if db_value > 10:
        return db_value * 5
    else:
        return 1

В настоящее время я создаю прибор db pytest и загружаю тестовые данные каждый раз, когда запускаю набор тестов, чтобы предоставить данные для вызова функции db_fetch. Как преобразовать тест, чтобы использовать фиктивные данные для вызова функции db_fetch, чтобы ускорить запуск теста?

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Вы можете либо:

1 - использовать внедрение зависимостей (изменить способ определения функции, чтобы ее было проще тестировать)

def foo(par1, fetch_function):
    db_value = fetch_function(par1)
    if db_value > 10:
        return db_value * 5
    else:
        return 1

В обычном коде назовите это так:

foo(my_par_1, db_fetch)

вместо:

foo(my_par1)

А в модульных тестах назовите это так:

foo(my_par_1, lambda par: 42)

Итак, во время модульных тестов значение всегда будет 42, а не реальным значением базы данных.

2 - макетировать вызов функции fetch_file

В вашем модульном тесте вместо вызова:

foo(my_par1)

Вам следует позвонить:

mock = MagicMock(return_value=42)
with patch('fetch_function', mock):
    foo(my_par1)

Вместо «fetch_function», возможно, вам придется написать «my_module.fetch_function», если fetch_function импортирована из модуля. Смотрите документацию: https://docs.python.org/3/library/unittest.mock-examples.html Есть несколько способов сделать макет и несколько библиотек, которые могут выполнить эту работу.

3- Создайте прибор Pytest так, чтобы каждый модульный тест выполнялся в базе данных памяти для конкретного теста, которая содержит только тестовые данные.

Это сложнее настроить.

0 голосов
/ 09 мая 2018

Это называется заглушкой функции, и это довольно просто в Python. Вы можете достичь этого путем:

def stub_foo():
    # some code without the DB stuff...
original_foo = foo
try:
   foo = stub_foo
   # some tests here with the stubbed function
finally:
   foo = original_foo
...