TestNG में प्रत्येक <परीक्षण> के लिए देरी का समय निर्धारित करें

Dec 14 2020

पहली जानकारी के रूप में : मैंने प्रत्येक @Testको एक अलग वर्ग में रखा है (इसलिए प्रत्येक कक्षा में केवल 1 @Testएनोटेशन है)।

वास्तव में मेरा लक्ष्य एक ही कक्षा को अलग-अलग मापदंडों से फिर से जोड़ना चाहता है, लेकिन मैं पहले से एक और कक्षा चलाना चाहता हूं।

मैंने कई संदर्भ खोजने की कोशिश की है कि TestNG एक वर्ग या एक @Testविधि एनोटेशन को दोहराने की अनुमति नहीं देता है <test>। प्रदान किया गया रिपीट एक invocationCountफ़ंक्शन है, जिसके बारे में मैं देखता हूं invocationCount, लेकिन मैं अपने लक्ष्य को प्राप्त नहीं कर सकता invocationCountक्योंकि यह फ़ंक्शन एक @Testही समय में दोहराता है और फिर मैं दूसरा चला सकता हूं @Test

public class SimpleTest1 {
    @Test
    @Parameters({"acc"})
    public void historyTransfer(String acc) {
        System.out.println(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(Calendar.getInstance().getTime()));
    }
}
public class SimpleTest2 {
    @Test
    @Parameters({"senderAcc", "beneficiaryAcc", "amount"})
    public void tranfer(String senderAcc, String beneficiaryAcc, String amount) {
        System.out.println(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(Calendar.getInstance().getTime()));
    }
}

मैं बलो विन्यास की तरह चलने की कल्पना करता हूं:

<suite name="Suite">
    <test name="My Test" >
        <classes>
            <class name="com.SimpleTest1">
                <parameter name="acc" value="11111"></parameter>
            </class>
            <class name="com.SimpleTest2">
                <parameter name="senderAcc" value="11111"></parameter>
                <parameter name="beneficiaryAcc" value="22222"></parameter>
                <parameter name="amount" value="100"></parameter>
            </class>
            <class name="com.SimpleTest1">
                <parameter name="acc" value="22222"></parameter>
            </class>
        </classes>
    </test>
</suite>

लेकिन उपरोक्त विन्यास योजना के अनुसार नहीं चला क्योंकि दूसरा SimpleTest1निष्पादित नहीं किया गया था।

फिर मैंने इसे एक अलग <test>तरह से चलाने की कोशिश की , जैसे कि सफलता और सफलता <test>

<test>निम्नानुसार कई क्रमिक (समानांतर नहीं) चलाएं :

<suite name="Suite">
    <test name="My Test1" >
        <classes>
            <class name="com.SimpleTest1">
                <parameter name="acc" value="11111"></parameter>
            </class>
        </classes>
    </test>
    <test name="My Test2" >
        <classes>
            <class name="com.SimpleTest2">
                <parameter name="senderAcc" value="11111"></parameter>
                <parameter name="beneficiaryAcc" value="22222"></parameter>
                <parameter name="amount" value="100"></parameter>
            </class>
        </classes>
    </test>
    <test name="My Test3" >
        <classes>
            <class name="com.SimpleTest1">
                <parameter name="acc" value="22222"></parameter>
            </class>
        </classes>
    </test>
</suite>

TestNG मावेन निर्भरता:

<dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>7.0.0</version>
    <scope>compile</scope>
</dependency>

अचूक:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.2</version>
    <configuration>
        <suiteXmlFiles>
            <suiteXmlFile>testng.xml</suiteXmlFile>
        </suiteXmlFiles>
      </configuration>
</plugin>

आईडीई: ग्रहण (संस्करण: 2018-09 (4.9.0))

OS: macOS Mojave (संस्करण 10.14.6)

आउटपुट :

[RemoteTestNG] detected TestNG version 7.0.0
22-12-2020 21:59:32
22-12-2020 21:59:47
22-12-2020 21:59:57

===============================================
Suite
Total tests run: 3, Passes: 3, Failures: 0, Skips: 0
===============================================

लेकिन पहला <test>समाप्त होने के बाद , अगले <test>रन से पहले लगभग 10 सेकंड की देरी होती है , साथ ही साथ अगला टेस्ट भी।

नोट : मुझे लगा कि यह आईडीई (मैं ग्रहण का उपयोग करता हूं) के साथ एक समस्या थी, लेकिन यह नहीं था। मैंने इसे 2 तरीकों से चलाने की कोशिश की है, आईडीई और कमांड लाइन के माध्यम से, और मुझे इस देरी के मुद्दे के बारे में एक ही परिणाम दे।

इस कमांड का उपयोग करके वाया कमांड लाइन:

mvn clean test -Dsurefire.suiteXmlFiles=testng.xml

क्या ऊपर के विलंब समय को कम करने के लिए कोई विन्यास है?

जवाब

2 juherr Dec 23 2020 at 19:36

सबसे पहले, एक सूट एक परीक्षण योजना नहीं है (एक अच्छी सुविधा अनुरोध btw हो सकता है), लेकिन परीक्षण का चयन करने का एक तरीका है। इसका मतलब है कि आप परीक्षणों के बीच निर्भरता को परिभाषित नहीं कर सकते। यही कारण है कि एक ही टेस्ट क्लास होने से काम नहीं चलता (यह विफल होना चाहिए या अलग-अलग उदाहरण बनाना चाहिए)।

जैसा कि मैंने आपकी आवश्यकताओं को समझा, सबसे अच्छा तरीका है कि आप अपने तर्क और परीक्षण एकीकरण के साथ अपने एकीकरण को अलग करें:

  1. अपने हेल्पर / फ़िक्चर क्लासेस डिज़ाइन करें जैसा आप चाहते हैं:

_

public class SimpleClass1 {
  public void historyTransfer(String acc) {
    System.out.println(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(Calendar.getInstance().getTime()));
  }
}

public class SimpleClass2 {
  public void tranfer(String senderAcc, String beneficiaryAcc, String amount) {
    System.out.println(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(Calendar.getInstance().getTime()));
  }
}
  1. परीक्षण ढांचे के साथ एकीकरण के लिए कक्षाओं को परिभाषित करें

_

public class SimpleTest {
  @Test
  @Parameters({"acc"})
  public void step1(String acc) {
    (new SimpleClass1()).historyTransfer(acc);
  }

  @Test(dependsOnMethods = {"step1"})
  @Parameters({"senderAcc", "beneficiaryAcc", "amount"})
  public void step2(String senderAcc, String beneficiaryAcc, String amount) {
    (new SimpleClass2()).transfer(acc);
  }

  @Test(dependsOnMethods = {"step2"})
  @Parameters({"acc"})
  public void step3(String acc) {
    (new SimpleClass1()).historyTransfer(acc);
  }
}

और अपेक्षित मापदंडों वाला सुइट:

<suite name="Suite">
  <test name="My Test" >
    <classes>
        <class name="com.SimpleTest">
            <methods>
              <include name="step1">
              <parameter name="acc" value="11111"></parameter>
            </methods>
            <methods>
              <include name="step2">
              <parameter name="senderAcc" value="11111"></parameter>
              <parameter name="beneficiaryAcc" value="22222"></parameter>
              <parameter name="amount" value="100"></parameter>
            </methods>
            <methods>
              <include name="step3">
              <parameter name="acc" value="22222"></parameter>
            </methods>
        </class>
    </classes>
  </test>
</suite>

(अस्वीकरण: मैंने dtd के खिलाफ XML की जाँच नहीं की, गलत हो सकता है लेकिन आपके पास विचार है)

नामकरण या जुड़नार बनाने का तरीका आपके स्वयं के सम्मेलनों पर निर्भर करता है।

1 vbn Dec 16 2020 at 15:36

आप यहां बताए गए एनोटेशन का उपयोग करके अन्य विधि पर प्राथमिकता या निर्भरता निर्धारित कर सकते हैं:

https://testng.org/doc/documentation-main.html#annotations

@ Test.priority या @ Test.dependsOnMethods के लिए जाँच करें

ऐसा करने से, आप एक के बाद एक क्रमिक रूप से परीक्षण चलाने की अनुमति देंगे।

1 user7294900 Dec 22 2020 at 16:22

मुझे नहीं पता कि आपको अलग-अलग परीक्षणों में एक ही परीक्षण कक्षा चलाने की आवश्यकता क्यों है, लेकिन परीक्षण शुरू करते समय यह सभी प्रासंगिक संदर्भों को लोड कर सकता है, जिसमें शायद समय लगता है और शायद परीक्षण के अंत के बाद कुछ संसाधनों को बंद करने की आवश्यकता हो सकती है, दोनों में समय लग सकता है / कुछ सेकंड

आप विलंब के कारण के अधिक विवरण का उपयोग करने के लिए वर्बोज़ का उपयोग कर सकते हैं (और समय देखने के लिए अधिक लॉग जोड़ें)

<suite name="Suite" verbose="10">

वर्बोसिटी का स्तर 0 से 10 है, जहां 10 सबसे विस्तृत है। एक बार जब आप इसे 10 पर सेट करते हैं, तो आप देखेंगे कि कंसोल आउटपुट में परीक्षण, विधियों और श्रोताओं, आदि के बारे में जानकारी होगी।

प्रक्रिया को गति देने के लिए आप TestNG की समानांतर सुविधा का भी उपयोग कर सकते हैं

थ्रेडपूलसाइज़ विशेषता आपको यह निर्दिष्ट करने की अनुमति देती है कि इस निष्पादन के लिए कितने थ्रेड आवंटित किए जाने चाहिए।