плъгин за нос за очаквани повреди

Има ли съществуващ плъгин, който може да се използва като:

@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, дори носът да го поддържа)


person dbr    schedule 08.03.2012    source източник


Отговори (3)


Не знам за плъгин за нос, но можете лесно да напишете свой собствен декоратор, за да направите това. Ето една проста реализация:

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)
person aquavitae    schedule 08.03.2012
comment
О, разбира се! С малка корекция, така че да повдига SkipTest, когато тестът е неуспешен, това е перфектно - благодаря \o/ - person dbr; 08.03.2012

Извинете ме, ако съм разбрал погрешно, но поведението, което желаете, не е ли предоставено от основната библиотека unittest на python с декоратора expectedFailure, който е — чрез разширение — съвместим с nose?

За пример за използване вижте документи и публикувайте за прилагането му.

person Griffith Rees    schedule 13.08.2014
comment
Да, това е вярно, но едно от нещата, които харесвам в nos, е възможността да пиша тестове като функции, а не методи в подкласове, както се изисква от вградения модул unittest (напр. def test_exampleblah(): pass) - person dbr; 13.08.2014
comment
Ако това е проблемът, тогава може би бихте искали pytest, което е съвместим с nose, също поддържа тества като функции и има xfail декоратор. - person Griffith Rees; 16.08.2014
comment
Според моя опит unittest.expectedFailure не е съвместим с Nose. Nose bug 33 се съгласява. - person Rob Kennedy; 15.11.2014
comment
не е съвместим с Nose. Изглежда ми достатъчно съвместим през 2018 г. - person JL Peyret; 26.07.2018

Можете да го направите по един от двата начина:

  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 години :)

person voy    schedule 10.11.2015
comment
Защо това беше гласувано против? AFAICT това е най-добрият отговор. - person Nathaniel Verhaaren; 19.10.2018