Тестирование кода Python в потоке без изменений? - PullRequest
2 голосов
/ 26 января 2011

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

# long-lived code
import xmlrpclib
s = xmlrpclib.ServerProxy('http://XXX:yyyy')
def do_stuff():
    while True:
        ...
        if s.xyz():
            s.do_thing(...)

_

# test code
import threading, time
# stub out xmlrpclib
def run_do_stuff():
    other_code.do_stuff()

def setUp():
    t = threading.Thread(target=run_do_stuff)
    t.setDaemon(True)

def tearDown():
    # somehow kill t
    t.join()

def test1():
    t.start()
    time.sleep(5)
    assert some_XMLRPC_side_effects

Последняя большая проблема заключается в том, что тестируемый код предназначен для вечной работы, до нажатия Ctrl-C, и я не вижу способа заставить его вызвать исключение или иным образом уничтожить поток, чтобы я мог его запустить с нуля без изменения кода, который я тестирую. Я теряю возможность опрашивать любые флаги из моего потока, как только я вызываю тестируемую функцию.

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

Ответы [ 2 ]

4 голосов
/ 26 января 2011

Последняя большая проблема заключается в том, что тестируемый код предназначен для выполнения вечно, до нажатия Ctrl-C, и я не вижу способа заставить его вызвать исключение или иным образом уничтожить поток

Смысл тест-ориентированной разработки заключается в том, чтобы переосмыслить ваш дизайн так, чтобы он был проверяемым.untestable.

Так что цикл завершается.Это не повредит производству.Это улучшит тестируемость.

«Предназначен для вечной работы» не предназначен для тестируемости.Так что исправьте дизайн, чтобы он был тестируемым.

0 голосов
/ 01 апреля 2011

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

Я могу написать небольшую заглушку Python, чтобы выполнить макет и запустить кодконтролируемый путь.Затем я могу написать реальные тесты, чтобы запустить мою заглушку в подпроцессе для каждого теста и уничтожить ее после завершения каждого теста.Процесс тестирования может взаимодействовать с заглушкой через stdio или с сокетом.

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