Testng: Metode ITestListener dipanggil beberapa kali untuk satu pengujian, ketika ada beberapa pengujian di xml

Dibuat pada 15 Jan 2016  ·  22Komentar  ·  Sumber: cbeust/testng

Mirip dengan #171, ini berlaku untuk instance ITestListener.

Ketika ada banyakdan semua xml menggunakan pendengar pengujian yang sama, onFinish() dipanggil beberapa kali untuk satu pengujian, yang tampaknya tidak dimaksudkan.

listener xml

Komentar yang paling membantu

@LibertyLocked - Apakah contoh di bawah ini yang Anda gunakan juga?

@stevie1877 - Apakah Anda mencoba melakukan ini di TestNG 6.10? Jika tidak, dapatkah Anda mencoba ini tanpa usaha dan melihat apakah Anda dapat mereproduksi ini? Jika Anda masih dapat membuatnya kembali, alangkah baiknya jika Anda dapat membantu membagikan contoh yang dapat saya gunakan untuk mereproduksi masalah ini, sehingga kami dapat memperbaikinya.

Inilah yang saya miliki sebagai kelas uji dan file xml suite yang saya coba gunakan untuk membuat ulang masalah [menggunakan TestNG v6.10] Saya tidak dapat mereproduksi masalah ini menggunakan contoh di bawah ini pada TestNG 6.10

package org.rationale.emotions.github.issue956;

import org.testng.annotations.Listeners;
import org.testng.annotations.Test;

@Listeners(ListenerFor956.class)
public class AccountTest {
    <strong i="11">@Test</strong>
    public void testMethod() {
        System.err.println("accountTest()");
    }
}
package org.rationale.emotions.github.issue956;

import org.testng.annotations.Listeners;
import org.testng.annotations.Test;

<strong i="14">@Listeners</strong> (ListenerFor956.class)
public class CorporateTest {
    <strong i="15">@Test</strong>
    public void testMethod() {
        System.err.println("corporateTest()");
    }

}
package org.rationale.emotions.github.issue956;

import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;

public class ListenerFor956 implements ITestListener {
    public ListenerFor956() {
        System.err.println("New instance created ");
    }

    <strong i="18">@Override</strong>
    public void onTestStart(ITestResult result) {
        String print = result.getTestClass().getRealClass().getName() + "." + result.getMethod()
            .getConstructorOrMethod().getMethod().getName() + "()";
        System.err.println("Test started: " + print);
    }

    <strong i="19">@Override</strong>
    public void onTestSuccess(ITestResult result) {}

    <strong i="20">@Override</strong>
    public void onTestFailure(ITestResult result) {}

    <strong i="21">@Override</strong>
    public void onTestSkipped(ITestResult result) {}

    <strong i="22">@Override</strong>
    public void onTestFailedButWithinSuccessPercentage(ITestResult result) {}

    <strong i="23">@Override</strong>
    public void onStart(ITestContext context) {
        System.err.println("Start of execution <" + context.getName() + ">");
    }

    <strong i="24">@Override</strong>
    public void onFinish(ITestContext context) {}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="1265_Suite" parallel="false" verbose="2">
    <test name="956">
        <classes>
            <class name="org.rationale.emotions.github.issue956.AccountTest"/>
            <class name="org.rationale.emotions.github.issue956.CorporateTest"/>
        </classes>
    </test>
</suite>

Berikut outputnya

[INFO] --- maven-surefire-plugin:2.19.1:test (default-test) @ scrappable-project ---

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running TestSuite
[XmlSuite] [WARN] 'parallel' value 'false' is deprecated, default value will be used instead: 'none'.
...
... TestNG 6.10 by Cédric Beust ([email protected])
...

New instance created
Start of execution <956>
Test started: org.rationale.emotions.github.issue956.AccountTest.testMethod()
accountTest()
Test started: org.rationale.emotions.github.issue956.CorporateTest.testMethod()
corporateTest()
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.461 sec - in TestSuite

Results :

Tests run: 2, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.752 s
[INFO] Finished at: 2016-12-09T21:48:28+05:30
[INFO] Final Memory: 22M/244M
[INFO] ------------------------------------------------------------------------

ping @juherr (Hanya menjaga fyi'ed Anda)

Semua 22 komentar

Halo,

Saya memiliki masalah serupa, testng.xml saya terlihat seperti berikut:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="suite1" verbose="1">
    <listeners>
        <listener class-name="org.testng.reporters.SuiteHTMLReporter"/>
        <listener class-name="org.testng.reporters.TestHTMLReporter"/>
    </listeners>
    <test name="package1">
        <classes>
            <class name="xxx.xxx.xxx.Account"/>
            <class name="xxx.xxx.xxx.Corporate"/>
            <class name="xxx.xxx.xxx.Department"/>
            <class name="xxx.xxx.xxx.Login"/>
            <class name="xxx.xxx.xxx.Subscriber"/>
        </classes>
    </test>
</suite>

Saya memiliki Pendengar yang saya gunakan untuk semua kelas di atas, yang mengimplementasikan ITestListener. Setiap kali tes dijalankan, saya melihat output berikut di log:

2016-01-25 15:28:22,517 [main] INFO  xxx.xxx.xxx.CustomListener - Start of execution package1
2016-01-25 15:28:22,518 [main] INFO  xxx.xxx.xxx.CustomListener - Start of execution package1
2016-01-25 15:28:22,518 [main] INFO  xxx.xxx.xxx.CustomListener - Start of execution package1
2016-01-25 15:28:22,519 [main] INFO  xxx.xxx.xxx.CustomListener - Start of execution package1
2016-01-25 15:28:22,519 [main] INFO  xxx.xxx.xxx.CustomListener - Start of execution package1
2016-01-25 15:28:26,716 [main] INFO  xxx.xxx.xxx.CustomListener - Test started: A0101_SearchAccountByName
2016-01-25 15:28:26,717 [main] INFO  xxx.xxx.xxx.CustomListener - Test started: A0101_SearchAccountByName
2016-01-25 15:28:26,717 [main] INFO  xxx.xxx.xxx.CustomListener - Test started: A0101_SearchAccountByName
2016-01-25 15:28:26,717 [main] INFO  xxx.xxx.xxx.CustomListener - Test started: A0101_SearchAccountByName
2016-01-25 15:28:26,717 [main] INFO  xxx.xxx.xxx.CustomListener - Test started: A0101_SearchAccountByName

Metode di dalam CustomListener terlihat seperti berikut:

    <strong i="13">@Override</strong>
    public void onTestStart(ITestResult iTestResult) {
        log.info("Test started: " + iTestResult.getName());
    }

    <strong i="14">@Override</strong>
    public void onStart(ITestContext iTestContext) {
        log.info("Start of execution " + iTestContext.getName());
    }

Masalah terjadi dengan semua metode di dalam pendengar, yaitu _onTestSuccess_, _onTestFailure_, dll.

Ada ide?

Saya memiliki masalah yang sama, dan mengatasinya dengan menambahkan boolean misalnya testStartListenerYetToRun ke kelas dasar dan menyetelnya ke True di @BeforeMethod (juga di kelas dasar), dan menambahkan kondisi if ke CustomListener misalnya:

<strong i="7">@Override</strong>
    public void onTestStart(ITestResult iTestResult) {
        if (((AbstractTestNGOrderGridTests)iTestResult.getInstance()).testStartListenerYetToRun) {
            ((AbstractTestNGOrderGridTests) iTestResult.getInstance()).testStartListenerYetToRun = false;
            log.info("Test started: " + iTestResult.getName());
       }
    }

Anda akan membutuhkan boolean kedua untuk metode onStart.

Metode tentu saja masih akan dipanggil sekali per kelas tetapi setidaknya kode hanya akan dieksekusi sekali.

@LibertyLocked - Apakah contoh di bawah ini yang Anda gunakan juga?

@stevie1877 - Apakah Anda mencoba melakukan ini di TestNG 6.10? Jika tidak, dapatkah Anda mencoba ini tanpa usaha dan melihat apakah Anda dapat mereproduksi ini? Jika Anda masih dapat membuatnya kembali, alangkah baiknya jika Anda dapat membantu membagikan contoh yang dapat saya gunakan untuk mereproduksi masalah ini, sehingga kami dapat memperbaikinya.

Inilah yang saya miliki sebagai kelas uji dan file xml suite yang saya coba gunakan untuk membuat ulang masalah [menggunakan TestNG v6.10] Saya tidak dapat mereproduksi masalah ini menggunakan contoh di bawah ini pada TestNG 6.10

package org.rationale.emotions.github.issue956;

import org.testng.annotations.Listeners;
import org.testng.annotations.Test;

@Listeners(ListenerFor956.class)
public class AccountTest {
    <strong i="11">@Test</strong>
    public void testMethod() {
        System.err.println("accountTest()");
    }
}
package org.rationale.emotions.github.issue956;

import org.testng.annotations.Listeners;
import org.testng.annotations.Test;

<strong i="14">@Listeners</strong> (ListenerFor956.class)
public class CorporateTest {
    <strong i="15">@Test</strong>
    public void testMethod() {
        System.err.println("corporateTest()");
    }

}
package org.rationale.emotions.github.issue956;

import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;

public class ListenerFor956 implements ITestListener {
    public ListenerFor956() {
        System.err.println("New instance created ");
    }

    <strong i="18">@Override</strong>
    public void onTestStart(ITestResult result) {
        String print = result.getTestClass().getRealClass().getName() + "." + result.getMethod()
            .getConstructorOrMethod().getMethod().getName() + "()";
        System.err.println("Test started: " + print);
    }

    <strong i="19">@Override</strong>
    public void onTestSuccess(ITestResult result) {}

    <strong i="20">@Override</strong>
    public void onTestFailure(ITestResult result) {}

    <strong i="21">@Override</strong>
    public void onTestSkipped(ITestResult result) {}

    <strong i="22">@Override</strong>
    public void onTestFailedButWithinSuccessPercentage(ITestResult result) {}

    <strong i="23">@Override</strong>
    public void onStart(ITestContext context) {
        System.err.println("Start of execution <" + context.getName() + ">");
    }

    <strong i="24">@Override</strong>
    public void onFinish(ITestContext context) {}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="1265_Suite" parallel="false" verbose="2">
    <test name="956">
        <classes>
            <class name="org.rationale.emotions.github.issue956.AccountTest"/>
            <class name="org.rationale.emotions.github.issue956.CorporateTest"/>
        </classes>
    </test>
</suite>

Berikut outputnya

[INFO] --- maven-surefire-plugin:2.19.1:test (default-test) @ scrappable-project ---

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running TestSuite
[XmlSuite] [WARN] 'parallel' value 'false' is deprecated, default value will be used instead: 'none'.
...
... TestNG 6.10 by Cédric Beust ([email protected])
...

New instance created
Start of execution <956>
Test started: org.rationale.emotions.github.issue956.AccountTest.testMethod()
accountTest()
Test started: org.rationale.emotions.github.issue956.CorporateTest.testMethod()
corporateTest()
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.461 sec - in TestSuite

Results :

Tests run: 2, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.752 s
[INFO] Finished at: 2016-12-09T21:48:28+05:30
[INFO] Final Memory: 22M/244M
[INFO] ------------------------------------------------------------------------

ping @juherr (Hanya menjaga fyi'ed Anda)

Terima kasih @krmahadevan , tidak, saya tidak dapat mereplikasi masalah menggunakan 6.10 - Saya telah menggunakan TestNG 6.1.1, jadi versi yang cukup lama. Saya akan memperbarui ke 6.10 karena ini dengan jelas menyelesaikan masalah. Terimakasih banyak.

@juherr - Saya kira kita bisa menutup masalah ini juga.

@krmahadevan Bisakah Anda memeriksa apakah tes saat ini mencakup kasus ini?

Saya mengalami masalah ini dengan TestNG 6.11.0

@snehalizaj Bisakah Anda membagikan contoh proyek?

Untuk apa nilainya, saya tidak dapat menduplikasi mesin ini secara lokal di kotak windows saya, tetapi saya bisa mendapatkan repro untuk mesin jenkins kami untuk testNG 6.10

Bagaimana dengan v6.11 atau v6.12 terbaru? ( 6.12 hanya ada di Jcenter dan belum
untuk sampai ke Maven Central).
Bisakah Anda mencoba dan memberi tahu kami? Juga tolong bantu bagikan sampel ke
membuat ulang masalah.

Memutakhirkan TestNG dari 6.9 ke 6.11 menyelesaikannya untuk saya. Terima kasih!

Hai!

Saya menggunakan versi terbaru TestNG 6.11, tetapi itu tidak menyelesaikan masalah ini untuk saya.

Konfigurasi xml saya terlihat seperti ini:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Test all" >
    <listeners>
        <listener class-name="com.selenium.test.testng.listeners.TestListener"/>
    </listeners>
    <test name="CheckoutDesktop">
        <classes>
            <class name="com.selenium.test.testng.tests.CheckoutTestsDesktop"/>
        </classes>
    </test>
    <test name="CheckoutMobile">
        <classes>
            <class name="com.selenium.test.testng.tests.CheckoutTestsMobile"/>
        </classes>
    </test>
</suite>

Ketika saya menjalankan tes di Intellij IDEA semua metode TestListener dipanggil dua kali.

@ils-808 - Apakah Anda memiliki tes yang dapat kami gunakan untuk mereproduksi masalah?
Juga apa yang terjadi ketika Anda menjalankan pengujian dari baris perintah (atau) menggunakan alat build seperti Gradle/Maven ?

@krmahadevan , saya menemukan bahwa itu adalah kesalahan saya. Versi 6.11 berfungsi dengan baik, terima kasih!

Saya menghadapi masalah yang sama. Dalam skenario saya, hanya ada satu testcase di kelas tunggal. Saya menggunakan Pengujian versi 7.1.0 dan saya menghadapi masalah ini. Saya telah mencoba menguji versi di bawah 6.10 tetapi menghadapi hal yang sama. Mohon bantuannya.

@Abhijitdatta tolong bagikan contoh yang dapat digunakan untuk mereproduksi masalah

Versi TestNG pada EclipseIDE: 7.1.0
Sepertinya saya menghadapi masalah yang sama. Saya memiliki @beforemethod dan @Test yang dikelompokkan dalam tes positif, negatif, dan asap di file proyek Java saya. Saat dijalankan melalui command prompt (mvn clean test)3 tes dijalankan seperti yang diharapkan, tetapi dengan pakar di Eclipse , hasil testng menampilkan 6 tes dengan 3 diabaikan menggunakan suitexml.
Testngreportxml dan suitexml terlampir (dalam format file teks)
dan tangkapan layar laporan tentang Eclipse.
Logintestsuite.txt
testngreport.txt
Reportview on eclipse
Bisakah Anda memberi tahu saya mengapa ini tampaknya menjadi masalah pada laporan pengujian.

@seleniumsb - Jika masalahnya hanya saat menjalankan tes melalui Eclipse, maka Anda harus mengajukan masalah di https://github.com/cbeust/testng-Eclipse/issues

Jika masalah ini dapat direproduksi bahkan melalui menjalankan dari baris perintah maven, silakan buat bug baru dengan contoh lengkap yang dapat digunakan untuk mereproduksi masalah.

@krmahadevan , ini adalah skenario berikut.

Ini adalah Testcase sederhana

    <strong i="8">@Test</strong>
    public void getTitleTest()
    {
        String actualTitle = driver.getTitle();
        System.out.println(actualTitle);
        String expectedTitle = "Free CRM #1 cloud software for any business large or small123";
        Assert.assertEquals(actualTitle, expectedTitle);
    }

Metode pengambilan gambar kelas dasar

 public void getScreenshot(String testcasename, WebDriver driver) throws IOException
    {

        System.out.println("in screenshot method");
        TakesScreenshot ts = (TakesScreenshot)driver;
        System.out.println("in line1");
        File source = ts.getScreenshotAs(OutputType.FILE);
        System.out.println("in line2");
        String destinationFile = System.getProperty("user.dir")+"\\reports\\"+testcasename+".png";
        FileUtils.copyFile(source, new File (destinationFile));

    }

sengaja diharapkan judul diberikan salah untuk menangkap tangkapan layar.. Metode @Test gagal dua kali. untuk pertama kalinya, masalah penegasannya dan untuk kedua kalinya, pengecualian penunjuk nol.

@Abhijitdatta - Itu bukan contoh yang dapat digunakan untuk mereproduksi masalah. Silakan bagikan contoh lengkap mandiri sederhana (tanpa ketergantungan pihak ketiga seperti Selenium) dengan pendengar yang dipanggil beberapa kali, sehingga kami dapat mereproduksi masalah. Informasi yang dibagikan TIDAK cukup untuk di-debug

Saya telah mereproduksi masalah ini.
Pendengar:

public class TestEventListener implements ITestListener {

    <strong i="7">@Override</strong>
    public void onTestFailure(ITestResult result) {
        System.out.println("Listener: test failed");
        System.out.println("Test class: " + result.getTestClass());
        System.out.println("Test method: " + result.getMethod() + "\n");
    }
}

Dua kelas tes:

@Listeners({TestEventListener.class})
public class FirstTestClass {

    <strong i="11">@Test</strong>
    public void firstTest(){
        System.out.println("First test");
        fail();
}
@Listeners({TestEventListener.class})
public class SecondTestClass {

    <strong i="14">@Test</strong>
    public void secondTest(){
        System.out.println("Second test");
        fail();
    }
}

Dua tes dideklarasikan di testng.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Selenium UI tests">
    <test name="First test">
        <classes>
            <class name="com.example.FirstTestClass"/>
        </classes>
    </test>
    <test name="Second test">
        <classes>
            <class name="com.example.SecondTestClass"/>
        </classes>
    </test>
</suite>

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>testng-listener-issue</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>7.1.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0-M4</version>
                <configuration>
                    <suiteXmlFiles>
                        <suiteXmlFile>testng.xml</suiteXmlFile>
                    </suiteXmlFiles>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>11</source>
                    <target>11</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Ketika saya memanggil tes bersih maven pada output saya dapat melihat bahwa setelah metode pendengar tes pertama dipanggil dua kali dan setelah tes kedua dipanggil sekali:

First test                                                                                                                                                                                        
Listener: test failed                                                                                                                                                                                                                                                           
Test class: [TestClass name=class example.FirstTestClass]                                                                                                                                                                                                                       
Test method: FirstTestClass.firstTest()[pri:0, instance:example.FirstTestClass@40005471]                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
Listener: test failed                                                                                                                                                                                                                                                           
Test class: [TestClass name=class example.FirstTestClass]                                                                                                                                                                                                                       
Test method: FirstTestClass.firstTest()[pri:0, instance:example.FirstTestClass@40005471]                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
Second test                                                                                                                                                                                                                                                                     
Listener: test failed                                                                                                                                                                                                                                                           
Test class: [TestClass name=class example.SecondTestClass]                                                                                                                                                                                                                      
Test method: SecondTestClass.secondTest()[pri:0, instance:example.SecondTestClass@20d525]

Ketika saya mendeklarasikan hanya satu tes di testng.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Selenium UI tests">
    <test name="First test">
        <classes>
            <class name="example.FirstTestClass"/>
        </classes>
    </test>
</suite>

Saya dapat melihat bahwa metode pendengar dipanggil sekali:

First test                                                                                                                                                                                                                                                                      
Listener: test failed                                                                                                                                                                                                                                                           
Test class: [TestClass name=class example.FirstTestClass]                                                                                                                                                                                                                       
Test method: FirstTestClass.firstTest()[pri:0, instance:example.FirstTestClass@40005471]

Ini diperbaiki melalui PR https://github.com/cbeust/testng/pull/2222 dan tersedia di TestNG 7.3.0 (versi rilis terbaru)

Apakah halaman ini membantu?
0 / 5 - 0 peringkat