носовой плагин для ожидаемых неудач - PullRequest
9 голосов
/ 08 марта 2012

Существует ли существующий плагин, который можно использовать как:

@nose.plugins.expectedfailure
def not_done_yet():
    a = Thingamajig().fancynewthing()
    assert a == "example"

Если тест не пройден, он будет выглядеть как пропущенный тест:

$ nosetests
...S..

.. но если это неожиданно пройдет, это будет похоже на сбой, возможно, как:

=================================
UNEXPECTED PASS: not_done_yet
---------------------------------
-- >> begin captured stdout << --
Things and etc
...

Тип , как SkipTest , но не реализован как исключение, которое препятствует выполнению теста.

Единственное, что я могу найти, это этот билет о поддержке декоратора unittest2 Ожидаемый отказ (хотя я бы предпочел не использовать unittest2, даже если его поддерживает нос)

Ответы [ 3 ]

11 голосов
/ 08 марта 2012

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

import functools
import nose

def expected_failure(test):
    @functools.wraps(test)
    def inner(*args, **kwargs):
        try:
            test(*args, **kwargs)
        except Exception:
            raise nose.SkipTest
        else:
            raise AssertionError('Failure expected')
    return inner

Если я запускаю эти тесты:

@expected_failure
def test_not_implemented():
    assert False

@expected_failure
def test_unexpected_success():
    assert True

Я получаю следующий вывод из носа:

tests.test.test_not_implemented ... SKIP
tests.test.test_unexpected_success ... FAIL

======================================================================
FAIL: tests.test.test_unexpected_success
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python32\lib\site-packages\nose-1.1.2-py3.2.egg\nose\case.py", line 198, in runTest
    self.test(*self.arg)
  File "G:\Projects\Programming\dt-tools\new-sanbi\tests\test.py", line 16, in inner
    raise AssertionError('Failure expected')
AssertionError: Failure expected

----------------------------------------------------------------------
Ran 2 tests in 0.016s

FAILED (failures=1)
4 голосов
/ 13 августа 2014

Простите, если я неправильно понял, но разве поведение, которое вы желаете, обеспечивается библиотекой unittest основного питона с декоратором expectedFailure, который, по расширению, совместим с nose?

Пример использования см. В документах и о его реализации .

1 голос
/ 10 ноября 2015

Вы можете сделать это одним из двух способов:

  1. nose.tools.raises декоратор

    from nose.tools import raises
    
    @raises(TypeError)
    def test_raises_type_error():
        raise TypeError("This test passes")
    
  2. nose.tools.assert_raises

    from nose.tools import assert_raises
    
    def test_raises_type_error():
        with assert_raises(TypeError):
            raise TypeError("This test passes")
    

Тесты не пройдут, если исключение не возникнет.

Да, я знаю, спросили 3 года назад:)

...