Python Unittest Howto - PullRequest
       8

Python Unittest Howto

3 голосов
/ 16 апреля 2010

Хотелось бы узнать, как я могу выполнить модульное тестирование следующего модуля.

def download_distribution(url, tempdir):
    """ Method which downloads the distribution from PyPI """
    print "Attempting to download from %s" % (url,)

    try:
        url_handler = urllib2.urlopen(url)
        distribution_contents = url_handler.read()
        url_handler.close()

        filename = get_file_name(url)

        file_handler = open(os.path.join(tempdir, filename), "w")
        file_handler.write(distribution_contents)
        file_handler.close()
        return True

    except ValueError, IOError:
        return False

Ответы [ 3 ]

5 голосов
/ 16 апреля 2010

Авторы модульных тестов скажут вам, что модульные тесты должны быть автономными, то есть они не должны иметь доступа к сети или файловой системе (особенно не в режиме записи). Тесты сети и файловой системы выходят за рамки модульных тестов (хотя вы можете подвергнуть их интеграционным тестам).

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

т.е. (слегка сокращенно для лучшего чтения):

def get_web_content(url):
    # Extracted code
    url_handler = urllib2.urlopen(url)
    content = url_handler.read()
    url_handler.close()
    return content

def write_to_file(content, filename, tmpdir):
    # Extracted code
    file_handler = open(os.path.join(tempdir, filename), "w")
    file_handler.write(content)
    file_handler.close()

def download_distribution(url, tempdir):
    # Original code, after extractions
    distribution_contents = get_web_content(url)
    filename = get_file_name(url)
    write_to_file(distribution_contents, filename, tmpdir)
    return True

И, в тестовом файле:

import module_I_want_to_test

def mock_web_content(url):
    return """Some fake content, useful for testing"""
def mock_write_to_file(content, filename, tmpdir):
    # In this case, do nothing, as we don't do filesystem meddling while unit testing
    pass

module_I_want_to_test.get_web_content = mock_web_content
module_I_want_to_test.write_to_file = mock_write_to_file

class SomeTests(unittest.Testcase):
    # And so on...

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

5 голосов
/ 16 апреля 2010

Неясный вопрос. Если вы просто ищете учебник для юнит-тестирования в целом с уклоном Python, я рекомендую Марку Пилигриму "Dive Into Python", в котором есть глава о юнит-тестировании с Python . В противном случае вам необходимо выяснить, какие конкретно проблемы возникают при тестировании этого кода.

0 голосов
/ 23 апреля 2010

Чтобы смоделировать urllopen, вы можете предварительно получить несколько примеров, которые затем сможете использовать в своих юнит-тестах. Вот пример, с которого можно начать:

def urlopen(url):
    urlclean = url[:url.find('?')] # ignore GET parameters
    files = {
        'http://example.com/foo.xml': 'foo.xml',
        'http://example.com/bar.xml': 'bar.xml',
    }
    return file(files[urlclean])
yourmodule.urllib.urlopen = urlopen
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...