簡體   English   中英

如何在一個測試中運行測試用例

[英]How to run tests cases in one test

我正在尋找運行測試的解決方案,其中包含來自多個測試用例的測試用例。 我需要像這樣進行測試:1.打開主頁 2.點擊登錄鏈接 3.輸入登錄並通過+提交

我有 2 個類(頁面)HomePage 和 LoginPage,我想制作 GotoLoginPageTest 和 LoginTest。 我不知道如何讓流程運行 GotoLoginPageTest 並在同一瀏覽器 LoginTest 中運行(一個測試中有 2 個測試用例)。 我不知道如何上癮這兩個測試用例。 你能告訴我怎么做嗎,或者一些使用 pagefactory、page 對象的例子? 我使用 maven、testng、java。 我的代碼:

 public class HomePage {
 WebDriver driver;  

 public static final  String PAGE_TITLE = "page title";
 public static final  String PAGE_URL = "www.blbl.pl";

@FindBy(xpath = "//*[@id='global-nav']/div/div/div[3]/ul/li[1]/a")
WebElement LogInLink;

    public HomePage(WebDriver driver){
        this.driver = driver;
    }

    public void isHomePage(){
    String pageTitle = driver.getTitle();
    Assert.assertEquals(pageTitle, PAGE_TITLE);
}

public void goToLoginPage(){
    LogInLink.click();
}

}

登錄頁面

public class LoginPage {
WebDriver driver;

public static final  String PAGE_TITLE = "Login";

@FindBy(id="user_email")
WebElement inputUserEmail;

@FindBy(id="user_password")
WebElement inputUserPassword;


public LoginPage(WebDriver driver){
    this.driver = driver;
}

public void isLoginPage(){
    String pageTitle = driver.getTitle();
    Assert.assertEquals(pageTitle, PAGE_TITLE);
}

public void fillUserEmail(){
    inputUserEmail.sendKeys("asdfasd@gmail.com");
    Assert.assertEquals(inputUserEmail.getAttribute("value"), "asdfasd@gmail.com");
}

public void fillUserPassword(){
    inputUserPassword.sendKeys("123456");
    Assert.assertEquals(inputUserPassword.getAttribute("value"), "123456");
}

}

轉到登錄頁面測試

import pages.HomePage;

public class GotoLoginPageTest {
    WebDriver driver;
    HomePage hp;


    @BeforeClass
    public void setup(){
        this.driver = new FirefoxDriver();
        hp = PageFactory.initElements(driver, HomePage.class);
        driver.get(HomePage.PAGE_URL);
    }

    @Test(priority = 1)
    public void isHomePage(){
        hp.isHomePage();
    }

    @Test(dependsOnMethods = "isHomePage")
    public void gotoLoginPage(){
        hp.goToLoginPage();
    }

}

登錄測試

public class LoginTest {
    WebDriver driver;

    LoginPage lp = PageFactory.initElements(driver, LoginPage.class);

    @Test
    public void cheskIsLoginPage(){
        lp.isLoginPage();
    }

    @Test
    public void logInBase(){
        lp.fillUserEmail();
        lp.fillUserPassword();
    }

}

我的 testng.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="none">
  <test name="Test">
    <classes>
      <class name="tests.GotoLoginPageTest"/>
      <class name="tests.LoginTest"/>
    </classes>
  </test> <!-- Test -->
</suite> <!-- Suite -->

GotoLoginPageTest通過LoginTest失敗,我有錯誤 java.lang.NullPointerException。

java.lang.NullPointerException
at org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69)
at org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:38)
at com.sun.proxy.$Proxy5.sendKeys(Unknown Source)
at pages.LoginPage.fillUserEmail(LoginPage.java:30)
at tests.LoginTest.logInBase(LoginTest.java:27)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:85)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:659)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:845)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1153)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:108)
at org.testng.TestRunner.privateRun(TestRunner.java:771)
at org.testng.TestRunner.run(TestRunner.java:621)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:357)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:352)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:310)
at org.testng.SuiteRunner.run(SuiteRunner.java:259)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1199)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1124)
at org.testng.TestNG.run(TestNG.java:1032)
at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)

我知道 LoginPage 中沒有驅動程序實例,但我不想創建新驅動程序(瀏覽器),因為我想在同一個瀏覽器中進行此測試。

我正在嘗試使用 super(driver) 但即使來自 GotoLoginPage 的測試也失敗了......

我只想知道如何使用像我現在使用的項目結構(頁面類 + 測試類)在一個測試中運行幾個測試用例

基類:

       public class BaseClass {
    public static WebDriver driver;

    public BaseClass(WebDriver driver) {
        BaseClass.driver = driver;
    }

}

主頁:

public HomePage(WebDriver driver){
            super(driver);
        }

登錄頁面:

public HomePage(WebDriver driver){
            super(driver);
        }

------====================== 2015 年 10 月 22 日上傳================-- -----


基類

public class BaseClass {
    public static WebDriver driver; --------------- CHANGED
public String PAGE_URL;
public String PAGE_TITLE;

public BaseClass(WebDriver driver) {
    BaseClass.driver = driver;---------------------- CHANGED
    PageFactory.initElements(driver, this);
}
}

主頁

public class HomePage extends BaseClass {

    public HomePage(WebDriver driver) {
        super(driver);
        this.PAGE_TITLE = "title";
        this.PAGE_URL = "https://totest.com/";
    }

     @FindBy(xpath = "//*[@id='global-nav']/div/div/div[3]/ul/li[1]/a")
     WebElement LogInLink;

    public void isHomePage(){
        String pageTitle = driver.getTitle();
        Assert.assertEquals(pageTitle, PAGE_TITLE);
    }

    public void goToLoginPage(){
        LogInLink.click();
    }
}

登錄頁面

public class LoginPage extends BaseClass{

    @FindBy(id="user_email")
    WebElement inputUserEmail;

    @FindBy(id="user_password")
    WebElement inputUserPassword;

    public LoginPage(WebDriver driver){
        super(driver);
        this.PAGE_TITLE = "Login to Base";
    }

    public void isLoginPage(){
        String pageTitle = driver.getTitle();
        Assert.assertEquals(pageTitle, PAGE_TITLE);
    }

    public void fillUserEmail(){
        inputUserEmail.sendKeys("mail@gmail.com");
        Assert.assertEquals(inputUserEmail.getAttribute("value"), "mail@gmail.com");
    }

    public void fillUserPassword(){
        inputUserPassword.sendKeys("testbase");
        Assert.assertEquals(inputUserPassword.getAttribute("value"), "testbase");
    }

}

轉到登錄頁面

public class GotoLoginPageTest {
------------------------------------------ CHANGED(removerd WebDriver driver)

    public HomePage hp;

    @BeforeTest
    public void setup(){
        driver = new FirefoxDriver();
        hp = PageFactory.initElements(driver, HomePage.class);
        driver.get(hp.PAGE_URL);
    }

    @Test(priority = 1)
    public void isHomePage(){
        hp.isHomePage();
    }

    @Test(dependsOnMethods = "isHomePage")
    public void gotoLoginPage(){
        hp.goToLoginPage();
    }

}

登錄測試

public class LoginTest {
    ------------------------------------------ CHANGED(removerd WebDriver driver)
    public LoginPage lp;

    public void setup(WebDriver driver){
    lp = PageFactory.initElements(driver, LoginPage.class);
    }

    @Test
    public void cheskIsLoginPage(){
        lp.isLoginPage();   
    }

    @Test
    public void logInBase(){
        lp.fillUserEmail();
        lp.fillUserPassword();
    }

}

測試文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="none">
  <test name="Test">
    <classes>
      <class name="tests.GotoLoginPageTest"/>
      <class name="tests.LoginTest"/>
    </classes>
  </test> <!-- Test -->
</suite> <!-- Suite -->

新錯誤!!!:

TestNG] Running:
  /tmp/testng-eclipse-1551592337/testng-customsuite.xml

PASSED: isHomePage
PASSED: gotoLoginPage
FAILED: cheskIsLoginPage
java.lang.NullPointerException
    at tests.LoginTest.cheskIsLoginPage(LoginTest.java:19)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:85)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:659)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:845)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1153)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:108)
    at org.testng.TestRunner.privateRun(TestRunner.java:771)
    at org.testng.TestRunner.run(TestRunner.java:621)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:357)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:352)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:310)
    at org.testng.SuiteRunner.run(SuiteRunner.java:259)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1199)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1124)
    at org.testng.TestNG.run(TestNG.java:1032)
    at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)

FAILED: logInBase
java.lang.NullPointerException
    at tests.LoginTest.logInBase(LoginTest.java:24)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:85)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:659)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:845)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1153)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:108)
    at org.testng.TestRunner.privateRun(TestRunner.java:771)
    at org.testng.TestRunner.run(TestRunner.java:621)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:357)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:352)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:310)
    at org.testng.SuiteRunner.run(SuiteRunner.java:259)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1199)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1124)
    at org.testng.TestNG.run(TestNG.java:1032)
    at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)


===============================================
    Default test
    Tests run: 4, Failures: 2, Skips: 0
===============================================


===============================================
Default suite
Total tests run: 4, Failures: 2, Skips: 0
===============================================

[TestNG] Time taken by org.testng.reporters.JUnitReportReporter@6d86b085: 9 ms
[TestNG] Time taken by [FailedReporter passed=0 failed=0 skipped=0]: 3 ms
[TestNG] Time taken by org.testng.reporters.SuiteHTMLReporter@39a054a5: 6 ms
[TestNG] Time taken by org.testng.reporters.XMLReporter@6a38e57f: 4 ms
[TestNG] Time taken by org.testng.reporters.jq.Main@1f89ab83: 17 ms
[TestNG] Time taken by org.testng.reporters.EmailableReporter2@43556938: 4 ms

當您使用 TESTNG 時,一鍵運行多個方法/類非常簡單。

您不需要為主頁、登錄等設置不同的類。您可以這樣做:

1 - 創建通用的 TestNG 類

2 - 為主頁添加功能/方法

3 - 添加登錄功能/方法

方法一:

    @Test(priority = 0)
    public void Home() 
    {
      
       //LOGIC FOR HOME
    
    }

    @Test(priority = 1)
    public void Login() 
    {
      
       //LOGIC FOR LOGIN
    
    }

如果您想使用當前的類,那么只需將現有類轉換為 TESTNG 類並添加一個新的 TESTNG 類來調用這些類的方法。

方法二:

@Test(priority = 0)
public void Home() 
{
  
  //  Yourclassname.(dot)method name

}

@Test(priority = 1)
public void Login() 
{
  
   //  Yourclassname.(dot)method name

}

因此,這就是您可以使用 TESTNG 通過一鍵單擊和一個類在 selenium 中運行多個事物的方法。

方法三:

此外,您還可以通過 XML 運行測試,步驟如下:

1 - 通過右鍵單擊您的項目創建新的 xml 文件。

2 - 將下面的代碼粘貼到 xml 中

  <suite name="Your Test Suite Name">
    <test name="Your Test Name>
        <classes>
            <class name="Yourpackage.(dot)classname"/> //This is that common class which we have created above
        </classes>
    </test>
</suite>

以上將允許您僅通過一個 xml 運行所有測試。

根據您更新的問題,您的驅動程序獲取 null 作為聲明和調用類是不同的。

所以你應該聲明 driver : public static WebDriver driver;

然后,當您調用其他類時,它將類似於: GotoLoginPageTest.driver.getTitle(); 此外,一旦您在上面應用,您應該從所有其他類中刪除所有驅動程序聲明。

要全局聲明驅動程序的另一件事,您可以通過以下方式創建基類和添加方法:

public static WebDriver driver;
        
        
        //CHECK FOR DRIVER AND CALL IT
        public static WebDriver getdriver()
        {
            
            if(driver==null)
            {
                
                setup();
                
                
            }
            
            return driver;
            
        }

要在其他類中調用它,它將是Base.getdriver().yourproperties

暫無
暫無

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

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