Объединение тестов носа с контрактами для Python - PullRequest
2 голосов
/ 23 июня 2009

Я использую контракты для Python , чтобы указывать предиконы / постусловия / инварианты. Я также использую doctests для тестирования модулей.

Я бы хотел, чтобы все мои модульные тесты doctest выполнялись с включенными контрактами, и я хотел бы запустить свои тесты, используя nose . К сожалению, если я запускаю тесты с носом, он не выполняет предварительные / пост / инвариантные утверждения. Я вставил функцию установки в каждый файл .py, чтобы гарантировать, что contract.checkmod будет вызван

def setup():
    import contract
    contract.checkmod(__name__)

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

С другой стороны, если я запускаю doctest, вызывая doctest.testmod, pre / post / inv будет вызываться:

def _test():
    import contract
    contract.checkmod(__name__)
    import doctest
    doctest.testmod()

if __name__=='__main__':    
    _test()

Вот пример скрипта Python, тест которого будет успешным, если вызывается напрямую, но не пройден, если вызывается с носом:

import os

def setup():
    import contract
    contract.checkmod(__name__)

def delete_file(path):
    """Delete a file. File must be present.

    >>> import minimock
    >>> minimock.mock('os.remove')
    >>> minimock.mock('os.path.exists', returns=True)

    >>> delete_file('/tmp/myfile.txt')
    Called os.path.exists('/tmp/myfile.txt')
    Called os.remove('/tmp/myfile.txt')

    >>> minimock.restore()

    pre: os.path.exists(path)
    """
    os.remove(path)

if __name__ == '__main__':
    setup()
    import doctest
    doctest.testmod()

Когда я запускаю вышеуказанный файл автономно, тесты проходят:

$ python contracttest.py -v
Trying:
    import minimock
Expecting nothing
ok
Trying:
    minimock.mock('os.remove')
Expecting nothing
ok
Trying:
    minimock.mock('os.path.exists', returns=True)
Expecting nothing
ok
Trying:
    delete_file('/tmp/myfile.txt')
Expecting:
    Called os.path.exists('/tmp/myfile.txt')
    Called os.remove('/tmp/myfile.txt')
ok
Trying:
    minimock.restore()
Expecting nothing
ok
2 items had no tests:
    __main__
    __main__.setup
1 items passed all tests:
   5 tests in __main__.delete_file
5 tests in 3 items.
5 passed and 0 failed.
Test passed.

Вот оно с носом:

$ nosetests --with-doctest contracttest.py
F
======================================================================
FAIL: Doctest: contracttest.delete_file
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/doctest.py", line 2131, in runTest
    raise self.failureException(self.format_failure(new.getvalue()))
AssertionError: Failed doctest test for contracttest.delete_file
  File "/Users/lorin/Desktop/contracttest.py", line 10, in delete_file

----------------------------------------------------------------------
File "/Users/lorin/Desktop/contracttest.py", line 17, in contracttest.delete_file
Failed example:
    delete_file('/tmp/myfile.txt')
Expected:
    Called os.path.exists('/tmp/myfile.txt')
    Called os.remove('/tmp/myfile.txt')
Got:
    Called os.remove('/tmp/myfile.txt')


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