簡體   English   中英

無法在Java上使用@Factory testng批注運行並行測試

[英]Cannot run parallel tests with @Factory testng annotation on java

因此,我使用@Factory對5封不同的電子郵件運行一項測試,但是我得到了錯誤數量的參數異常,並且無法在控制台上看到完整的錯誤跟蹤。 我使用TestNG。 這是我的代碼:

package com.task.lab.facadetask;

public class GmailTest {
    private WebDriver driver;
    private static List<User> usersList;
    static List<TestMessage> mess;

    public GmailTest(){}


    @Factory(dataProviderClass = GmailTest.class, dataProvider = "getData")
    public GmailTest(WebDriver driver,List<User> usersList, List<TestMessage> mess ){
        this.driver = driver;
        GmailTest.usersList = usersList;
        GmailTest.mess = mess;
    }

    @BeforeMethod
    public void setUpDriver(){
        driver = DriverObject.getDriver();
    }

    @DataProvider
    public static Object[][] getData() {
        File usersXml = new File("src\\\\main\\\\java\\\\com\\\\task\\\\lab\\\\facadetask\\\\testdata\\\\users.xml");

        try {
            usersList = JAXB.unmarshal(usersXml);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        TestMessages messages =  UnMarshell.unmarshaller();
        assert messages != null;
        mess = messages.getTestMessages();
        return new Object[][]{
                {mess.get(0), usersList.get(0)},
                {mess.get(1), usersList.get(1)},
                {mess.get(2), usersList.get(2)},
        };
    }

    @Test
    public void testGmail(TestMessage message, User users) {
        String gmailURL = "https://accounts.google.com/signin";
        driver.get(gmailURL);
        Login loginPage = new Login();
        loginPage.login(users.getEmail(), users.getPassword());
        GmailMessage gmailPage = new GmailMessage();
        gmailPage.sendMessage(message.getReceiver(), message.getSubject(), message.getMessage());
        gmailPage.removeMessage();
        Assert.assertTrue(gmailPage.isRemoved());
    }
    @AfterMethod
    public void quitBrowser(){
        try{
            driver.close();
        }finally{
            driver.quit();
        }
    }
}

我的假設是,這可能是由於將用戶和消息的原始非靜態列表更改為靜態而引起的,但是DataProvider方法必須是靜態的。 有人可以指導我做錯什么嗎? UPD:因此,我按照Krishnan的建議刪除了@BeforeMethod,並將驅動程序包含在@DataProvider中 ,但它給了我同樣的錯誤,錯誤的參數數量。 這是DataProvider現在開始的內容:

@DataProvider
public static Object[][] getData() {
    driver = DriverObject.getDriver();
    File usersXml = new File   //The rest remains the same

另外,我嘗試在BeforeMethod中初始化驅動程序,但在這種情況下Test看不到它。 看起來像這樣:

@BeforeMethod
public void setUpDriver(){
    WebDriver driver = DriverObject.getDriver();
}

也許有人可以為我提供Factory的有效模擬,以便我可以同時運行5個並行測試? 我願意征求意見。

您的工廠方法定義為接受3個參數。

@Factory(dataProviderClass = GmailTest.class, dataProvider = "getData")
public GmailTest(WebDriver driver,List<User> usersList, List<TestMessage> mess ){
    this.driver = driver;
    GmailTest.usersList = usersList;
    GmailTest.mess = mess;
}

您的數據提供商僅提供2個參數。 您的數據提供商未提供WebDriver。

您可以執行以下操作之一:

  • 通過調用DriverObject.getDriver()增強數據提供程序以包含WebDriver對象,並刪除@BeforeMethod方法(或)。
  • 更改構造函數的簽名以不接受WebDriver實例,而是通過@BeforeMethod初始化類的WebDriver實例。

那應該解決您的問題。

編輯:問題已更新。 所以也更新我的答案。

從問題的最新情況看,答案在很大程度上還是一樣的。 現在還包括一個樣本,解釋了答案。

模擬User類的外觀

import java.util.ArrayList;
import java.util.List;

public class User {
    private String name;

    public User(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public static List<User> newUsers(String... names) {
        List<User> users = new ArrayList<>();
        for (String name : names) {
            users.add(new User(name));
        }
        return users;
    }
}

模擬TestMessage類的外觀

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class TestMessage {
    private String text;

    public TestMessage(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }

    public static List<TestMessage> newMessages(int howMany) {
        List<TestMessage> msgs = new ArrayList<>();
        for (int i = 0; i < howMany; i++) {
            msgs.add(new TestMessage(UUID.randomUUID().toString()));
        }
        return msgs;
    }
}

這是測試類的樣子

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Factory;
import org.testng.annotations.Test;

import java.util.Collections;
import java.util.List;

public class GmailTest {
    private WebDriver driver;
    private List<User> users;
    private List<TestMessage> testMessages;

    @Factory(dataProvider = "getData")
    public GmailTest(WebDriver driver, List<User> users, List<TestMessage> testMessages) {
        this.driver = driver;
        this.users = users;
        this.testMessages = testMessages;
    }

    @Test
    public void testMethod() {
        Assert.assertNotNull(driver);
        Assert.assertNotNull(users);
        Assert.assertNotNull(testMessages);
    }

    @AfterClass
    public void cleanupDrivers() {
        if (driver != null) {
            driver.quit();
        }
    }

    @DataProvider(name = "getData")
    public static Object[][] getData() {
        List<User> users = User.newUsers("Jack", "Daniel", "John");
        int size = users.size();
        List<TestMessage> testMessages = TestMessage.newMessages(size);
        Object[][] data = new Object[size][1];
        for (int i = 0; i < size; i++) {
            data[i] = new Object[]{new FirefoxDriver(), Collections.singletonList(users.get(i)),
                    Collections.singletonList(testMessages.get(0))};
        }
        return data;
    }
}

這是執行日志

1518271888011   geckodriver INFO    geckodriver 0.19.1
1518271888131   geckodriver INFO    Listening on 127.0.0.1:14727
1518271888627   mozrunner::runner   INFO    Running command: "/Applications/Firefox.app/Contents/MacOS/firefox-bin" "-marionette" "-profile" "/var/folders/mj/81r6v7nn5lqgqgtfl18spfpw0000gn/T/rust_mozprofile.5mkpumai11hO"
1518271889362   Marionette  INFO    Enabled via --marionette
2018-02-10 19:41:30.336 plugin-container[53151:969522] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0xad33, name = 'com.apple.tsm.portname'
See /usr/include/servers/bootstrap_defs.h for the error codes.
1518271890773   Marionette  INFO    Listening on port 52891
1518271890793   Marionette  WARN    TLS certificate errors will be ignored for this session
Feb 10, 2018 7:41:30 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: W3C
1518271890961   geckodriver INFO    geckodriver 0.19.1
1518271891060   geckodriver INFO    Listening on 127.0.0.1:6639
2018-02-10 19:41:31.225 plugin-container[53152:969613] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0xaa37, name = 'com.apple.tsm.portname'
See /usr/include/servers/bootstrap_defs.h for the error codes.
1518271891259   mozrunner::runner   INFO    Running command: "/Applications/Firefox.app/Contents/MacOS/firefox-bin" "-marionette" "-profile" "/var/folders/mj/81r6v7nn5lqgqgtfl18spfpw0000gn/T/rust_mozprofile.npquNnysdwGI"
1518271891832   Marionette  INFO    Enabled via --marionette
2018-02-10 19:41:32.786 plugin-container[53155:969741] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0xab3f, name = 'com.apple.tsm.portname'
See /usr/include/servers/bootstrap_defs.h for the error codes.
1518271893243   Marionette  INFO    Listening on port 53150
1518271893342   Marionette  WARN    TLS certificate errors will be ignored for this session
Feb 10, 2018 7:41:33 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: W3C
1518271893499   geckodriver INFO    geckodriver 0.19.1
1518271893590   geckodriver INFO    Listening on 127.0.0.1:48408
2018-02-10 19:41:33.681 plugin-container[53156:969822] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x7c37, name = 'com.apple.tsm.portname'
See /usr/include/servers/bootstrap_defs.h for the error codes.
1518271893810   mozrunner::runner   INFO    Running command: "/Applications/Firefox.app/Contents/MacOS/firefox-bin" "-marionette" "-profile" "/var/folders/mj/81r6v7nn5lqgqgtfl18spfpw0000gn/T/rust_mozprofile.65SomKttNwQP"
1518271894377   Marionette  INFO    Enabled via --marionette
2018-02-10 19:41:35.326 plugin-container[53159:969958] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x1523b, name = 'com.apple.tsm.portname'
See /usr/include/servers/bootstrap_defs.h for the error codes.
1518271895785   Marionette  INFO    Listening on port 53451
1518271895824   Marionette  WARN    TLS certificate errors will be ignored for this session
Feb 10, 2018 7:41:35 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: W3C
[GFX1-]: Receive IPC close with reason=AbnormalShutdown
1518271896172   addons.xpi  WARN    Exception running bootstrap method shutdown on activity-stream@mozilla.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIObserverService.removeObserver]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: resource://activity-stream/lib/SnippetsFeed.jsm :: uninit :: line 125"  data: no] Stack trace: uninit()@resource://activity-stream/lib/SnippetsFeed.jsm:125 < onAction()@resource://activity-stream/lib/SnippetsFeed.jsm:141 < _middleware/</<()@resource://activity-stream/lib/Store.jsm:51 < Store/this[method]()@resource://activity-stream/lib/Store.jsm:30 < uninit()@resource://activity-stream/lib/Store.jsm:153 < uninit()@resource://activity-stream/lib/ActivityStream.jsm:278 < uninit()@resource://gre/modules/addons/XPIProvider.jsm -> jar:file:///Applications/Firefox.app/Contents/Resources/browser/features/activity-stream@mozilla.org.xpi!/bootstrap.js:80 < shutdown()@resource://gre/modules/addons/XPIProvider.jsm -> jar:file:///Applications/Firefox.app/Contents/Resources/browser/features/activity-stream@mozilla.org.xpi!/bootstrap.js:196 < callBootstrapMethod()@resource://gre/modules/addons/XPIProvider.jsm:4406 < observe()@resource://gre/modules/addons/XPIProvider.jsm:2270 < GeckoDriver.prototype.quit()@driver.js:3381 < despatch()@server.js:560 < execute()@server.js:534 < onPacket/<()@server.js:509 < onPacket()@server.js:508 < _onJSONObjectReady/<()@transport.js:500

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


Process finished with exit code 0

暫無
暫無

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

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