2012-06-25 17 views
8

Nos ma bug - nazwy testowe utworzone przez generatory nie są buforowane, więc błąd wygląda tak, jak miało to miejsce w ostatnim teście, a nie faktyczny test, w którym nie powiodło się. Mam wokół niego po solution w dyskusji raportu błędów, ale działa tylko dla nazw pokazanych na standardowe wyjście, a nie w raporcie XML (--with-xUnit)Zmiana nazw testów utworzonych przez generatory testu nosa

from functools import partial, update_wrapper 
def testGenerator(): 
    for i in range(10): 
     func = partial(test) 
     # make decorator with_setup() work again 
     update_wrapper(func, test) 
     func.description = "nice test name %s" % i 
     yield func 

def test(): 
    pass 

Wyjście z nosa jest zgodnie z oczekiwaniami, coś takiego jak

nice test name 0 ... ok 
nice test name 1 ... ok 
nice test name 2 ... ok 
... 

Ale nazwy testowe w XML są po prostu "testGenerator".

...<testcase classname="example" name="testGenerator" time="0.000" />... 

Jak mogę to zmienić tak, że indywidualne nazwy testów przedstawiono zarówno stdout i XML wyjście?

używam wersji 1.1.2 i nosetests Python 2.6.6

+0

Zmiana 'func .__ name__' lub 'func .__ doc__' nie działa. –

+0

A co z tworzeniem zestawu testów? – Apalala

+1

@Apalala dzięki, wydaje się, że to może rozwiązać. Chociaż nie mogę znaleźć żadnych informacji o tym, jak używać tego w nosie i jak miesza się z odkryciem testu nosa. Czy mógłbyś podać przykład? –

Odpowiedz

4

Można zmienić sposób, że nazwy nosie testy według adding a plugin który implementuje describeTest

from nose.plugins import Plugin 
class CustomName(Plugin): 
    "Change the printed description/name of the test." 
    def describeTest(self, test): 
     return "%s:%s" % (test.test.__module__, test.test.description) 

Będziesz wtedy musiał install this plugin i włącz go w inwokacji Nose.

1

Możesz dodać następujący wiersz.

testGenerator.__name__ = "nice test name %s" % i

Przykład:

from functools import partial, update_wrapper 
def testGenerator(): 
    for i in range(10): 
     func = partial(test) 
     # make decorator with_setup() work again 
     update_wrapper(func, test) 
     func.description = "nice test name %s" % i 
     testGenerator.__name__ = "nice test name %s" % i 
     yield func 

def test(): 
    pass 

Spowoduje to nazwy, które chcesz.

<testsuite name="nosetests" tests="11" errors="0" failures="0" skip="0"><testcase classname="sample" name="nice test name 0" time="0.000" /> 
+0

To prawie działa, ale wszystkie testy mają tę samą nazwę (nos 1.2.1, python 2.7.3) – Rog

1

Jak wspomina Ananth, można z niego korzystać.

testGenerator.__name__ 

Można również użyć zamiast tego

testGenerator.compat_func_name 

Jeśli klasa Test ma argumentów, polecam je currying, jak również currying with_setup. Używając lambda zapisuje import i myślę, że jest trochę czystszy. Na przykład,

from nose.tools import with_setup 

def testGenerator(): 
    for i in range(10): 
     func = with_setup(set_up, tear_down)(lambda: test(i)) 

     func.description = "nice test name %s" % i 
     testGenerator.compat_func_name = func.description 

     yield func 

def test(i): 
    pass 

def set_up(): 
    pass 

def tear_down(): 
    pass 
+0

Dobre wezwanie na curry –

0

przypadku korzystania nos i Eclipe za PyUnit:

import nose 

class Test(object): 
    CURRENT_TEST_NAME = None 

    def test_generator(self): 
     def the_test(*args,**kwargs): 
      pass 

     for i in range(10): 
      # Set test name 
      Test.CURRENT_TEST_NAME = "TestGenerated_%i"%i 
      the_test.description = Test.CURRENT_TEST_NAME 

      # Yield generated test 
      yield the_test,i 

    # Set the name of each test generated 
    test_generator.address = lambda arg=None:(__file__, Test, Test.CURRENT_TEST_NAME) 

który spowoduje, że nazwa, aby pokazać się ładnie w PyUnit również.

Generated test names

Powiązane problemy