2013-05-23 22 views
5

Obecnie piszę niektóre testy funkcjonalne za pomocą nosa. Biblioteka, którą testuję, manipuluje strukturą katalogów.Pobierz nazwę bieżącego testu w konfiguracji przy użyciu nosa

Aby uzyskać powtarzalne wyniki, przechowuję szablon struktury katalogu testowego i tworzę kopię tego przed wykonaniem testu (robię to wewnątrz funkcji testów setup). To upewnia mnie, że zawsze mam dobrze zdefiniowany stan na początku testu.

Teraz mam dwa dodatkowe wymagania:

  1. Jeśli test nie powiedzie się, chciałbym strukturę katalogów on prowadzony na nie być nadpisane lub usunięte, tak, że można analizować ten problem.
  2. Chciałbym móc równolegle wykonywać wiele testów.

Oba te wymagania można rozwiązać, tworząc nową kopię o innej nazwie dla każdego wykonywanego testu. Z tego powodu chciałbym uzyskać dostęp do nazwy testu, który jest obecnie wykonywany w funkcji setup, dzięki czemu mogę odpowiednio nazwać kopię. Czy jest jakiś sposób, aby to osiągnąć?

Przykładową ilustrację Kod:

def setup_func(test_name): 
    print "Setup of " + test_name 

def teardown_func(test_name): 
    print "Teardown of " + test_name 

@with_setup(setup_func, teardown_func) 
def test_one(): 
    pass 

@with_setup(setup_func, teardown_func) 
def test_two(): 
    pass 

oczekiwany wynik:

Setup of test_one 
Teardown of test_one 
Setup of test_two 
Teardown of test_two 

Wstrzykiwanie nazwę jako parametr byłby najpiękniejszy rozwiązanie, ale jestem otwarty na inne propozycje, jak również.

Odpowiedz

1

Mam rozwiązanie, które działa dla funkcji testowych, przy użyciu niestandardowego dekoratora:

def with_named_setup(setup=None, teardown=None): 
    def wrap(f): 
     return with_setup(
      lambda: setup(f.__name__) if (setup is not None) else None, 
      lambda: teardown(f.__name__) if (teardown is not None) else None)(f) 
    return wrap 

@with_named_setup(setup_func, teardown_func) 
def test_one(): 
    pass 

@with_named_setup(setup_func, teardown_func) 
def test_two(): 
    pass 

To ponowne wykorzystanie istniejącej with_setup dekorator, ale wiąże nazwę funkcji zdobione do setup i teardown funkcji przekazanych jako parametry .

6

Brzmi jak self._testMethodName lub self.id() powinien działać dla Ciebie. Są to właściwości i metoda klasy unittest.TestCase. Np .:

from django.test import TestCase 


class MyTestCase(TestCase): 
    def setUp(self): 
     print self._testMethodName 
     print self.id() 

    def test_one(self): 
     self.assertIsNone(1) 

    def test_two(self): 
     self.assertIsNone(2) 

drukuje:

... 
AssertionError: 1 is not None 
-------------------- >> begin captured stdout << --------------------- 
test_one 
path.MyTestCase.test_one 

--------------------- >> end captured stdout << ---------------------- 
... 
AssertionError: 2 is not None 
-------------------- >> begin captured stdout << --------------------- 
test_two 
path.MyTestCase.test_two 

--------------------- >> end captured stdout << ---------------------- 

Zobacz także:

nadzieję, że pomoże.

+0

Hm, dzięki za tę sugestię , ale wolałbym rozwiązanie, które nie wymaga wyprowadzenia z 'unittest.TestCase'. –

+0

Jasne, rozumiem. Myślę, że twoje rozwiązanie, używając '__name__' wewnątrz dekoratora, wygląda całkiem nieźle. – alecxe

+0

Pomogło to ... dzięki ... –

0

W przypadku, gdy nie chcesz podklasy unittest.TestCase lub użyć niestandardowego dekoratora (jak wyjaśniono w innych odpowiedzi) można uzyskać informacje o kopanie przez stos wywołań:

import inspect 

def get_current_case(): 
    ''' 
    Get information about the currently running test case. 

    Returns the fully qualified name of the current test function 
    when called from within a test method, test function, setup or 
    teardown. 

    Raises ``RuntimeError`` if the current test case could not be 
    determined. 

    Tested on Python 2.7 and 3.3 - 3.6 with nose 1.3.7. 
    ''' 
    for frame_info in inspect.stack(): 
     if frame_info[1].endswith('unittest/case.py'): 
      return frame_info[0].f_locals['self'].id() 
    raise RuntimeError('Could not determine test case') 
Powiązane problemy