2013-05-23 10 views
5

का उपयोग कर सेटअप में वर्तमान परीक्षण का नाम प्राप्त करें मैं वर्तमान में नाक का उपयोग करके कुछ कार्यात्मक परीक्षण लिख रहा हूं। जिस लाइब्रेरी का मैं परीक्षण कर रहा हूं वह एक निर्देशिका संरचना में हेरफेर करता है।नाक

पुनरुत्पादित परिणाम प्राप्त करने के लिए, मैं एक परीक्षण निर्देशिका संरचना का एक टेम्पलेट संग्रहीत करता हूं और परीक्षण निष्पादित करने से पहले इसकी एक प्रति बना देता हूं (मैं परीक्षण setup फ़ंक्शन के अंदर करता हूं)। यह सुनिश्चित करता है कि परीक्षण की शुरुआत में मेरे पास हमेशा एक अच्छी तरह परिभाषित स्थिति हो। एक परीक्षण में विफल रहता है

  1. हैं, मैं, निर्देशिका संरचना यह ओवरराइट किया या हटाया जा नहीं करने पर संचालित चाहते हैं ताकि मैं समस्या का विश्लेषण कर सकते हैं:

    अब मैं दो और आवश्यकताओं है।

  2. मैं समानांतर में कई परीक्षण चलाने में सक्षम होना चाहता हूं।

इन दोनों आवश्यकताओं को निष्पादित किए गए प्रत्येक परीक्षण के लिए एक अलग नाम के साथ एक नई प्रति बनाकर हल किया जा सकता है। इस कारण से, मैं परीक्षण के नाम तक पहुंच प्राप्त करना चाहता हूं जिसे वर्तमान में setup फ़ंक्शन में निष्पादित किया गया है, ताकि मैं प्रतिलिपि को उचित रूप से नाम दे सकूं। क्या इसे प्राप्त करने का कोई तरीका है?

एक उदाहरण कोड उदाहरण:

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 

अपेक्षित उत्पादन:

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

एक पैरामीटर के रूप नाम इंजेक्शन सबसे अच्छा समाधान होगा, लेकिन मैं भी अन्य सुझावों के लिए खुला रहा हूँ।

उत्तर

1

मैं एक समाधान है कि परीक्षण कार्यों के लिए काम करता है, एक कस्टम डेकोरेटर का उपयोग कर:

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 

यह पुनः उपयोग कर लेता मौजूदा with_setup डेकोरेटर, लेकिन setup और teardown कार्यों पैरामीटर के रूप में पारित कर दिया करने के लिए सजाया समारोह के नाम पर बांधता ।

6

self._testMethodName या self.id() जैसे लगता है आपके लिए काम करना चाहिए। ये unittest.TestCase कक्षा पर संपत्ति और विधि हैं। उदा .:

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) 

प्रिंट:

... 
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 << ---------------------- 

यह भी देखें:

आशा है कि मदद करता है।

+0

हम्म, धन्यवाद , लेकिन मैं एक समाधान पसंद करूंगा जिसे 'unittest.TestCase' से प्राप्त करने की आवश्यकता नहीं है। –

+0

निश्चित रूप से, इसे मिला। मुझे लगता है कि सजावट के अंदर '__name__' का उपयोग करके आपका समाधान बहुत अच्छा दिखता है। – alecxe

+0

इससे मदद मिली ... धन्यवाद ... –

0

मामले में आप न unittest.TestCase उपवर्ग या (के रूप में अन्य उत्तर में बताया गया है) एक कस्टम डेकोरेटर का उपयोग आप कॉल स्टैक के माध्यम से खुदाई से जानकारी प्राप्त कर सकते हैं: इस सुझाव के लिए

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') 
संबंधित मुद्दे