2008-09-26 14 views
6

मैं ऐसे परीक्षण लिखना चाहता हूं जो दिखा सकते हैं कि डेटाबेस मेरी models.py फ़ाइल के साथ सिंक हो रहा है या नहीं। असल में मैंने उन्हें पहले ही लिखा है, केवल यह पता लगाने के लिए कि django प्रत्येक बार डेटाबेस डेटाबेस फ़ाइल के आधार पर परीक्षण चलाए जाने पर एक नया डेटाबेस बनाता है। क्या कोई तरीका है कि मैं models.py परीक्षण मौजूदा डेटाबेस स्कीमा का उपयोग कर सकता हूं? वह है जो mysql/postgresql में है, और वह नहीं है जो /myapp/models.py में है?मैं django डेटाबेस स्कीमा का परीक्षण कैसे करूं?

मुझे डेटाबेस में मौजूद डेटा के बारे में परवाह नहीं है, मुझे केवल स्कीमा की परवाह है यानी मैं अपने परीक्षणों को नोटिस करना चाहता हूं कि डेटाबेस में किसी तालिका में मेरे models.py फ़ाइल में स्कीमा से कम फ़ील्ड हैं ।

यदि यह कोई प्रासंगिकता है तो मैं सबसे अजीब ढांचे का उपयोग कर रहा हूं (वास्तव में इसे django एक्सटेंशन)।

धन्यवाद

उत्तर

8

क्या हमने किया डिफ़ॉल्ट test_runner ओवरराइड इतना है कि यह के खिलाफ परीक्षण करने के लिए एक नया डेटाबेस नहीं बना होता था। इस तरह, यह हमारे मौजूदा स्थानीय डेटाबेस की तरह दिखने के खिलाफ परीक्षण चलाता है। लेकिन अगर आप इस विधि का उपयोग करते हैं तो बहुत सावधान रहें क्योंकि आपके परीक्षण में आपके द्वारा किए गए डेटा में किए गए किसी भी बदलाव स्थायी होंगे। मैंने सुनिश्चित किया है कि हमारे सभी परीक्षण किसी भी बदलाव को उनके मूल स्थिति में वापस बहाल करते हैं, और सर्वर पर हमारे डेटाबेस का हमारे प्राचीन संस्करण को बनाए रखते हैं और बैक अप लेते हैं।

तो यह करने के लिए आप अपने प्रोजेक्ट में किसी स्थान पर django.test.simple से run_test विधि कॉपी करने की जरूरत है - मैं MyProject/परीक्षण/test_runner.py में मेरा डाल

तब में निम्न परिवर्तन उस विधि: जब आप चलाने

TEST_RUNNER = 'myproject.test.test_runner.run_tests' 

अब:

// change 
old_name = settings.DATABASE_NAME 
from django.db import connection 
connection.creation.create_test_db(verbosity, autoclobber=not interactive) 
result = unittest.TextTestRunner(verbosity=verbosity).run(suite) 
connection.creation.destroy_test_db(old_name, verbosity) 

// to: 
result = unittest.TextTestRunner(verbosity=verbosity).run(suite) 

शीर्ष पर सभी आवश्यक आयात करने के लिए सुनिश्चित करें और फिर अपनी सेटिंग में सेटिंग सेट फ़ाइल। /manage.py परीक्षण Django आपकी वर्तमान मॉडल परिभाषाओं के आधार पर एक नया संस्करण बनाने के बजाय आपके डेटाबेस की वर्तमान स्थिति के खिलाफ परीक्षण चलाएगा।

एक और बात आप कर सकते हैं स्थानीय रूप से अपने डेटाबेस की एक प्रतिलिपि बनाने, और उसके बाद अपने नए run_test में एक चेक करना है() इस तरह विधि:

if settings.DATABASE_NAME != 'my_test_db': 
    sys.exit("You cannot run tests using the %s database. Please switch DATABASE_NAME to my_test_db in settings.py" % settings.DATABASE_NAME) 

इस तरह वहाँ के खिलाफ परीक्षण चलाने का कोई खतरा नहीं है अपने मुख्य डेटाबेस

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