TestNGパラメータ化テストselenium web automationでの応用


詳細
seleniumでweb automationを作るとき、外部のテストデータを読み取る必要があります.同じシーンに対して、同じクラスの操作で、私たちのテストデータを巡ります.このときパラメータ化テストが役に立ちます.
この文書では、SeleniumとTestNGを組み合わせて、Excelファイルを利用してテストデータの書き込みパラメータ化テストを格納する方法について説明します.
まずTestNG公式サイトのコードを見てみましょう.
//This method will provide data to any test method that declares that its Data Provider
//is named "test1"
@DataProvider(name = "test1")
public Object[][] createData1() {
 return new Object[][] {
   { "Cedric", new Integer(36) },
   { "Anne", new Integer(37)},
 };
}
 
//This test method declares that its data should be supplied by the Data Provider
//named "test1"
@Test(dataProvider = "test1")
public void verifyData1(String n1, Integer n2) {
 System.out.println(n1 + " " + n2);
} 

だから、私たちの考え方は簡単で、ExcelReaderクラスを書いて、テストデータを読み出して、2次元配列で返して、戻った値を私たちのテスト方法に伝えればいいです.以下にgetRunData(File file)メソッドを示します.
// Excel n , 
public static String[][] getRunData(File file)throws IOException {
		List results = new ArrayList();
		FileInputStream fis = new FileInputStream(file);  
        POIFSFileSystem POIStream = new POIFSFileSystem(fis);  
        HSSFWorkbook workBook = new HSSFWorkbook(POIStream); 
        HSSFSheet sheet = workBook.getSheetAt(0);             
        int rowSize = sheet.getLastRowNum();
        System.out.println("The row size is: " + rowSize);
        
        for (int rowIndex =1; rowIndex <= rowSize; rowIndex++ ) {
        	HSSFRow row = sheet.getRow(rowIndex);
        	int colSize = row.getLastCellNum();
        	HSSFCell lastcell = row.getCell(colSize-1);
        	if (lastcell.getStringCellValue().equalsIgnoreCase("n")){
        		continue;
        	}
        	
        	System.out.println("The column size is: " + colSize);
        	String[] values = new String[colSize-1];
        	Arrays.fill(values, "defaultvalue");
        	for (int columnIndex=0; columnIndex < colSize-1 ; columnIndex++){       		      		
        		String value = "";
        		HSSFCell cell = row.getCell(columnIndex);
        		if (cell != null) {
        			switch (cell.getCellType()) {
        			case HSSFCell.CELL_TYPE_STRING:       				  
                        value = cell.getStringCellValue();  
                        break;  
                    case HSSFCell.CELL_TYPE_NUMERIC:  
                        if (HSSFDateUtil.isCellDateFormatted(cell)) {  
                           Date date = cell.getDateCellValue();  
                           if (date != null) {  
                               value = new SimpleDateFormat("yyyy-MM-dd").format(date);  
                           } else {  
                               value = "";  
                           }  
                        } else {  
                           value = new DecimalFormat("0").format(cell.getNumericCellValue());
                        }  
                        break;
                    case HSSFCell.CELL_TYPE_FORMULA:
                        if (!cell.getStringCellValue().equals("")) {  
                           value = cell.getStringCellValue();  
                        } else {  
                           value = cell.getNumericCellValue() + "";   
                        }  
                        break;  
 
                    case HSSFCell.CELL_TYPE_BLANK:   
                        break;   
                    case HSSFCell.CELL_TYPE_ERROR:   
                        value = "";  
                        break;   
                    case HSSFCell.CELL_TYPE_BOOLEAN:  
                        value = (cell.getBooleanCellValue() == true ? "Y" : "N");  
                        break;  
                    default:  
                        value = "default";                    
        			}        			
        		}
        		values[columnIndex] = value.trim();  
        		
        	}
        	results.add(values);             	
        }
        fis.close();
        
        String[][] returnArray = new String[results.size()][rowSize];  
        for (int i = 0; i < returnArray.length; i++) {    
            returnArray[i] = (String[]) results.get(i);     
        }  
        return returnArray; 
		
	}

次に、テスト・インスタンス・コードを示します.
        //  .xls 
        @DataProvider(name = "dcpages")
	public Object[][] createData() throws IOException {
		URL url = DCHelpAllLinksValidationTest.class.getResource(this.getClass().getSimpleName()+".xls");
		File file = new File(url.getPath());
		return  (Object[][]) ExcelReader.getRunData(file);
	}
	//Excel , 	
	@Test(dataProvider = "dcpages")
	public void verifyPageLinks(String menu, String submenu) throws HttpException, IOException {
		System.out.println(menu+ submenu);
		moveToElement(driver.findElement(By.linkText(menu)));
		String pagelink = driver.findElement(By.linkText(submenu)).getAttribute("href");
		driver.get(pagelink);
				
		Set links = getDCPageLinks();
		assert (links.size()>=1);
		for (String link : links) {
			assert (HttpClientValidation.getHttpResonseCode(httpClient, link)== 200);
		}
		
	}

テストメソッドを実行すると、コードはExcelファイルの最後の列の値が「n」でないすべての行を巡回します.各行のテストデータは、最終的にテスト結果を生成します.
 
テスト例ごとにdev,uat,prodなどの異なるテスト環境で実行する必要がある場合もあり、テストデータも異なるため、String[][getRunData(File file,String env)メソッドをもう1つ書き、異なるテスト環境に対してExcelの下の異なるsheetを自動的に読み出すこともできます.