Временный ftp сервер для тестирования - PullRequest
0 голосов
/ 18 сентября 2018

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

Я бы хотел избежать необходимости использования настоящего FTP-сервера в моем тесте.

Какой самый простой способ проверить мой код?

Есть несколько крайних случаев, которые я хотел бы проверить.

Например, мой код пытается создать каталог, который ужесуществует.

Я хочу перехватить исключение и выполнить соответствующую обработку ошибок.

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

Обновление Почему я не хочу делать насмешки: я знаю, что могу решить эту проблему с помощью насмешек.Я мог бы издеваться над библиотекой, которую я использую (я использую ftputil от Стефана Шварцера) и таким образом протестировать свой код.Но что произойдет, если в будущем я изменю свой код и использую другую библиотеку FTP?Тогда мне нужно будет переписать свой тестовый код тоже.Я ленюсь.Я хочу иметь возможность переписать реальный код, который я тестирую, не касаясь тестового кода.Но, возможно, мне все еще не хватает классного способа использования насмешек.

Решено с https://github.com/tbz-pariv/ftpservercontext

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

ContextManager:

class FTPServerContext(object):

    banner = 'FTPServerContext ready'

    def __init__(self, directory_to_serve):
        self.directory_to_serve = directory_to_serve

    def __enter__(self):
        cmd = ['serve_directory_via_ftp']
        self.pipe = subprocess.Popen(cmd, cwd=self.directory_to_serve)
        time.sleep(2) # TODO check banner via https://stackoverflow.com/a/4896288/633961

    def __exit__(self, *args):
        self.pipe.kill()

console_script:

def serve_directory_via_ftp():
    # https://pyftpdlib.readthedocs.io/en/latest/tutorial.html
    authorizer = DummyAuthorizer()
    authorizer.add_user('testuser-ftp', 'testuser-ftp-pwd', '.', perm='elradfmwMT')
    handler = FTPHandler
    handler.authorizer = authorizer
    handler.banner = testutils.FTPServerContext.banner
    address = ('localhost', 2121)
    server = FTPServer(address, handler)
    server.serve_forever()

Использование в тесте:

def test_execute_job_and_create_log(self):
    temp_dir = tempfile.mkdtemp()
    with testutils.FTPServerContext(temp_dir) as ftp_context:
        execute_job_and_create_log(...)

Код находится в свободном доступе под любой лицензией, которую вы хотите.Было бы здорово, если бы вы сделали этот pip-инсталлируемый пакет на pypi.org.

0 голосов
/ 18 сентября 2018

Во-первых, чтобы прислушаться к этому или пути.Вы не спрашиваете о Mocking, ваш вопрос о Faking.

  • Fake, реализация интерфейса, которая выражает правильное поведение, но не может использоваться в производстве.

  • Макет, реализация интерфейса, который реагирует на взаимодействия на основе скриптового ответа (сценарий, как в сценарии фильма, а не некомпилированный код).

  • Stub,реализация интерфейса без какой-либо реальной реализации.Обычно используется в тестах стиля mcguffin.

Обратите внимание, что в каждом случае используется слово "interface".

Ваш вопрос спрашивает, как подделать порт TCP таким образом, чтобыпо поведению это FTP-сервер с STATE файловой системы rw.

Это сложно.

Гораздо проще MOCK-интерфейс внутреннего интерфейса, который выдается при вызове функции mkdir.

Если вам нужно ПОДДЕРЖИВАТЬ FTP-сервер.Я предлагаю создать Docker-контейнер с сервером в нужном вам состоянии и использовать Docker для обработки повторяемости и жизненного цикла FTP-сервера.

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