2009-09-18 17 views
21

मैं परीक्षण के लिए शास्त्रीय संरचना है, मैं DatabaseTests की तरह अलग अलग सूट का टेस्ट स्वीट है, UnitTests आदि कभी कभी उन सुइट्स SlowDatabaseTests जैसे अन्य सुइट्स शामिल हैं, FastDatabaseTests आदिमैं अपने जुनीट परीक्षण को यादृच्छिक क्रम में कैसे चला सकता हूं?

क्या मैं चाहता हूँ की प्रस्तुति क्रम randomize करने के लिए है परीक्षण इसलिए मैं सुनिश्चित कर दूंगा कि वे एक-दूसरे पर निर्भर नहीं हैं। यादृच्छिकरण प्रत्येक स्तर पर होना चाहिए, जैसे सूट को टेस्ट क्लास ऑर्डर को शफल करना चाहिए, और टेस्ट क्लास को टेस्ट विधि ऑर्डर को शफल करना चाहिए।

यदि ग्रहण में ऐसा करना संभव है तो यह सबसे अच्छा होगा।

+7

ऑर्डर यादृच्छिकरण कुछ भी साबित नहीं करेगा, क्योंकि यादृच्छिक "दुर्घटना से" काम कर सकता है। इसके अलावा, यह दोहराने योग्य नहीं होगा, और इसलिए आप विफलता के कारण को ट्रैक करने में कभी भी सक्षम नहीं होंगे। – skaffman

+3

यदि मैं अपने निष्पादन आदेश को हर बार परीक्षण के लिए लिखता हूं, तो मैं कारण ट्रैक कर पाऊंगा। – nimcap

+8

आप इसे यादृच्छिक() एक बीज देकर दोहराने योग्य बना सकते हैं जो उस समय के कार्य का कार्य है। यदि आप ऐसा करते हैं, तो मैं दृढ़ता से एक सतत निर्माण की अनुशंसा करता हूं ताकि आप नोटिस विफल होने पर ध्यान दें। – NamshubWriter

उत्तर

12

आप की क्या ज़रूरत है एक Sortable लेकिन मुझे नहीं देख सकते हैं कि आप इसका इस्तेमाल होगा।

आप BlockJUnit4ClassRunner का विस्तार कर सकते हैं और computeTestMethods() super.computeTestMethods() की यादृच्छिक प्रतिलिपि वापस कर सकते हैं। फिर इसे चलाने के लिए धावक के रूप में सेट करने के लिए @RunWith का उपयोग करें।

उदा।

package com.stackoverflow.mlk; 

import java.util.Collections; 

import org.junit.runners.BlockJUnit4ClassRunner; 
import org.junit.runners.model.InitializationError; 

public class RandomBlockJUnit4ClassRunner extends BlockJUnit4ClassRunner { 

    public RandomBlockJUnit4ClassRunner(Class<?> klass) 
      throws InitializationError { 
     super(klass); 
    } 

    protected java.util.List<org.junit.runners.model.FrameworkMethod> computeTestMethods() { 
     java.util.List<org.junit.runners.model.FrameworkMethod> methods = super.computeTestMethods(); 
     Collections.shuffle(methods); 
     return methods; 
    } 

} 

फिर

@RunWith(com.stackoverflow.mlk.RandomBlockJUnit4ClassRunner.class) 
public class RandomOrder { 
    @Test 
    public void one() { 
    } 

    @Test 
    public void two() { 
    } 

    @Test 
    public void three() { 
    } 
} 
+0

अच्छा जवाब लेकिन पर्याप्त पर्याप्त नहीं है, मुझे टेस्ट क्लास ऑर्डर को यादृच्छिक बनाने के लिए भी एक सूट धावक को लागू करने की आवश्यकता है। इसके अलावा मेरे पास बहुत सारे परीक्षण हैं और मैं उन सभी में @RunWith एनोटेशन नहीं रखना चाहता हूं। मुझे लगता है कि सुइट रनर – nimcap

+2

में इसे संभाला जा सकता है मुझे यह बहुत उपयोगी लगता है, और मैंने एक छोटा जावा प्रोजेक्ट बनाया जो परीक्षण और सुइट्स को यादृच्छिक बनाता है। अधिक जानकारी के लिए, अपने पृष्ठ पर जाएं: http://randomjunit.sourceforge.net/ – AngocA

0

मुझे यकीन है कि वे लिए निर्भर नहीं हैं कर देगा एक दूसरे को

आप यकीन है कि यह यादृच्छिक निष्पादन आदेश पर निर्भर रहे बिना मामला है बनाना चाहिए। आपको क्या डर है कि निर्भरताएं मौजूद हो सकती हैं?

+0

क्या मैं पूछ सकता हूं कि लोग मेरे जवाब को क्यों कम करते हैं? इसमें ग़लत क्या है? –

+5

यूनिट परीक्षण लिखते समय और उन्हें स्वतंत्र बनाते समय हम बहुत सावधान रह रहे हैं। लेकिन हम उत्पादन कोड भी बहुत सावधान लिख रहे हैं, बग दिखाई देने लगते हैं, इस बात की कोई गारंटी नहीं है कि वे स्वतंत्र होंगे। पीएस। हम न केवल यूनिट परीक्षणों के लिए जुनीट का उपयोग कर रहे हैं बल्कि कार्यात्मक परीक्षणों के लिए भी, इसलिए वे कभी-कभी कुछ राज्य में डीबी छोड़ देते हैं। – nimcap

+5

@lutz मुझे लगता है क्योंकि आप ओपी के प्रश्न – akuhn

3

सामान्य रूप से आपको अपने स्वयं के परीक्षण धावक को लिखना है और परीक्षण धावक वर्ग में विधियों को कुल मिलाकर और प्रत्येक परीक्षण को यादृच्छिक रूप से चलाएं (सुनिश्चित करें कि आप दो बार परीक्षण नहीं चलाते हैं)।

परीक्षण ढांचे और कैसे के बारे में और अधिक पढ़ें अपनी खुद की परीक्षण धावक यहाँ लिखने के लिए: http://www.ddj.com/architect/184415674

+0

ध्यान दें कि ddj.com आलेख JUnit3 परीक्षण धावक का वर्णन करता है। यदि आप इसे आज़माते हैं, तो ध्यान रखें कि यदि आपके परीक्षण टेस्टसेटअप का उपयोग करते हैं या सूट-स्तरीय सेटअप करने का प्रयास करते हैं और टेस्टसूइट को विस्तारित करके फाड़ते हैं, तो यहां सुझाए गए दृष्टिकोण काम नहीं करेंगे; परीक्षण धावक TestSuites या TestDecorators "देख" नहीं करता है। अपने स्वयं के JUnit3 परीक्षण धावक को लिखना भी काम नहीं करेगा यदि आप ग्रहण जैसे आईडीई से परीक्षण चलाते हैं। – NamshubWriter

4

https://github.com/KentBeck/junit/pull/386 कुछ आदेश नहीं बल्कि RANDOM परिचय देता है। शायद आप वास्तव में यह नहीं चाहते हैं; परीक्षण निश्चित रूप से चलना चाहिए। यदि आपको यह सत्यापित करने की आवश्यकता है कि परीक्षणों के अलग-अलग क्रमपरिवर्तन अभी भी पास हैं, तो सभी क्रमिक परीक्षणों का परीक्षण करें; या, यदि यह अव्यवहारिक रूप से धीमा हो जाएगा, तो शफलिंग के लिए "यादृच्छिक" बीज पेश करें जो पर्यावरण चर या जैसा कि निर्धारित होता है, ताकि आप किसी भी विफलताओं को पुन: उत्पन्न कर सकें। http://hg.netbeans.org/main/file/66d9fb12e98f/nbjunit/src/org/netbeans/junit/MethodOrder.java जुनीट 3 के लिए ऐसा करने का एक उदाहरण देता है।

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

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