2012-03-08 13 views
8

¿Existe un plugin existente que podría ser utilizado como:plug-nariz por fallos esperados

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

Si la prueba falla, parecería como una prueba omitida:

$ nosetests 
...S.. 

..pero Si pasa inesperados, parece similar a un fracaso, tal como:

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

tipo de like SkipTest, pero no imple mencionada como una excepción que impide que la prueba se ejecute.

Lo único que puedo encontrar es this ticket trata de apoyar el decorador unittest2 expectedFailure (aunque yo prefiero no usar unittest2, incluso si la nariz lo apoyó)

Respuesta

11

No sé acerca de un plugin de la nariz, pero se puede Escribe fácilmente tu propio decorador para hacer eso. He aquí una implementación sencilla:

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 

Si me quedo estas pruebas:

@expected_failure 
def test_not_implemented(): 
    assert False 

@expected_failure 
def test_unexpected_success(): 
    assert True 

Me da la siguiente salida de la nariz:

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) 
+0

Oh, por supuesto! Con un pequeño ajuste, sube SkipTest cuando la prueba falla, eso es perfecto, gracias \ o/ – dbr

3

Perdóname si he entendido bien, pero ISN el comportamiento que desea proporcionado por la biblioteca unittest de core python con el decorador expectedFailure, que es, por extensión, compatible con nose?

Para ver un ejemplo de uso, vea docs y post about its implementation.

+0

Sí, eso es cierto, pero una de las cosas que me gusta de la nariz es la capacidad de escribir pruebas como funciones, en lugar de métodos en subclases como es requerido por el módulo unittest integrado (por ejemplo, 'def test_exampleblah(): pass') – dbr

+2

Si ese es el problema, entonces quizás le gustaría [' pytest'] (http://pytest.org/latest/contents.html), que es [compatible con 'nose'] (http://pytest.org/latest/nose.html), también admite [pruebas como funciones] (http://pytest.org/latest/assert.html#asserting-with -the-assert-statement) y tiene el decorador ['xfail'] (http://pytest.org/latest/skipping.html#mark-a-test-function-as-expected-to-fail). –

+2

En mi experiencia, 'unittest.expectedFailure' es * no * compatible con Nose. [Error de nariz 33] (https: // github.com/nose-devs/nose/issues/33) coincide. –

-2

Puede hacerlo con una de dos maneras:

  1. nose.tools.raises decorador

    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") 
    

pruebas fallarán si excepción no se levanta

Sí, lo sé, preguntó hace 3 años :)

Cuestiones relacionadas