2015-09-12 6 views
5

में समांतर परीक्षणों के लिए प्रति-परीक्षण डेटा आरंभ करें और साफ़ करें, जुनीट से टेस्टएनजी तक कुछ परीक्षणों को माइग्रेट करते समय, मुझे इस समस्या के ढांचे को उनके टेस्ट क्लास उदाहरणों के इलाज में अंतर के कारण एक समस्या का सामना करना पड़ रहा है।टेस्टएनजी

जुनीट प्रत्येक परीक्षण विधि के लिए टेस्ट क्लास का एक नया उदाहरण बनाता है। तो मुझे लगता है कि एक आम पैटर्न है:

public class MyTest { 

    private Stream inputData; 

    @Before 
    public void setUp() { 
     // Set up some data in (non-static) instance fields 
     // This data is isolated per test 
     inputData = createInputDataStream(); 
    } 

    @Test 
    public void testStuff() { 
     // Use the data from the instance fields 
     doStuff(inputData); 
    } 

    @After 
    public void tearDown() { 
     // Clean up the data from the instance fields 
     closeInputDataStream(inputData); 
    } 
} 

इसके विपरीत, टेस्टएनजी सभी परीक्षण विधियों के लिए टेस्ट क्लास का एक उदाहरण का उपयोग करता है। तो उपरोक्त पैटर्न काम नहीं करता है! चूंकि डेटा उदाहरण फ़ील्ड में संग्रहीत होता है, मान अब अलग नहीं होते हैं। समानांतर निष्पादन सक्षम होने पर यह ओवरराइट किए गए डेटा मध्य-परीक्षण का कारण बन सकता है।

तो मैं टेस्टएनजी के साथ ऐसा कैसे करूं? क्या प्रत्येक @BeforeMethod - @Test - @AfterMethod tuple से अलग डेटा संग्रहीत करने का कोई तरीका है?

मैं @Test के अंदर सभी 3 चरणों को स्वयं कर सकता हूं, लेकिन इसके लिए प्रत्येक परीक्षण में try...finally ब्लॉक जोड़ने की आवश्यकता होगी। मैंने ITestContext का उपयोग करने का भी प्रयास किया, लेकिन यह पूरे परीक्षण चलाने के लिए भी साझा किया जाता है।

+1

'@ BeforeMethod' और' @AfterMethod 'प्रत्येक' @ टेस्ट 'आमंत्रण के आसपास बुलाओ; इसलिए यह वर्णन किया गया है जैसा आपने वर्णन किया है। एकमात्र अंतर यह है कि आप एक नया उदाहरण बनाने के बजाय हर बार कक्षा राज्य को ओवरराइड करते हैं। क्या आपने उस दृष्टिकोण के साथ कोई अप्रत्याशित व्यवहार देखा था? या आप समानांतर में कक्षा में सभी परीक्षण चलाने की कोशिश कर रहे हैं (मुझे डर है कि यह संभव नहीं है)? –

+0

@ कोस्टी सिउदातु मुख्य रूप से समांतर निष्पादन के दौरान - मूल्य कभी-कभी मध्य-परीक्षण को अधिलेखित करते हैं। – metacubed

+0

यदि आप समानांतर ('') में कक्षा के भीतर परीक्षण विधियों को चलाने के लिए चाहते हैं, तो आप दौड़ की स्थिति के खिलाफ बचाव करने का कोई तरीका नहीं है, क्योंकि आप उत्परिवर्तनीय स्थिति बदल रहे हैं। –

उत्तर

1

हाँ, TestNG के साथ आप उन स्थानीय चर है कि आप JUnit के साथ किया था और dataProvider अपने सूत्रण संभालती है, प्रति परीक्षण-वर्ग-उदाहरण के ऊपर जिस तरह से अधिक शक्ति:

public class MyTest { 

private Stream inputData; 

@BeforeMethod 
public void setUp(Object[] args) { 
    inputData = (Data)args[0]; 
    inputData = normalizeDataBeforeTest(inputData); 
} 

@Test(dataProvider="testArgs") 
public void testStuff(Data inputDatax, Object a, Object b) { 
    doSomethingWith(a); 
    doSomethingWith(b); 
    doStuff(this.inputData); 
} 

@AfterMethod 
public void tearDown() { 
    // Clean up the data from the instance fields 
    closeInputDataStream(inputData); 
} 

.... 
@DataProvider 
public static Object[][] testArgs() { 
    // generate data here, 1 row per test thread 
    Object[][] testData; 
    for loop { 
     // add row of data to testData 
     // {{dataItem, obja, objb}, {dataItem, obja, objb}} etc. 
    } 
    return testData; 
} 
} 
संबंधित मुद्दे