Python Unit Test Зависимые функции - PullRequest
0 голосов
/ 19 марта 2019

Я использую pytest для написания некоторых модульных тестов, и мне интересно, каков наилучший подход для тестирования «зависимых» функций.Допустим, у меня есть две функции:

def set_file(filename, filecontents):
    # stores file as key in memcache

def get_file(filename):
    # returns the contents of the filename if it exists in cache

В настоящее время у меня есть модульный тест «счастливый путь», который выглядит примерно так:

def test_happy_path():
    assert not get_file('unit test') # check that return of non-existent file is None
    set_file('unit test', 'test content') # set file contents
    assert get_file('unit test') == 'test content'  # check that return matches input

Мой вопрос заключается в том, действителен ли этот подход?Должен ли я пытаться смоделировать данные set_file при тестировании get_file, чтобы получить модульный тест, который не имеет зависимостей, созданных set file?Если так, то как бы я это высмеял, тем более что set_file использует pymemcached?

1 Ответ

1 голос
/ 19 марта 2019

Ваш юнит-тест выглядит отлично.Нет ничего плохого в установке файлов на pymemcache во время тестов, потому что все остается в локальной памяти.Также вполне нормально иметь такие «установочные» зависимости в ваших тестах.

Если вы заметили, что у вас начинается несколько тестов, зависящих от одной и той же настройки, вы можете использовать pytest fixtures для настройкидо такой зависимости установки и демонтажа.Пример кода может выглядеть следующим образом:

import pytest

FILENAME = "test-file"
TEST_CONTENT = "some content"


@pytest.fixture()
def set_file_contents():
    assert not get_file(FILENAME)
    set_file(FILENAME, TEST_CONTENT)
    yield FILENAME, TEST_CONTENT  # These values are provided to the test
    delete_file(FILENAME)  # This is run after the test
    assert not get_file(FILENAME)


class TestFileContents:

    def test_get_file(self, set_file_contents):
        filename, file_contents = set_file_contents
        assert get_file(filename) == file_contents

Использование осветителей в вашем случае является излишним, но вы видите основную идею.

...