локальная переменная для модульного тестирования в python для проверки функциональности тестовой функции - PullRequest
0 голосов
/ 09 ноября 2018

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

В таком случае, Как я буду проверять функциональность функции на основе значения некоторых локальных переменных. Поскольку local не будет доступен за пределами функции, я не могу проверить значение локальной переменной. Каким должен быть правильный способ модульного тестирования таких функций?

Я проследовал по ссылкам ниже, чтобы спросить это, что говорит, что мы не должны выполнять модульный тест для локальной переменной.

переопределить локальную переменную Python-функции в unittest

Здесь я вижу некоторые методы, которые можно использовать для проверки локальной переменной в конце выполнения функции. https://coderanch.com/t/679691/engineering/test-local-variable-method-junit

Есть ли способ экспортировать локальную переменную для модульного теста этой функции?

1 Ответ

0 голосов
/ 06 июня 2019

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

import inspect
from textwrap import dedent
import re


class MockFunction:
    """ Defines a Mock for functions to explore the details on their execution.
    """
    def __init__(self, func):
        self.func = func

    def __call__(mock_instance, *args, **kwargs):
        # Add locals() to function's return
        code = re.sub('[\\s]return\\b', ' return locals(), ', dedent(
            inspect.getsource(mock_instance.func)))
        code = code + f'\nloc, ret = {mock_instance.func.__name__}(*args, **kwargs)'
        loc = {'args': args, 'kwargs': kwargs}
        exec(code, mock_instance.func.__globals__, loc)
        # Put execution locals into mock instance
        for l,v in loc['loc'].items():
            setattr(mock_instance, l, v)
        return loc['ret']

Чтобы использовать это:

import unittest
from unittest import mock

# This is the function you would like to test. It can be defined somewhere else
def foo(param_a, param_b=10):
    param_a = f'Hey {param_a}'  # Local only
    param_b += 20  # Local only 
    return 'bar'

# Define a test to validate what happens to local variables when you call that function
class SimpleTest(unittest.TestCase):

    @mock.patch(f'{__name__}.foo', autospec=True, side_effect=MockFunction(foo))
    def test_foo_return_and_local_params_values(self, mocked):
        ret = foo('A')
        self.assertEqual('Hey A', mocked.side_effect.param_a)
        self.assertEqual(30, mocked.side_effect.param_b)
        self.assertEqual('bar', ret)

Как мы видим, вы смогли проверить, что случилось с локальными переменными, используя side_effect из вашей смоделированной функции.

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