我正在撰寫一個代碼,其中我正在使用一個包含三張紙的 excel 檔案進行操作。我將 Apache POI 和資料提供程式注釋用于資料驅動方法。我想在運行時傳遞作業表索引號或作業表名稱,但我無法將引數設定為資料提供程式方法。所以我所做的是我寫了一個建構式和一個靜態變數作為整數。在引數化建構式中,我初始化了該靜態變數,然后在我的測驗用例中,通過創建具有資料提供程式方法的類的物件,我傳遞了一個整數,即我希望從中獲取資料來運行測驗的作業表索引. 但是每次,建構式都將值設為 0。我不知道為什么。下面是我撰寫的資料驅動代碼和建構式。
public class Excel_Util {
static int fileinitial;
public Excel_Util(int filename) {
fileinitial=filename;
}
@DataProvider(name="testdata")
public static Object[][] readexcelretobj() throws Exception {
FileInputStream f= new FileInputStream("F:\\Eclipse Java new Programs\\shdtestpeopleinteractive\\src\\test\\resources\\Test_data.xls");
HSSFWorkbook workbook = new HSSFWorkbook(f);
HSSFSheet s = workbook.getSheetAt(fileinitial);
HSSFRow row = s.getRow(0);
int rownum=s.getPhysicalNumberOfRows();
int colnum=row.getLastCellNum();
//System.out.println(rownum);
//System.out.println(colnum);
Object data[][] = new Object[rownum][colnum];
List<Object> l = new ArrayList<Object>();
for(int i=0;i<rownum-1;i ) {
row = s.getRow(i 1);
for(int j=0;j<colnum;j ) {
HSSFCell c = row.getCell(j);
//l.add(c.getStringCellValue());
data[i][j]=c.getStringCellValue();
}
}
return data;
}
我寫的測驗用例如下。
@Test(dataProvider="testdata",dataProviderClass=Excel_Util.class)
public void testsignupdatafields(String email, String password) {
Syncutil.Implicitwait();
try {
Excel_Util ex = new Excel_Util(2);
getdriver().get("https://www." csvreaderutil.csvread().get(0).toString() "/");
Marathishd marathishdpage = PageFactory.initElements(getdriver(), Marathishd.class);
Signuppagemarathishd signup = marathishdpage.letsbeginclick();
signup.emailid.sendKeys(email);
signup.password.sendKeys(password);
}catch(Exception e) {System.out.println("Exception");}
}
}
在這里,我在創建物件時傳遞了 2,但每次都從第一張表中獲取值。即,每次都考慮作業表索引 0。我不想在 excelutil 類代碼中硬編碼任何值,因為我想將其作為通用代碼。因此,在測驗用例本身中,我決定傳遞作業表編號。我很困惑該怎么做,并想知道為什么會發生這種情況以及我正在做的錯誤是什么。任何人都可以請指導我嗎?
uj5u.com熱心網友回復:
我簡化了代碼來復制這個問題。
現有代碼:
@Test方法:
@Test(dataProvider = "testdata", dataProviderClass = Excel_Util.class)
public void testsignupdatafields(String email, String password) {
System.out.println("Test started");
new Excel_Util(2);
System.out.println("Email: " email " & Passowrd: " password);
}
Excel_Util:
public class Excel_Util {
static int fileinitial;
public Excel_Util(int filename) {
fileinitial = filename;
System.out.println("Constructor called...");
System.out.println("Sheet number: " fileinitial);
}
@DataProvider(name = "testdata")
public static Object[][] readexcelretobj() throws Exception {
Object[][] object = new Object[1][2];
object[0][0] = "Nandan";
object[0][1] = "123456";
System.out.println("Data provider called...");
System.out.println("Sheet number: " fileinitial);
return object;
}
}
輸出:
Data provider called...
Sheet number: 0
Test started
Constructor called...
Sheet number: 2
Email: Nandan & Passowrd: 123456
如果您看到上面的輸出,DataProvider則首先呼叫代碼,因此您的值將作為0. 為了解決這個問題,將new Excel_Util(2);物件呼叫到DataProvider
更新代碼:
@Test方法:
@Test(dataProvider = "testdata", dataProviderClass = Excel_Util.class)
public void testsignupdatafields(String email, String password) {
System.out.println("Test started");
System.out.println("Email: " email " & Passowrd: " password);
}
Excel_Util:
public class Excel_Util {
static int fileinitial;
public Excel_Util(int filename) {
fileinitial = filename;
System.out.println("Constructor called...");
System.out.println("Sheet number: " fileinitial);
}
@DataProvider(name = "testdata")
public static Object[][] readexcelretobj() throws Exception {
new Excel_Util(2);
Object[][] object = new Object[1][2];
object[0][0] = "Nandan";
object[0][1] = "123456";
System.out.println("Data provider called...");
System.out.println("Sheet number: " fileinitial);
return object;
}
}
輸出:
Constructor called...
Sheet number: 2
Data provider called...
Sheet number: 2
Test started
Email: Nandan & Passowrd: 123456
如果您現在看到上面的輸出,則首先呼叫建構式。
解決方案#1:
正如我們所討論的,如果你想從Test類中傳遞值,那么你可以做這樣的事情。而不是constructor使用static塊。
Test班級:
public class ClassTestNG {
static int sheetNumber = 2;
@Test(dataProvider = "testdata", dataProviderClass = Excel_Util.class)
public void testsignupdatafields(String email, String password) {
System.out.println("Test started");
System.out.println("Email: " email " & Passowrd: " password);
}
Excel_Util:
public class Excel_Util {
static int fileinitial;
static {
fileinitial = ClassTestNG.sheetNumber;
System.out.println("Static called...");
System.out.println("Sheet number: " fileinitial);
}
@DataProvider(name = "testdata")
public static Object[][] readexcelretobj() throws Exception {
Object[][] object = new Object[1][2];
object[0][0] = "Nandan";
object[0][1] = "123456";
System.out.println("Data provider called...");
System.out.println("Sheet number: " fileinitial);
return object;
}
}
輸出:
Static called...
Sheet number: 2
Data provider called...
Sheet number: 2
Test started
Email: Nandan & Passowrd: 123456
解決方案#2:
您也可以使用@BeforeTest注釋。
Test班級:
@BeforeTest
public void passSheetNumber() {
new Excel_Util().assignSheetNumber(2);
}
@Test(dataProvider = "testdata", dataProviderClass = Excel_Util.class)
public void testsignupdatafields(String email, String password) {
System.out.println("Test started");
System.out.println("Email: " email " & Passowrd: " password);
}
Excel_Util:
public class Excel_Util {
static int fileinitial;
public void assignSheetNumber(int sheetNumber) {
fileinitial = sheetNumber;
System.out.println("Sheet number: " fileinitial);
}
@DataProvider(name = "testdata")
public static Object[][] readexcelretobj() throws Exception {
Object[][] object = new Object[1][2];
object[0][0] = "Nandan";
object[0][1] = "123456";
System.out.println("Data provider called...");
System.out.println("Sheet number: " fileinitial);
return object;
}
}
輸出:
Sheet number: 2
Data provider called...
Sheet number: 2
Test started
Email: Nandan & Passowrd: 123456
uj5u.com熱心網友回復:
檔案初始=檔案名;奇怪的是,您沒有收到有關無法從非靜態背景關系分配靜態 int 的錯誤訊息!為什么不簡單地從全域檔案初始值中去除靜態。*NB 有 int 問題的類是主類,如果你是從 public static void main(String args[]) 呼叫的,那將是不同的,不需要由建構式分配,所以如果它不是主類,請洗掉靜態來自變數“fileinitial”的關鍵字。
或者構建一個靜態類(總是嵌套的子類)以將“非靜態檔案名引數”發送到(通過)靜態方法并將其作為該方法的靜態分配回傳。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/346343.html
