2012-02-27 15 views
15

उपयोग करने के लिए किए गए दस्तावेज़ों के अनुसार:Django जब टियरडाउन विधि

एक testcase, दूसरे हाथ पर, टेबल काट-छांट नहीं करता है और एक परीक्षण की शुरुआत में प्रारंभिक डेटा लोड करें। इसके बजाय, यह एक डेटाबेस लेनदेन है कि परीक्षण के अंत में वापस लुढ़का हुआ है में परीक्षण कोड encloses। यह भी किसी भी प्रतिबद्ध जारी करने या डेटाबेस पर रोलबैक संचालन, यह सुनिश्चित करें कि परीक्षण के अंत में रोलबैक अपनी प्रारंभिक अवस्था में डेटाबेस पुनर्स्थापित करता है से परीक्षण के अंतर्गत कोड को रोकता है। में यह गारंटी देने के लिए कि सभी टेस्टकेस कोड एक स्वच्छ डेटाबेस से शुरू होते हैं, Django परीक्षण धावक पहले सभी टेस्टकेस परीक्षण चलाता है, किसी भी अन्य परीक्षण (उदा। सिद्धांत) से पहले डेटाबेस को इसके मूल स्थिति में बहाल कर सकता है।

तो अगर मैं एक परीक्षण है कि इस तरह दिखता है:

class GeneralUserCreateTest(TestCase): 

    def setUp(self): 
     create_roletypes() 
     create_permissiontypes() 
     self.client = Client() 
     self.event = create_event() 

    def test_create(self): 
     create_url = reverse('event_user_signup', args=[self.event.slug]) 

     post_data = { 
      'signup-account-email': '[email protected]', 
      'signup-account-password': 'foobar', 
      'signup-account-password2': 'foobar', 
      'signup-account-first_name': 'Foo', 
      'signup-account-last_name': 'Bar', 
     } 
     response = self.client.post(create_url, data=post_data) 
     self.assertEqual(response.status_code, 302) 

     # check creation of user object 
     self.assertEqual(User.objects.filter(email=post_data['signup-account-email']).count(), 1) 
     user = User.objects.get(username=post_data['signup-account-email']) 

     # user and profile objects created 
     self.assertEqual(User.objects.all().count(), 1) 
     self.assertEqual(Profile.objects.all().count(), 1) 

     # get the first user and profile object to test against submitted field 
     user = User.objects.all()[0] 
     profile = Profile.objects.all()[0] 
     role = Role.objects.filter(event=self.event, profiles=profile)[0] 
     self.assertEqual(role.roletype.name, 'General') 
     self.assertEqual(user.username, post_data['signup-account-email']) 
     self.assertEqual(user.email, post_data['signup-account-email']) 
     self.assertEqual(profile.first_name, post_data['signup-account-first_name']) 
     self.assertEqual(profile.last_name, post_data['signup-account-last_name']) 

यह अभी भी एक teardown विधि को चलाने के लिए आवश्यक है या TestCase वर्ग यह की देखभाल करता है? यदि हां, तो जब एक teardown विधि TestCase वर्ग की उपलब्धता को देखते हुए इस्तेमाल करना चाहिए?

उत्तर

22

डेटाबेस के प्रयोजनों के लिए, tearDown क्योंकि प्रत्येक परीक्षा के लेनदेन में चलाया जाता है, सुंदर व्यर्थ है। हालांकि, परीक्षण में सबकुछ डेटाबेस में शामिल नहीं है। आप फ़ाइल निर्माण/पढ़ने, प्रक्रियाओं को स्पिन करने, खुले नेटवर्क कनेक्शन इत्यादि का परीक्षण कर सकते हैं। इन प्रकार की चीजों के लिए आमतौर पर आपको पूरा होने के बाद "बंद" करने की आवश्यकता होती है। यह वही है tearDown, के लिए है अर्थात अपने setUp विधि, डेटाबेस से संबंधित से सामान की सफाई है। (हालांकि, यदि आप वास्तव में सीधे डेटाबेस से कनेक्ट होते थे, यानी वास्तविक डीजेपीआई परीक्षणों को यह सुनिश्चित करने के लिए करना चाहिए कि सभी डीबीएपीआई सामान ठीक से काम करते हैं, तो आपको वहां भी साफ करना होगा।)

5

यदि आप हैं MongoDB या Redis की तरह एक वैकल्पिक डेटाबेस का उपयोग और आप प्रारंभिक डेटा (एक "संग्रह") का एक सेट में लोड करने के लिए की जरूरत है, तो आप भी tearDown विधि ओवरराइड करने के लिए की आवश्यकता होगी।

http://www.belchak.com/2011/02/07/unit-testing-django-with-a-nosql-backend/

देखें सामान्य में, django.test.TestCase प्रत्येक नए परीक्षण के शुरू में एक पूर्ण डेटाबेस फ्लश करता है। इसका मतलब है कि क्रिस प्रैट ने ऊपर वर्णित होने के कारण हमें अपने आंसू में वस्तुओं को मैन्युअल रूप से हटाने की आवश्यकता नहीं है। अगला परीक्षण सेटअप सुनिश्चित करेगा कि डेटाबेस साफ़ है।

हालांकि, अगर हम सिद्धांतों का उपयोग कर रहे हैं और unittest.TestCase, परीक्षण फिर से चलाने से पहले कोई डेटाबेस फ्लश नहीं होगा। एक परीक्षण की शुरुआत में, डेटाबेस पिछले परीक्षण बाएं जो भी राज्य में होगा। इसका मतलब है कि पिछले रन से छोड़ा गया कोई भी भयानक डेटा संघर्ष का कारण बनता है। तो अगर हम अपने django परीक्षणों के लिए doctests या unittest.TestCase का उपयोग कर रहे हैं, तो एक सफाई एक अच्छा अभ्यास हो सकता है।

अंत में, अधिक जटिल परिदृश्यों में, विशिष्ट इकाई परीक्षण बग का शिकार करने के लिए जानबूझकर परीक्षण डेटाबेस को जारी रखना भी समझदारी हो सकती है।

8

मैं एक ऐसी परियोजना पर काम कर रहा था जिसने कुछ फ़ाइल अपलोड किए थे, और मुझे परीक्षण द्वारा बनाई गई फ़ाइलों को हटाने की आवश्यकता थी और tearDown विधि उस स्थिति में बहुत उपयोगी थी।

import shutil 

#.... 
#.... 

    def tearDown(self): 
     shutil.rmtree(settings.UPLOAD_ROOT) 
संबंधित मुद्दे