java - 我在 Selenium 中的 @Test 方法运行了两次

标签 java testng

/*I have written a @Test method in Selenium which is running twice but i want it to run only once. Basically, i have written @DataProvider method which is returning 2 dimensional array to same @Test method and my @DataProvider is calling another method in other class which also returns a 2 dimensional array. */

//Below is the code from other class i.e., ExcelUtil


package util;

import java.io.FileInputStream;
import java.util.HashMap;
import java.util.Map;

import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ExcelUtil {

//Fetching data from excel
public static Object[][] fetchDataFromExcel(String filePath, String sheetName, String methodname){

        Map<Object, Object> datamap= new HashMap<Object, Object>();
        Object[][] obj = null;
        try{

            FileInputStream file = new FileInputStream(filePath);
            XSSFWorkbook wb = new XSSFWorkbook(file);
            XSSFSheet sh = wb.getSheet(sheetName);
            XSSFRow rw = sh.getRow(0);

            int totalRows = sh.getLastRowNum();
            int cellNum = rw.getLastCellNum();
            obj = new Object[totalRows+1][1];

                for(int i=0;i<totalRows;i++) {                              

                    XSSFRow tstrw = sh.getRow(i);
                    String txt = tstrw.getCell(0).getStringCellValue();

                    if(txt.trim().equalsIgnoreCase(methodname.trim())) {

                        datamap = new HashMap<Object, Object>();

                        for(int j=0;j<cellNum-1;j++) {

                        datamap.put(rw.getCell(j+1).getStringCellValue(),
                        sh.getRow(i).getCell(j+1).getStringCellValue());

                        }   
                        obj[i][0] = datamap;
                        //printing two dimensional array 
                        System.out.println("obj["+i+"][0] = " + obj[i][0]);
                        //break;    


                    }

                }

            wb.close();

        }catch(Exception fetchDataFromExcel) {

            fetchDataFromExcel.printStackTrace();

        }

        return obj;

    }

}

//Below is my Test class which consists of @DataProvider and @Test

package com.qa.tests;

import java.lang.reflect.Method;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

import util.ExcelUtil;
import util.LogInPageObject;

public class MyLogoTest {

    Method[] methods = MyLogoTest.class.getMethods();

    WebDriver driver;

    @DataProvider(name = "readDataFromExcel")
    public Object[][] dataFromExcel(Method method) {
        Object[][] fetchDataFromExcel = null;

        try {

            String filePath = System.getProperty("user.dir") + 
             "\\src\\test\\resources\\TestData.xlsx";
            //calling fetchDataFromExcel for ExcelUtil class
            fetchDataFromExcel = ExcelUtil.fetchDataFromExcel(filePath, "Login", method.getName());

        } catch (Exception dataFromExcel) {

            dataFromExcel.printStackTrace();

        }

        return fetchDataFromExcel;

    }

    @BeforeTest
    public void invokeBrowser() {

        driver = new ChromeDriver();
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("http://automationpractice.com/index.php");
    }
    //This method below is running two times but i want it should run only once
    @Test(dataProvider="readDataFromExcel")
    public void logIn(Map<String, String> data) {

        try {

            driver.findElement(By.xpath(LogInPageObject.signInXpath)).click();
            Thread.sleep(10000);

        }catch(Exception logIn) {

            logIn.printStackTrace();

        }

    }

    @AfterTest
    public void afterTest() {

        driver.close();

    }

}

运行后控制台输出

PASSED: logIn(null)
PASSED: logIn({Username=kumar7000@gmail.com, Password=123456})

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


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

下面是我的 Excel 中的数据

enter image description here

任何人都可以帮我解决这个问题,我不想在输出中出现 "PASSED: logIn(null)"

最佳答案

问题出在

Object[][] obj = null;
int totalRows = sh.getLastRowNum();
obj = new Object[totalRows+1][1];

totalRows 是 1,当你初始化 obj 时,你给它 2 行。第一行包含文件中的数据,但第二行仍为 null(初始值)。

@Test(dataProvider="readDataFromExcel")

看到两个值,带有值的 Mapnull,因此正在创建两个测试

logIn({Username=kumar7000@gmail.com, Password=123456})
// and
logIn(null)

只需修复数组初始化

obj = new Object[totalRows][1];

关于java - 我在 Selenium 中的 @Test 方法运行了两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59703891/

相关文章:

java - Swing JTable - 根据前一行的功能更改行的背景颜色

java - BufferedWriter 未将文本写入文本文件

java - 在 Java 中收缩 LinkedHashMap

cucumber 与 TestNG

java - Maven POM 执行 TestNG XML 中的旧测试用例类

java - 我有一个在运行时动态生成的 testNG.xml 文件

java - 使用 java-libusb 最大化吞吐量

java - 在 Java 中使用 super

ant - 在没有 testng.xml 文件的情况下运行 testng

java - 每次我写入 excel 时,它都会用一个空白文件覆盖整个文件 - PUZZLED