TestNG: перебирать массив с помощью провайдера данных

Я провожу тестирование автоматизации с использованием Selenium Webdriver, этот код предназначен для TestNg dataprovider, Резюме: я беру данные из листа Excel в данные, все работает нормально. Когда я отлаживаю код, я получаю TestData как testGoogle1(String search1, String Search2) для 1-й итерации это Search1 = Webdriver, Search2 = Qtp, so on,,,,Я хочу, чтобы он непосредственно возвращал массив значений testGoogle1(String search[]) так что в @Test Сам я могу добавить свою функцию, перебрать все строки и столбцы и протестировать их.

Может кто-нибудь, пожалуйста, дайте мне идею, как написать это.

Тест данных

Тестовые данные

вот мой код

package ExcelTest;
import com.thoughtworks.selenium.*;
import static org.testng.AssertJUnit.*;
import java.io.IOException;
import jxl.Cell;
import jxl.CellType;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeTest;   
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;   
import org.testng.annotations.AfterTest;
import java.io.File;
import java.io.FileInputStream;
import java.util.Iterator;
import jxl.*;


public class Sample{

      WebDriver driver;

        @BeforeTest
        public void startTest(){
            driver = Startup.basic();
        } 


@DataProvider(name = "DP1")
public Object[][] createData1() throws Exception{
     Object[][] retObjArr=getTableArray("G:\\Selenium Jar Files\\TestData\\Data.xls","DataPool");
    return(retObjArr);

}

@Test (dataProvider = "DP1")
public void testGoogle1(String search1, String Search2) throws Exception{
//selenium.open("http://www.google.co.in/");
//  driver.get("http://www.google.co.in/");

    //String hello = search.length;
//for(int i=0; i< search.length ;i++)
//{
System.out.println("param   " +search);
Thread.sleep(3000);
System.out.println("Opened");
WebElement element = driver.findElement(By.name("q"));
element.sendKeys(search);
element.submit();
System.out.println("Clicked");
}
//}

@AfterClass
public void tearDown() throws Exception {
//selenium.stop();
}


public String[][] getTableArray(String xlFilePath,String sheetName) throws Exception{

    String[][] tabArray=null;


      File inputWorkbook = new File(xlFilePath);
        Workbook w;
        int startRow,startCol, endRow, endCol,ci,cj;
        try {
            //w = Workbook.
            w = Workbook.getWorkbook(inputWorkbook);
            // Get the first sheet
            Sheet sheet = w.getSheet(sheetName);
            // Loop over first 10 column and lines
            endRow = sheet.getRows();
            endCol = sheet.getColumns();
            tabArray=new String[endRow-1][endCol-1];

            ci=0;

            for (int i=1;i<endRow;i++,ci++){
                cj=0;
                for (int j=1;j<endCol;j++,cj++){

                  Cell cell = sheet.getCell(j, i);
                tabArray[ci][cj] = cell.getContents(); 

                }
            //    System.out.println("");
            }
            //file.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }




       return(tabArray);
    }

}

Кто-нибудь может поделиться какой-нибудь идеей? Спасибо

Отредактированный код:

public class Sample{

      WebDriver driver;

        @BeforeTest
        public void startTest(){
            driver = Startup.basic();
        } 


@DataProvider(name = "DP1")
public Object[][][] createData1() throws Exception{
     Object[][][] retObjArr=getTableArray("G:\\Selenium Jar Files\\TestData\\Data.xls","DataPool");
    return (retObjArr);

}

@Test (dataProvider = "DP1")
public void testGoogle1(String search, String het) throws Exception{

System.out.println("param   " +search);
Thread.sleep(3000);
System.out.println("Opened");
WebElement element = driver.findElement(By.name("q"));
element.sendKeys(search);
element.submit();
System.out.println("Clicked");
}
//}

@AfterClass
public void tearDown() throws Exception {
//selenium.stop();
}


public Object[][][] getTableArray(String xlFilePath,String sheetName) throws Exception{

    Object[][] tabArray=null;


      File inputWorkbook = new File(xlFilePath);
        Workbook w;
        int startRow,startCol, endRow, endCol,ci,cj,ck;
        try {
            //w = Workbook.
            w = Workbook.getWorkbook(inputWorkbook);
            // Get the first sheet
            Sheet sheet = w.getSheet(sheetName);
            // Loop over first 10 column and lines
            endRow = sheet.getRows();
            endCol = sheet.getColumns();
            tabArray=new String[endRow-1][endCol-1];

            ci=0;

            for (int i=1;i<endRow;i++,ci++){
                cj=0;

                for (int j=1;j<endCol;j++,cj++){

                  Cell cell = sheet.getCell(j, i);
                tabArray[ci][cj] = cell.getContents(); 

                }
            //    System.out.println("");
            }
            //file.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }



       return(tabArray);  /// Here Getting the error **Type mismatch: cannot convert from Object[][] to Object[][][]**
    }

}

3 ответа

Это как @DataProvider работает, если у меня есть следующий массив:

[[value1, value2],
 [value3, value4],
 [value5, value6]]

Обратите внимание, что есть 3 строки и 2 столбца. Тест будет выполнен 3 раза и каждый раз будет проходить по 2 значениям. Неважно, какова ценность.

Теперь, если вы хотите, чтобы тест выполнялся только один раз, ваш массив должен выглядеть так:

[[value1]]

Мы можем сделать value1 быть тем, кем мы хотим быть, поэтому если value1 это массив выше, тогда он передаст весь массив dataProvider. Таким образом, ваш возврат должен возвращаться {{tabArray}}

Глядя на ваш код, вы пытаетесь создать функцию поставщика данных, которая возвращает Object[][][]. Тебе этого не сделать; функция поставщика данных должна возвращать либо Object[][] (двумерный массив любого объекта), либо итератор, который будет выполнять ту же функцию, но немного другим способом.

Вы, конечно, можете вкладывать другой массив в двумерный массив, который возвращается; вот почему это Object [] [], а не определенный тип.

Также убедитесь, что вы правильно построили свой результат. Например, вы не можете сделать следующее, потому что это не создает массив Object [] []:

return {{myArray}};

Вместо этого вы бы сделали это:

return new Object[][]{{myArray}};

Я думаю, что JXL сложнее, чем нужно. Я написал пример TestNG DataProvider для чтения данных Excel с использованием Apache MetaModel (который недавно стал полноценным проектом Apache), и вы можете найти это здесь.

public static Object[][] getCsvData( File csvFile ) 
    {   
        CsvConfiguration conf = new CsvConfiguration( 1 );
        DataContext csvContext = DataContextFactory.createCsvDataContext( csvFile, conf );
        Schema schema = csvContext.getDefaultSchema();
        Table[] tables = schema.getTables();
        Table table = tables[0]; // a representation of the csv file name including extension
        DataSet dataSet = csvContext.query()
                .from( table )
                .selectAll()
                .where("run").eq("Y")
                .execute();
        List<Row> rows = dataSet.toRows();
        Object[][] myArray = get2ArgArrayFromRows( rows );
        return myArray;
    }

И вторая часть этого:

public static Object[][] get2ArgArrayFromRows( List<Row> rows ) {
        Object[][] myArray = new Object[rows.size()][2];
        int i = 0;
        SelectItem[] cols = rows.get(0).getSelectItems();
        for ( Row r : rows ) {
            Object[] data = r.getValues();
            for ( int j = 0; j < cols.length; j++ ) {
                if ( data[j] == null ) data[j] = ""; // force empty string where there are NULL values
            }
            myArray[i][0] = cols;
            myArray[i][1] = data;
            i++;
        }
        logger.info( "Row count: " + rows.size() );
        logger.info( "Column names: " + Arrays.toString( cols ) );
        return myArray;
    }

И пример теста, который использует этот DataProvider:

@Test( dataProvider = "csv" )
public void testPrintCsvRowToLog( SelectItem[] cols, Object[] data ) {
    String theCols = Joiner.on("|").join( cols );
    String aRow = Joiner.on("|").join( data );
    logger.info( theCols ); 
    logger.info( aRow ); 
}

Вы не можете использовать TestNg Parameter и Dataprovider для аннотации @Test.

Лучше использовать аннотацию DataProvider для аннотации BeforeTest/Beforeclass и использовать аннотацию @Parameter для аннотации @Test

Другие вопросы по тегам