Pertanyaan Bagaimana memanggil metode default dari antarmuka dengan tes TestNG dan Selenium?


Saya ingin tahu apakah mungkin menggunakan metode default dari antarmuka dengan TestNG @BeforeMethod anotasi?

Berikut contohnya, yang saya coba:

@Listeners(TestListener.class)
public interface ITestBase {
    String baseUrl = Config.getProperty(Config.TEST_HOST);
    String driverName = Config.getProperty(Config.BROWSER);
    DriversEnum driverInstance = DriversEnum.valueOf(driverName.toUpperCase());

    @BeforeMethod(alwaysRun = true)
    default public void start() {
        try {
            driver.init();
            DriverUnit.preconfigureDriver(Driver.driver.get());
            driver.get().manage().deleteAllCookies();
            driver.get().get(baseUrl);
        } catch (TimeoutException e) {
            Logger.logEnvironment("QT application is not available");
        }
    }

    @AfterMethod(alwaysRun = true)
    default public void end() {
        if (driver.get() != null) {
            try {
                driver.get().quit();
            } catch (UnreachableBrowserException e) {
                Logger.logDebug("UnreachableBrowser on close");
            } finally {
                driver.remove();
            }
        }
    }

Ketika saya menjalankan metode tes TestNG yang khas, seperti:

public class AppUiDemo implements ITestBase {
    @Test(enabled = true)
    public void checkWebDriverCreation() {
      ...
    }

start() dan end() metode tidak dipanggil. Instance driver tidak dibuat untuk eksekusi uji.

Apakah mungkin untuk membuat sesuatu seperti itu default metode dan metode TestNG?

Jika saya mengubah antarmuka ke kelas reguler, sebelum dan sesudah metode dipanggil (instance driver dibuat baik-baik saja):

public class TestBase {
    protected final String baseUrl = Config.getProperty(Config.TEST_HOST);
    protected final String driverName = Config.getProperty(Config.BROWSER);
    protected final DriversEnum driverInstance = DriversEnum.valueOf(driverName.toUpperCase());

    @BeforeMethod(alwaysRun = true)
    public void start() {
    ....

Masalahnya adalah kelas uji saya sudah memperluas kelas lain:

public class MainTest extends ExecutionContext

Jadi saya tidak bisa memperpanjang TestBase.

Apakah mungkin untuk menggunakan antarmuka dengan implementasi untuk kode eksekusi sebelum dan sesudah metode pengujian? 


5
2017-11-16 19:52


asal


Jawaban:


Ya, itu mungkin tetapi versi TestNG yang memungkinkan menggunakan metode antarmuka dalam tes belum dirilis. Anda harus mengunduhnya dari ini gudang.

Jika Anda menggunakan Maven Anda dapat menentukan repositori tambahan di pom.xml:

<repository>
    <id>testng</id>
    <name>testng</name>
    <url>https://oss.sonatype.org/content/repositories/snapshots</url>
</repository>

Lalu tambahkan dependensi TestNG:

<dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>6.11.1-SNAPSHOT</version>
</dependency>

Contoh:

package test;

import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

public class DummyTest implements ITest {

    @BeforeMethod
    public void beforeTest() {
        System.out.println("before from class");
    }

    @Test
    public void test1() {
        System.out.println("I am test1");
    }
}

dan ITest antarmuka

package test;

import org.testng.annotations.BeforeMethod;

public interface ITest {

    @BeforeMethod
    default void beforeDefaultInterface() {
        System.out.println("before from default interface method");
    }
    @BeforeMethod
    static void beforeStaticInterface() {
        System.out.println("before from static interface method");
    }
}

Output dari tes di atas adalah:

    sebelumnya dari metode antarmuka default
    sebelumnya dari metode antarmuka statis
    sebelum dari kelas
    Saya test1

5
2017-11-16 21:38



Mungkin dengan versi TestNg '6.14.2'

Repo alternatif, tidak lagi diperlukan.
Saya belum mencoba versi lain.


0
2018-02-08 11:48