TestNG'de her <test> için gecikme süresini ayarlayın

Dec 14 2020

İlk olarak bilgi olarak : Her birini @Testfarklı bir sınıfa koyuyorum (yani elbette her sınıfta sadece 1 @Testnot var).

Aslında amacım aynı sınıfı farklı bir parametre ile tekrar çalıştırmak ama önceden başka bir sınıfı çalıştırmak istiyorum.

TestNG'nin bir sınıfın tekrarına veya bir @Testyöntem açıklamasına izin vermediği birçok referans bulmaya çalıştım <test>. Sağlanan tekrar bir invocationCountişlev, görüyorum invocationCount, ancak invocationCounthedefime ulaşamıyorum çünkü bu işlev @Testaynı anda a'yı tekrar ediyor ve sonra başka birini çalıştırabilirim @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()));
    }
}

Aşağıdaki yapılandırma gibi çalışmayı hayal ediyorum:

<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>

Ancak yukarıdaki konfigürasyon planlandığı gibi gitmedi çünkü ikincisi SimpleTest1uygulanmadı.

Sonra <test>feryat ve başarı gibi ayrı bir şekilde çalıştırmayı denedim , ancak her birinin gecikme süresiyle ilgili yeni bir sorunla karşı karşıyayım <test>.

<test>Aşağıdaki gibi çoklu seri (paralel değil) çalıştırın :

<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 Maven bağımlılığı:

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

Surefire:

<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>

IDE: Eclipse (Sürüm: 2018-09 (4.9.0))

İşletim Sistemi: macOS Mojave (Sürüm 10.14.6)

Çıktı :

[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
===============================================

Ancak ilki <test>tamamlandıktan sonra, sonraki <test>çalışmalardan ve sonraki testten önce yaklaşık 10 saniyelik bir gecikme olur .

Not : Bunun IDE ile ilgili bir sorun olduğunu düşündüm (Eclipse kullanıyorum), ama olmadı. IDE ve komut satırı aracılığıyla 2 şekilde çalıştırmayı denedim ve bu gecikme sorunu hakkında bana aynı sonucu verdim.

Bu komutu kullanarak komut satırı aracılığıyla:

mvn clean test -Dsurefire.suiteXmlFiles=testng.xml

Yukarıdaki gecikme süresini azaltmak için herhangi bir yapılandırma var mı?

Yanıtlar

2 juherr Dec 23 2020 at 19:36

İlk olarak, bir paket bir test planı değil (iyi bir özellik isteği olabilir), sadece testleri seçmenin bir yoludur. Testler arasında bir bağımlılık tanımlayamayacağınız anlamına gelir. Bu yüzden aynı test sınıfına sahip olmak işe yaramaz (başarısız olmalı veya farklı örnekler oluşturmalıdır).

İhtiyaçlarınızı anladığım kadarıyla, en iyi yol kendi mantığınızı ve onun test çerçevesiyle entegrasyonunu ayırmaktır:

  1. Yardımcı / fikstür sınıflarınızı istediğiniz gibi tasarlayın:

_

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. Test çerçevesiyle entegrasyon için sınıfları tanımlama

_

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);
  }
}

Ve beklenen parametrelere sahip süit:

<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>

(feragatname: XML'yi dtd ile karşılaştırmadım, yanlış olabilir ama fikriniz var)

Fikstür oluşturma veya adlandırma şekli kendi kurallarınıza bağlıdır.

1 vbn Dec 16 2020 at 15:36

Ek açıklamaları burada açıklandığı gibi kullanarak diğer yönteme öncelik veya bağımlılık ayarlayabilirsiniz:

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

@ Test.priority veya @ Test.dependsOnMethods için kontrol edin

Bunu yapmak, testleri arka arkaya seri olarak çalıştırmanıza izin verecektir.

1 user7294900 Dec 22 2020 at 16:22

Neden aynı test sınıfını ayrı testlerde çalıştırmanız gerektiğini bilmiyorum, ancak teste başlarken ilgili tüm bağlamları yükleyebilir ve bu da belki zaman alabilir ve belki test bittikten sonra bazı kaynakları kapatması gerekebilir, her ikisi de zaman alabilir / birkaç sürebilir saniye

Gecikmenin nedeniyle ilgili daha fazla ayrıntı kullanmak için ayrıntılı kullanabilirsiniz (ve zamanlamayı görüntülemek için daha fazla günlük ekleyebilirsiniz)

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

Ayrıntı düzeyi, 10'un en ayrıntılı olduğu 0 ila 10'dur. 10 olarak ayarladığınızda, konsol çıktısının testler, yöntemler ve dinleyiciler vb. İle ilgili bilgileri içereceğini göreceksiniz.

Süreci hızlandırmak için TestNG'nin paralel özelliğini de kullanabilirsiniz.

ThreadPoolSize özniteliği, bu yürütme için kaç tane evre tahsis edilmesi gerektiğini belirtmenize izin verir.