2015-05-27 9 views
5

पिछले जीवन में मैंने जावा विकास का एक उचित हिस्सा किया, और JUnit Theories को काफी उपयोगी पाया। क्या पाइथन के लिए कोई समान तंत्र है?पायथन में यूनिट परीक्षण सिद्धांत?

वर्तमान में मैं की तरह कुछ कर रहा हूँ:

def some_test(self): 
    cases = [('some sample input', 'some expected value'), 
      ('some other input', 'some other expected value')] 

    for value, expected in cases: 
     result = method_under_test(value) 
     self.assertEqual(expected, result) 

लेकिन इस बल्कि भद्दा है, अगर पहले "मामले" विफल रहता है, अन्य सभी चलाने के लिए असफल।

+0

'try-catch' – Gocht

+0

का उपयोग करें यह मेरी समझ है कि सभी मामले चलेंगे, लेकिन परीक्षण विफल हो जाएगा (जैसा कि यह होना चाहिए) –

+0

@Adammith: '' 'मामलों' के भीतर प्रत्येक टुपल अनिवार्य रूप से एक अलग परीक्षण केस है । यदि लूप के माध्यम से पहली बार विफल रहता है, तो लूप के माध्यम से कोई और पुनरावृत्ति नहीं होगी और ऐसे बाद के मामलों को निष्पादित नहीं किया जाएगा। –

उत्तर

2

यह pytest तरह लग रहा है कुछ इस तरह कर सकते हैं: http://pytest.org/latest/parametrize.html#parametrize-basics

मैं इसे बाहर अपने आप को प्रयास नहीं किया है।

+0

यह वही है जो मैं चाहता हूं। अब मुझे अपने सहकर्मियों को py.test के लिए नाक ड्रॉप करने के लिए मनाने के लिए है। :) धन्यवाद! –

+0

'यही वही है जो मैं चाहता हूं। अब मुझे अपने सहकर्मियों को py.test के लिए नाक ड्रॉप करने के लिए मनाने के लिए है। :) 'मैं काम और निजी पर भारी मात्रा में उपयोग करता हूं, और यह पाइथन में प्रोग्रामिंग करते समय सबसे आनंददायक अनुभवों में से एक है। '@ pytest.mark.parametrize' इसकी शानदार सुविधाओं में से एक है। – timmwagener

0

मुझे किसी भी सामान्य परीक्षण ढांचे में इसके लिए किसी भी बिल्टिन से अवगत नहीं है। आपके समाधान के साथ एकमात्र समस्या यह है कि पुनरावृत्ति परीक्षण के अंदर है। बल्कि यह बाहर हो सकता है और परीक्षण, हो सकता है इस

import unittest 


def _apply(func, args): 
    """Return a function with args applied after first argument""" 
    def wrapped(self): 
     return func(self, *args) 
    return wrapped 


class TheoryMeta(type): 
    """Metaclass that replaces test methods with multiple methods for each test case""" 
    def __new__(meta, name, bases, attrs): 
     newattrs = {} 
     cases = attrs.pop('cases', []) 

     for name, value in attrs.items(): 
      if not name.startswith('test') or not callable(value): 
       newattrs[name] = value 
       continue 

      for n, args in enumerate(cases): 
       test_name = '%s_%d' % (name, n) 
       newattrs[test_name] = _apply(value, args) 

     return super().__new__(meta, name, bases, newattrs) 


class TestCase(unittest.TestCase, metaclass=TheoryMeta): 
    pass 

तो यह उपयोग करने के लिए की तरह कुछ उत्पन्न करनी चाहिए, एक TestCase उपवर्ग एक cases विशेषता है जो परीक्षण मामले पर प्रत्येक परीक्षा पद्धति को लागू करने के लिए तर्कों की सूची है कि बनाने के ।

class TestAdd(TestCase): 
    cases = [ 
     # (a, b) 
     (1, 1), 
     (2, 0), 
     (3, 0), 
    ] 

    def test_add(self, a, b): 
     self.assertEqual(a + b, 2) 

====================================================================== 
FAIL: test_add_2 (__main__.__qualname__) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "test.py", line 7, in wrapped 
    return func(self, *args) 
    File "test.py", line 41, in test_add 
    self.assertEqual(a + b, 2) 
AssertionError: 3 != 2 

---------------------------------------------------------------------- 
Ran 3 tests in 0.001s 

अपनी आवश्यकताओं और परीक्षण सेटअप के आधार पर, आप पा सकते बेहतर बल्कि एक metaclass का उपयोग करने से सिर्फ बंदर-पैच एक testcase पर उत्पन्न परीक्षण तरीकों के लिए। या आप उन्हें TestLoader पर ओवरराइडन loadTestsFrom... में उत्पन्न कर सकते हैं। किसी भी मामले में, परीक्षण विधियों को उत्पन्न करने के लिए नमूना डेटा का उपयोग करें।

0

यह पता चला है, वहाँ की तरह कुछ है के रूप में आप इस अंतर्निहित अजगर 3.4 के रूप में - subTest: https://docs.python.org/3.4/library/unittest.html#distinguishing-test-iterations-using-subtests

काफी के रूप में py.test के पैरामिट्रीकृत परीक्षण, या JUnit सिद्धांतों के रूप में सुंदर नहीं है, लेकिन आप एक मानक चाहते हैं -लिब दृष्टिकोण & पायथन के अपेक्षाकृत हाल के संस्करण का उपयोग कर रहे हैं यह एक विकल्प है।

संबंधित मुद्दे