2010-06-09 15 views
12

स्प्रिंग टेस्ट डेटाबेस के साथ किए गए किसी भी बदलाव को परीक्षण विधि में किसी भी बदलाव को वापस रोल करने में मददगार रूप से डीबीयूनीट परीक्षण डेटा को लोड करने के लिए कैसे करें। इसका मतलब है कि प्रत्येक परीक्षण विधि से पहले परीक्षण डेटा को हटाने/पुनः लोड करने के लिए समय निकालना आवश्यक नहीं है।स्प्रिंग टेस्ट

लेकिन यदि आप @BeforeClass Junit एनोटेशन का उपयोग करते हैं, तो वह डेटा लोडर को स्थिर होने के लिए मजबूर करता है। एक प्रश्न जो यहां खोजा गया है: Why must jUnit's fixtureSetup be static?

यदि डेटा प्रारंभिक विधि स्थिर है, तो डेटा कनेक्शन विधियों और डेटा स्रोत..और चालू और चालू होना चाहिए ... सबकुछ स्थिर होना ... जो ' टी काम नहीं जिस बिंदु पर, मैं पूछता हूं - स्प्रिंग टेस्ट की रोलबैक में बदलाव करने की क्षमता क्या होती है जब आपको प्रत्येक टेस्ट के लिए टेस्ट डेटा को हटाना/पुनः लोड करना होता है ??!

उत्तर

14

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

उदाहरण के लिए, एक परीक्षण सुपर क्लास:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={"classpath:test-application-context.xml"}) 
@Transactional 
public abstract class DataLoadingTest { 
    @Autowired 
    protected DatabaseInitialiser databaseInitialiser; 
} 

test-application-context.xml के साथ:

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 
    <bean id="dataSource" .../> 

    <bean class="DatabaseInitialiser"> 
     <property name="dataSource" ref="dataSource"/> 
    </bean> 
</beans> 

और

public class DatabaseInitialiser extends JdbcDaoSupport { 
    @PostConstruct 
    public void load() { 
     // Initialise your database here: create schema, use DBUnit to load data, etc. 
    } 
} 

इस उदाहरण में:

  • डेटाबेस पर भरोसा रखने वाले सभी परीक्षण DataLoadingTest का विस्तार करते हैं;
  • वसंत पहले परीक्षण आमंत्रण पर आवेदन संदर्भ शुरू करता है;
  • एनोटेशन के माध्यम से यह DatabaseInitialiser.load() पर कॉल करता है;
  • वसंत एक कैश में अनुप्रयोग संदर्भ रखता है;
  • आवेदन संदर्भ से DatabaseInitialiser में आगे परीक्षण आमंत्रण तार, जो पहले से ही कैश किया गया है;
  • परीक्षण लेनदेनशील हैं, और प्रारंभिक डेटा सेट के अंत में वापस रोल करें।

इसी तरह, DatabaseInitialiser एक विधि एनोटेट @PostDestroy पूरे परीक्षण चालन के अंत में किसी भी रोलबैक आवश्यक प्रदर्शन करने के लिए हो सकता है।

+0

वास्तव में, वास्तव में, मैंने समस्या को कैसे हल किया, मैं बस अपना कोड/उत्तर वापस SO में डालना भूल गया। अगले व्यक्ति के लिए ऐसा करने के लिए समय निकालने के लिए धन्यवाद। – HDave

+0

अच्छा लगता है, लेकिन व्यावहारिक रूप से अन्य वर्ग का 'पोस्टपोन्स्ट्रक्ट' डेटाबेसइनिस्टाइज़र के पहले चल रहा है, इसलिए इसका कोई उपयोग नहीं है। किसी भी मदद के लिए धन्यवाद। –

+0

@ संयुक्त अभिव्यक्ति: क्या आप उस पर विस्तार कर सकते हैं? तुम्हारा कौन सा वर्ग मतलब है? मेरे उदाहरण में, स्प्रिंग टेस्ट क्लास से पहले डेटाबेस प्रारंभकर्ता को प्रारंभ करता है, जो प्रश्न में उल्लिखित कैस में काम करता है। – Kkkev

1

वसंत परीक्षण और डीबीयूनीट दो उत्कृष्ट ढांचे हैं। लेकिन उन्हें गठबंधन करने का कोई मतलब नहीं है। चूंकि वसंत परीक्षण कनेक्शन पर एक रोलबैक निष्पादित करता है, यह बाद में साफ हो जाता है, जबकि डीबीयूनिट @Before विधि में परीक्षण डेटा को साफ़ करता है और सम्मिलित करता है।

यदि आप किसी भी गतिशील डेटा पर निर्भर नहीं हैं और अन्यथा dbUnit पर वसंत का उपयोग करें।

+0

मुझे डीबीयूनीट की एक्सएमएल से डाटाबेस टेबल लोड करने की क्षमता सुविधाजनक होने के लिए मिलती है। क्या स्प्रिंग टेस्ट की क्षमता इस तरह है? – HDave

+1

हाँ, मुझे लगता है कि मैट यहां गलत है। एक्सएमएल फ़ाइल से परीक्षण डेटा लोड करना वसंत के साथ डीबी परीक्षण के लिए एक अच्छा लाभ है। – IcedDante

1

हम डीबीयूनीट का उपयोग स्प्रिंग टेस्ट के साथ बड़े पैमाने पर करते हैं। लेकिन हम परीक्षण के अंत में डेटा हटाने के लिए डीबीयूनीट कार्यक्षमता का उपयोग नहीं करते हैं।

हमने परीक्षण शुरू करने के लिए @Before विधि में हमारे परीक्षण डेटा के लिए डीबीयूनीट आवेषण का एक गुच्छा लगाया। फिर जब परीक्षण पूरा हो जाता है तो हम वसंत रोलबैक कार्यक्षमता को डेटाबेस को मूल स्थिति में वापस लाने देते हैं।

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

+1

वैसे यह बुरा अभ्यास है। चेक किए गए समाधान के बारे में आप क्या सोचते हैं? – IcedDante

0

तरीके annotated with @BeforeTransaction रन, जैसा कि इसके नाम से पता चलता है, प्रत्येक परीक्षण के लेनदेन से पहले शुरू होता है। यदि ऐसी विधि में आप पता लगा सकते हैं कि परीक्षण डेटा लोड किया गया है, तो आवश्यकता होने पर कोई डेटा लोड कर सकता है।

सावधान रहें कि सभी के बाद के परीक्षणों के लिए डेटा आपके (इन-मेमोरी) डेटाबेस में छोड़ा गया है।

हम इसे "स्थिर" डेटा लोड करने के लिए उपयोग करते हैं, जो उत्पादन वातावरण में, इसे शुरू करते समय हमारे डेटाबेस में बूटस्ट्रैप भी किया जाएगा। इस तरह हम वास्तव में पुराने (डीबीयूनीट) निर्यात पर भरोसा करने के बजाय, हमारे परीक्षणों के लिए बिल्कुल उसी कोड और डेटा का उपयोग करते हैं जो पुराना हो सकता है।

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