2009-03-08 11 views
10

में "तेज़ समय" सिमुलेट करना मेरे पास एक जावा ऐप है जो लिनक्स पर चलता है जिसमें कई घटनाएं और व्यावसायिक तर्क होते हैं जो समय और तिथियों के आसपास घूमते हैं।लिनक्स

परीक्षण के लिए, क्या समय तेजी से कुछ समय में ट्विक करना संभव है। मान लीजिए, एक घंटे की दीवार के समय में पूरी कम्प्यूटर साल भर खत्म करें?

+0

क्या प्रोग्राम सिस्टम कॉल के साथ "समय" और "तिथि" कॉल करता है? –

+0

प्रत्येक स्क्रिप्ट को अलग-अलग समय निर्धारित करने के बारे में क्या है :) –

+0

क्या यह प्रोग्राम किसी डेटाबेस या किसी अन्य बाहरी प्रोग्राम पर निर्भर करता है? – jmucchiello

उत्तर

9

आप अपने समय/तिथि कॉल के लिए एक रैपर इंटरफ़ेस लिख सकते हैं। एक वास्तविक कार्यान्वयन करें जो वास्तविक प्रणाली कॉल करता है, और एक परीक्षण कार्यान्वयन जो आप चाहते हैं जो कर सकते हैं (तेजी से, धीमी, नकली तिथियां, आदि चलाएं)।

+0

अच्छा दृष्टिकोण के साथ अपडेट किया, लेकिन यदि "लंबे समय तक चलने वाले परीक्षण" को बाहरी तत्वों की जांच करने की आवश्यकता है जैसे: वेब/एप्लिकेशन सर्वर लॉग फाइलें प्रबंधित करना, स्मृति खपत, या आप परीक्षण करना चाहते हैं सभी घटक एक साथ काम कर रहे हैं (आपका ऐप, एसक्यूएल/नो-एसक्यूएल डीबी, क्रॉन सेवाओं/नौकरियों आदि जैसे)। इस तरह के परीक्षणों को सभी पार्टियों को "चाल" करने के लिए हार्डवेयर घड़ी को बदलने की आवश्यकता होगी। देखें [सहनशक्ति परीक्षण] (http://www.softwaretestingsoftware.com/all-types-of-software-testing/)। * ड्रैगन बॉल के ** "हाइपरबॉलिक टाइम चैम्बर" के बारे में सोचें *** –

2

यदि आप सिस्टम समय प्राप्त करने के लिए सिस्टम कॉल हैं (यानी System.currentTimeMillis()), संभवतः, आप सिस्टम समय को बदलकर समय बढ़ा सकते हैं। यह आपके आवेदन में देखे जाने वाले समय पर प्रतिबिंबित होना चाहिए।

यदि आप समय की गणना करने के अन्य तरीकों का उपयोग कर रहे हैं (JVM प्रारंभ से समाप्त समय (यानी System.nanoTime()), नेट टाइम सर्वर, आदि ...) तो जवाब यह है कि यह संभव नहीं है।


मैं काफी है कि मैं सिर्फ कैसे तुम क्या पूछा करने के लिए समझा रहा हूँ नहीं बता सकता कि, और यह केवल एकीकरण परीक्षण के लिए अच्छा है, जब आप और आप ने कहा मशीन पर प्रभावित कर रहे हैं विचार कुछ में ले लो।

यह उचित और व्यापक इकाई परीक्षण के लिए किसी भी प्रतिस्थापन के रूप में नहीं आना चाहिए।

+0

यदि कोई और मशीन का उपयोग कर रहा है, तो वे खुश नहीं होंगे। अगर सिमुलेशन क्रैश हो जाता है, तो आपकी मशीन की घड़ी गलत है। यदि आप अनुकरण के दौरान फाइलें बनाते हैं, तो उनके टाइमस्टैम्प भविष्य में बाद में होंगे। –

+0

@ जोनाथन, अच्छी तरह से, मैंने अपने उत्तर को अस्वीकरण –

0

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

7

यूनिट परीक्षण के लिए सबसे अच्छा काम करने वाला एक दृष्टिकोण यह है कि वर्तमान समय आपके कोड में किस प्रकार पहुंचा जा सकता है।

System.currentTimeMillis() को कॉल करने के बजाय सीधे आप अपना स्वयं का कार्यान्वयन प्रदान कर सकते हैं।

कुछ इस (छद्म कोड) की तरह:

class MyTime { 
    private static TimeInterface CurrentTimeInterface = new DefaultTimeImpl(); 

    public setTimeInterface(TimeInterface timeInterface) { 
     CurrentTimeInterface = timeInterface; 
    } 

    public int getTime() { CurrentTimeInterface.getTime(); } 

} 

class DefaultTimeImpl implements TimeInterface { 
    public int getTime() { return System.currentTimeMillis(); } 
} 

class TestTimeImpl implements TimeInterface { 
    private int CurrentTimeMillis = 0; 
    public int getTime() { return CurrentTimeMillis; } 
    public void setTime(int timeMillis) { CurrentTimeMillis = timeMillis} 
    public void sleep(int millis) { CurrentTimeMillis += millis; } 
} 

फिर, हर जगह आप System.getTimeMillis कहा जाता है |() के बजाय MyTime.getTime फोन()। जब आप अपने कोड का परीक्षण कर रहे हैं तो बस एक टेस्टटाइमआईएमएल बनाएं और MyTime.setTimeInterface (testTimeImpl) पर कॉल करें। फिर जब आप कॉल testTimeImpl.sleep() या testTimeImpl.setTime() को अग्रिम करने के लिए समय चाहते हैं।

यह आपको मिलीसेकंड तक किसी भी समय अनुकरण करने की अनुमति देता है।