2015-10-13 84 views
2

enter image description here 上圖顯示了包含Facebook數據的excel文件。如何測試從java中的excel文件中讀取數據的方法?

FacebookDataExtraction從Excel文件中讀取數據,並將數據存儲爲代碼中顯示的行對象列表。 我已經使用config.properties文件來獲取文件路徑。 config.properties文件的內容是:FILE_NAME=D:/Refreshed_data_daily/all_hue_posts_in_excel.xlsx.

public class FacebookDataExtraction { 

//private static final String FILE_NAME="D:/Refreshed_data_daily/all_hue_posts_in_excel.xlsx"; 
private static final String SHEET_NAME="nextv54plus_actions"; 
XSSFWorkbook workbook; 

    public static void main(String[] args){ 

     FacebookDataExtraction obj= new FacebookDataExtraction(); 
     List<FacebookFields> displayList= new ArrayList<FacebookFields>(); 
     displayList=obj.readFromExcel(); 
     System.out.println("The Size of the list is:"+ displayList.size()); 
    } 

    public List<FacebookFields> readFromExcel() { 
     List<FacebookFields> fbList= new ArrayList<FacebookFields>(); 
     try 
     { 
      ReadPropertyFile data= new ReadPropertyFile("config.properties"); 
      FileInputStream fin= new FileInputStream(data.getPropertyFor("FILE_NAME")); 
      workbook= new XSSFWorkbook(fin); 
      int sheetIndex=0; 
      for (Sheet sheet : workbook) { 
       readSheet(sheet,sheetIndex ++, fbList);} 

     }catch(FileNotFoundException e){ 
      e.printStackTrace(); 
     } 
     catch(IOException e){ 
      e.printStackTrace(); 
     } 
     return fbList; 
    } 

    private void readSheet(Sheet sheet, int sheetIndex , List<FacebookFields> fbList) { 

     if(SHEET_NAME.equals(sheet.getSheetName())){ 
      workbook.removeSheetAt(sheetIndex); 
      return; 
     } 
     for (Row row : sheet){ 
      if (row.getRowNum() > 0) 
       fbList.add(readRow(row));} 

    } 

    private FacebookFields readRow(Row row) { 

     FacebookFields record= new FacebookFields(); 
     for (Cell cell : row) { 
      switch (cell.getColumnIndex()) { 
      case 0: record.setName(cell.getStringCellValue()); 
      break; 
      case 1: record.setId(cell.getStringCellValue()); 
      break; 
      case 2: record.setDate(cell.getStringCellValue()); 
      break; 
      case 3: record.setMessage(cell.getStringCellValue()); 
      break; 
      case 4: record.setType(cell.getStringCellValue()); 
      break; 
      case 5: record.setPage(cell.getStringCellValue()); 
      break; 
      case 6: record.setLikeCount(String.valueOf(cell.getNumericCellValue())); 
      break; 
      case 7: record.setCommentCount(String.valueOf(cell.getNumericCellValue())); 
      break; 
      case 8: record.setShareCount(String.valueOf(cell.getNumericCellValue())); 
      break; 
      } 
     } 

     return record; 
    } 

    public boolean containsData() { 

     List<FacebookFields> checkList= readFromExcel();  
     return !checkList.isEmpty() ; 
    } 

    } 

FacebookFields類(這裏沒有顯示)包含提取的數據集合的方法! 如何爲方法readRow()編寫測試用例或如何測試列的每個字段是否包含數據?

+0

單元測試?整合測試?你希望你的測試帶來什麼價值? –

+0

你讓方法'private',這意味着它是一個內部方法。你應該嘗試着重於測試班級的「公共」方法。如果您設計了一個/多個公開方法的良好測試,您將自動測試私有方法是否奏效。 – Timo

+0

@dom我想要的單元測試。 – ShridharBavannawar

回答

0
  • 所以,你要測試將返回FacebookFields的readRow()方法。
  • 由於它是私有的,你不能直接對這個私有方法進行單元測試,但你的主要目標似乎是測試這種方法。讓我們在這裏考慮一下重構/重新設計。
  • 您可以創建一個類FacebookFieldRetriever,該公共方法retrieveFromRow()返回FacebookFields
  • 因此,每次FacebookDataExtraction遇到excel表格中的一行時,它會創建一個FacebookFieldRetriever對象並調用retrieveFromRow()以從該行建立FacebookFields對象。
  • 由於我們已經通過了課程設計階段,讓我們繼續進行單元測試。所以,現在你有一個公開的方法:retrieveFromRow()你可以實際上進行單元測試,假設你有一個行對象,它包含了來自Excel工作表中實際值的單元格。 (基本上,我們專注於測試開關盒邏輯)。

  • FacebookFieldRetriever類

    class FacebookFieldRetriever{
    public FacebookFields retrieveFromRow(Row row) {
    FacebookFields record= new FacebookFields(); for (Cell cell : row) { switch (cell.getColumnIndex()) { case 0: record.setName(cell.getStringCellValue()); break; case 1: record.setId(cell.getStringCellValue()); break; case 2: record.setDate(cell.getStringCellValue()); break; case 3: record.setMessage(cell.getStringCellValue()); break; case 4: record.setType(cell.getStringCellValue()); break; case 5: record.setPage(cell.getStringCellValue()); break; case 6: record.setLikeCount(String.valueOf(cell.getNumericCellValue())); break; case 7: record.setCommentCount(String.valueOf(cell.getNumericCellValue())); break; case 8: record.setShareCount(String.valueOf(cell.getNumericCellValue())); break; } }
    return record; }
    }

  • 單元測試下面的實例:

類FacebookFieldRetrieverTest {

private final String TEST_NAME = "Mark Zuckerberg"; 
private final String TEST_id = "4"; 
private final String TEST_DATE = "2015-10-13;         
private final String TEST_MSG = "Welcome to Facebook";         
private final String TEST_TYPE = "SomeType";         
private final String TEST_PAGE = "SomePage"; 
private final String TEST_LIKECOUNT = 6; 
private final String TEST_COMMENTCOUNT = 7; 
private final String TEST_SHARECOUNT = 8 ; 


public void testFacebookFieldRetriever() 
{ 
XSSFWorkbook wb = new XSSFWorkbook(); 
Sheet sheettemp = wb.createSheet(); 
Row row = sheettemp.createRow(1); 

Cell cell = row.createCell(0); 
cell.setCellValue(TEST_NAME); 

Cell cell1 = row.createCell(1); 
cell.setCellValue(TEST_id); 

Cell cell2 = row.createCell(2); 
cell.setCellValue(TEST_DATE); 

Cell cell3 = row.createCell(3); 
cell.setCellValue(TEST_MSG); 

Cell cell4 = row.createCell(4); 
cell.setCellValue(TEST_TYPE); 

Cell cell5 = row.createCell(5); 
cell.setCellValue(TEST_PAGE); 

Cell cell6 = row.createCell(6); 
cell.setCellValue(TEST_LIKECOUNT); 

Cell cell7 = row.createCell(7); 
cell.setCellValue(TEST_COMMENTCOUNT); 

Cell cell8 = row.createCell(8); 
cell.setCellValue(TEST_SHARECOUNT); 

FacebookFieldRetriever fbRetriever = new FacebookFieldRetriever(); 
FacebookFields fbFields = fbRetriever.retrieveFromRow(row); 

assertEquals(fbFields.getName(), TEST_NAME); 
assertEquals(fbFields.getId(), TEST_id); 
assertEquals(fbFields.getMessage(), TEST_MSG); 
assertEquals(fbFields.getLikeCount(), TEST_LIKECOUNT); 
assertEquals(fbFields.getShareCount(), TEST_SHARECOUNT); 
assertEquals(fbFields.getCommentCount(), TEST_COMMENTCOUNT); 
assertEquals(fbFields.getPage(), TEST_PAGE); 
assertEquals(fbFields.getType(), TEST_TYPE); 
} 
} 

`

  • 您可以按上面給出的方式進行測試。希望能幫助到你。
+0

事情是我不知道什麼數據將在Excel表單中出現!因爲Excel數據每天都會通過軟件刷新。 雖然在我的測試案例中,我有一個測試,檢查列表是否包含像Tom發佈的數據!但我想要測試列上迭代的數據以檢查數據是否存在 – ShridharBavannawar

+0

您似乎暗示您不想執行單元測試,但需要進行某種測試以檢查readRow()是否實際上返回對應於特定行的FacebookFields。然後,我想,你應該有另一個解析excel文件的類,爲每一行獲取FacebookFields。使用這個類來測試你的readRow(),通過對這兩個對象執行一些equals()。 –

+0

是的,我想做單元測試,在這個單元測試中我需要檢查在列上迭代的值是否爲空。 創建另一個包含解析excel文件的類將具有相同的邏輯來提取數據,就像在類FacebookDataExtraction中一樣。 – ShridharBavannawar

0

如果您的excel包含「樣本excel」中第一行的「期望值」,那麼以下測試可能是一個開始。請注意,用於列表的equals可能有點粗糙,尤其是因爲我不確定它如何處理元素的內部順序。

編輯我已經添加了一個構造函數參數給FacebookDataExtraction類,該類將文件名轉換爲應該從中提取數據的excel文件。

@Test 
public void testWhetherListConatinsData(){ 
    List<FacebookFields> expectedList = new ArrayList<>(); 
    // Fill the expected list here: 
    expectedList.add("expected value"); 
    // ... Add more if you want to... 

    // Read in data. 
    FacebookDataExtraction fbDataList= new FacebookDataExtraction("path/to/testdata/test_with_strange_first_name.xlsx"); 

    List<FacebookFields> listOfFields = fbDataList.readFromExcel(); 
    // Good check to start with. 
    assertEquals(listOfFields.containsData(), true); 

    // Actual data check. 
    assertEquals("Lists not the same", expectedList, listOfFields); 
} 
+0

excel數據是我以前不知道的,因爲excel數據每天都在刷新!我只知道excel中包含的字段,即列(第一行),即名稱,標識,類型等等。 – ShridharBavannawar

+0

但是,您應該能夠創建一個小型Excel表,看起來就像您將在生產中看到的那樣。這是完全在您控制之下的測試數據文件,包含您希望看到測試的任何內容。 如果你想使它成爲一個穩定的測試,你不能進行一個單元測試,它依賴於所有時間都在變化的數據。 (如果數據刷新並且測試崩潰,並且只有在測試中強制新數據集後才注意到,那麼該數據不可重現) – Timo

+0

是否通過嘲諷Sheet類(製作方法來測試方法** readSheet **)是正確的方法公開的方法)和?在兩個單獨的測試用例中測試「if」條件和for循環?我不知道這是否是正確的方法! – ShridharBavannawar

相關問題