簡體   English   中英

使用 TestNG、Java 和 InteliJ Idea 的 DataProvider

[英]DataProvider using TestNG,Java and InteliJ Idea

我已經使用 DataProvider 實現了簡單的 Login selenium 框架。 我創建了一個包含用戶名和密碼的簡單登錄頁面。 我還創建了帶有登錄數據的 excel 文件和 excel 閱讀器 class 。 似乎我的測試中的 DataProvider class 故障。 我得到信息“java.lang.NullPointerException”。我知道DataProvider中的String有問題,但如果我改為Object,問題仍然如上。

這是我的 testng 代碼:

package com.insurance.testCases;

import com.insurance.pageObjects.loginPage;
import com.insurance.utilities.excelReader;
import org.openqa.selenium.NoAlertPresentException;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

import java.io.IOException;

public class TC_LoginDdt_002 extends baseClass{

    @Test(dataProvider = "loginData")
    public void loginDDT(String user,String pwd){

        driver.get(baseUrl);

        loginPage lp=new loginPage(driver);
        lp.setUserName(user);
        lp.setPassword(pwd);
        lp.clickSubmit();

        if (isAlertPresent()==true){
            driver.switchTo().alert().accept();
            driver.switchTo().defaultContent();
            Assert.assertTrue(false);
        }
        else {
            Assert.assertTrue(true);
            lp.clickLogout();
            driver.switchTo().alert().accept();
            driver.switchTo().defaultContent();
        }

    }
    public boolean isAlertPresent(){
        try {
            driver.switchTo().alert();
            return true;
        }
        catch (NoAlertPresentException e){
            return false;
        }
    }

    @DataProvider(name="loginData")
    String [][] getData() throws IOException {

        String path="C:/Users/lachi/IdeaProjects/InetBanking_v1/target/DataSet.xls";


        int rownum = excelReader.getRowCount(path,"DataSet");
        int colcount = excelReader.getCellCount(path,"DataSet",1);

        String logindata[][]=new String[rownum][colcount];

        for (int i=1;i<=rownum;i++){

            for (int j=0;j<colcount;j++){

                logindata[i-1][j]=excelReader.getCellData(path,"DataSet",i,j);
            }
        }
        return logindata;

    }
}

以下例外:

java.lang.NullPointerException
    at com.insurance.testCases.TC_LoginDdt_002.loginDDT(TC_LoginDdt_002.java:17)
    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:498)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:583)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:719)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:989)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
    at org.testng.TestRunner.privateRun(TestRunner.java:648)
    at org.testng.TestRunner.run(TestRunner.java:505)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:455)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:415)
    at org.testng.SuiteRunner.run(SuiteRunner.java:364)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1208)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1137)
    at org.testng.TestNG.runSuites(TestNG.java:1049)
    at org.testng.TestNG.run(TestNG.java:1017)
    at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66)
    at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:109)

基礎 class:

package com.insurance.testCases;

import com.insurance.utilities.Log;
import com.insurance.utilities.readConfig;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.junit.After;
import org.junit.Before;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.edge.EdgeDriver;
import org.testng.annotations.Parameters;

import java.util.concurrent.TimeUnit;

public class baseClass {
    readConfig readconfig = new readConfig();

    public String baseUrl = readconfig.getApplicationUrl();
    public String username = readconfig.getUsername();
    public String password = readconfig.getPassword();
    public static WebDriver driver;

    public static Logger logger;

    @Parameters("browser")
    @Before
    public void SetUp(){

        Log.startLog("Test is Starting");
        logger = Logger.getLogger("einsurance");

        System.setProperty("webdriver.chrome.driver","Drivers/chromedriver.exe");
        driver = new ChromeDriver();


        //System.setProperty("webdriver.edge.driver","Drivers/msedgedriver.exe");
       // driver = new EdgeDriver();

        driver.manage().window().maximize();
        driver.manage().deleteAllCookies();
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
    }

    @After
    public void tearDown(){
        Log.endLog("Test is Ending!");

        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
        }
        driver.quit();
    }
    public String randomestring(){
        String generatedstring = RandomStringUtils.randomAlphanumeric(20);
        return (generatedstring);
    }
    public static String randomeNum(){
        String generatestring2 = RandomStringUtils.randomNumeric(8);
        return (generatestring2);
    }
}

問題的根本原因在於您的基礎 class。

  1. 您正在通過BeforeAfter提供的 Unit 初始化/清理WebDriver object。
  2. TestNG 無法識別 JUnit 設置和拆卸注釋

要解決此問題,您需要做的就是使用

  • 代替Before使用org.testng.annotations.BeforeClass (or) BeforeMethod
  • 而不是After使用org.testng.annotations.AfterClass (或) AfterMethod

根據 TC_LoginDdt_002 第 17 行的 NPE,我懷疑您的baseUrl似乎為空。 在調試模式下運行以確保您的public String baseUrl = readconfig.getApplicationUrl(); 實際上是檢索baseUrl並將其初始化為您想要的URL

暫無
暫無

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

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