簡體   English   中英

超類中的TestNG批注

[英]TestNG Annotations in a Superclass

我在使用TestNG注釋時遇到了一些麻煩,並且在stackoverflow或testng文檔中都找不到很好的答案。 我想做的是將testng偵聽器以及來自testng.xml文件的參數添加到“測試庫”超類。 所有的testng測試都將繼承超類。 這將減輕testng測試類文件中的大量代碼冗余。 但是,當我在超類中具有@Listeners和@Parameters注釋,而不是包含@Test方法的類時,這些注釋將不起作用。 換句話說,偵聽器似乎沒有“看到”測試,並且在運行時不會將testng.xml中的參數引入超類。

我的“測試庫”(超類)有一個來自Sauce Labs api的testng偵聽器,該偵聽器將偵聽測試,並在遠程執行過程中向Sauce Labs更新測試的成功/失敗。 它還使用@Parameters批注從當前測試運行的testng.xml中提取參數。

TestBase超類:

@Listeners(SauceOnDemandTestListener.class)
public class TestBase implements SauceOnDemandSessionIdProvider, SauceOnDemandAuthenticationProvider {
    private SauceOnDemandAuthentication authentication;
    private DesiredCapabilities capabilities;
    protected ParallelWebDriver parallelWebDriver;

    @Parameters({"sauce_username", "sauce_accesskey", "platform", "browser", "version"})
    @BeforeClass(alwaysRun = true)
    public void setUp(String userName, String accessKey, String platform, String browser, String version) {   
        // Set up Sauce Auth
        if (userName != null && accessKey != null) {
            this.authentication = new SauceOnDemandAuthentication(userName, accessKey);
        } else {
            this.authentication = new SauceOnDemandAuthentication();
        }

        // Set up the DesiredCapabilities
        if (platform != null) {
            this.capabilities.setCapability("platform", platform);
        } else {
            throw new NullArgumentException("[Parameter] platform does not exist or is not a valid value in testng.xml:");
        }

        if (browser != null) {
            this.capabilities.setCapability("browser", browser);
        } else {
            throw new NullArgumentException("[Parameter] browser does not exist or is not a valid value in testng.xml:");
        }

        if (version != null) {
            this.capabilities.setCapability("version", version);
        } else {
            throw new NullArgumentException("[Parameter] version does not exist or is not a valid value in testng.xml:");
        }

        // Set up the ParallelWebDriver for the test run
        parallelWebDriver = new ParallelWebDriver(new RemoteParallelDriver(), this.testingPlatform, capabilities);
        parallelWebDriver.setUserName(userName);
        parallelWebDriver.setAccessKey(accessKey);
    }

    @Override
    public String getSessionId() {
        SessionId sessionId = ((RemoteWebDriver)((WebDriver)parallelWebDriver.getDriver())).getSessionId();
        return (sessionId == null) ? null : sessionId.toString();
    }

    @Override
    public SauceOnDemandAuthentication getAuthentication() {
        return authentication;
    }
}

這是一個繼承TestBase的示例測試類。

public class SauceLabsRemote_Test extends TestBase {
    @BeforeTest
    public void testSetUp() throws MalformedURLException {
        parallelWebDriver.openBrowser();
    }

    public void searchGoogle(String searchText) throws InterruptedException {
        parallelWebDriver.getDriver().get("https://google.com");
        WebElement searchBox = parallelWebDriver.getDriver().findElement(By.id("gbqfq"));
        searchBox.sendKeys(searchText);
        WebElement searchButton = parallelWebDriver.getDriver().findElement(By.id("gbqfb"));
        searchButton.click();

        Assert.assertEquals(searchBox.getText(), "banjo");
    }

    @Test
    public void searchGoogle_Test1() throws InterruptedException {
        searchGoogle("banjo");
    }

    @Test
    public void searchGoogle_Test2() throws InterruptedException {
        searchGoogle("guitar");
    }

    @AfterTest
    public void testTearDown() {
        parallelWebDriver.closeBrowser();
    }
}

這是我的testng.xml的模型。

<suite name="Base Framework Unit Test Suite" verbose="1" >   

    <!-- Parameters required for Sauce Labs run -->
    <parameter name="sauce_username" value="testuser" />
    <parameter name="sauce_accesskey" value="acc3-55k3y-t3st-t3st-t3st" />

    <test name="Sauce Labs Remote Execution Test" >
        <parameter name="platform" value="OS X 10.6" />
        <parameter name="browser" value="firefox" />
        <parameter name="version" value="26" />
        <classes>
            <class name="unittest.SauceLabsRemote_Test" />
        </classes>
    </test>

</suite>

因此,有什么方法可以讓TestNG的@Listeners和@Parameters在不包含@Test的超類上工作? 提前致謝! 對於任何不良的編碼做法,我們深表歉意。 所有這些代碼都是即時進行模擬的。

超類中的@Listeners和@Parameters批注將在子類中繼承。 我已經對此進行了測試,並驗證了它的有效性。 因此,就像我的代碼示例一樣,在我的TestBase父類中使用的@Listeners注釋偵聽了繼承TestBase的子類的任何@Test注釋。

我遇到的問題與Sauce Labs測試執行,Selenium Grid測試執行與本地測試執行有關。 我必須向Sauce Lab的SauceOnDemandTestListener類添加邏輯,以弄清測試執行是否確實路由到了Sauce Labs VM瀏覽器作業。 該邏輯超出了我最初提出的問題的范圍,因此我不會在此處發布。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM