2012-01-07 31 views
0

我正在使用java(1.6)和WebDriver(2.16)在Eclipse(Indigo)中开发测试。主要方法不会在Eclipse中结束

我有一个相当简单的测试,运行良好,但并不实际'结束'。我的意思是,在'main'方法中的所有代码行被执行后,Eclipse控制台仍然指示代码正在运行(控制台中的红色'终止'按钮被启用)。

这只是昨天开始发生的,我用一些新的代码扩展了测试脚本。认为是问题所在,我评论了所有新代码。不幸的是,问题依然存在。

我该如何解决这个问题?

感谢您的输入。

编辑

下面一个JStack线程转储的相关部分。见here对于完全转储

2012-01-07 10时56分40秒全部线程转储的HotSpot的Java(TM)64位服务器VM (20.4-B02混合模式):

“主题-7“守护进程prio = 6 tid = 0x0000000008c08800 nid = 0x12f4可运行 [0x000000000 921f000] java.lang.Thread.State:RUNNABLE at java.io.FileInputStream.readBytes(Native Method) at java.io.FileInputStream.read (Unknown Source) at org.apache.commons.exec.StreamPumper.run(StreamPumper.java:105) at java.lang.Thread.run(Unknown Source)

“线程6” 守护程序PRIO = 6 TID = 0x0000000008d7b800 NID = 0xb98可运行 [0x0000000009 11f000] java.lang.Thread.State中:RUNNABLE 在java.io.FileInputStream.readBytes(本机方法) 在java的.io.FileInputStream.read(未知来源) 在java.io.BufferedInputStream.fill(未知来源) 在java.io.BufferedInputStream.read1(未知来源) 在java.io.BufferedInputStream.read(未知来源) - 锁定< 0x00000007d5a00888>(a java.io.BufferedInputStream) at java.io.FilterInputStream.read(Unknown Source) at org.apache.commons.exec.StreamPumper.run(StreamPumper.java:105) 在java.lang.Thread.run(未知来源)

“线程5” PRIO = 6 TID = 0x000000000678b000 NID = 0x10e4可运行 [0x000000000901f000] java.lang.Thread.State中:RUNNABLE 在java.lang中.ProcessImpl.waitFor(本机方法) 在org.apache.commons.exec.DefaultExecutor.executeInternal(DefaultExecut or.java:347) 在org.apache.commons.exec.DefaultExecutor.access $ 200(DefaultExecutor.ja VA :46) at org.apache.commons.exec.DefaultExecutor $ 1.run(DefaultExecutor.java:18 8)“main”prio = 6 tid = 0x000000000062e000 nid = 0x450 runnable [0x000000000261f000] java.lang.Thread.State :RUNNABLE at java.lang.Thread。退出(来源不明)

编辑

这里是我的Excel中的代码(使用Java IO和Apache的POI类)

public HashMap<String, String> getTestData() 
{ 
    InputStream myxls = null; 

    try { 
     // Create a connection to the Excel file 
     myxls = new FileInputStream(fileName); 
     System.out.println("Excel Input was opened"); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     //e.printStackTrace(); 
    } 

    // Define a workbook object 
    HSSFWorkbook wb = null; 

    try { 
     // Instantiate the workbook object 
     wb = new HSSFWorkbook(myxls); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    // Create a worksheet object 
    HSSFSheet sheet = wb.getSheet(sheetName); 
    // Read the first row (it always contains the headers (variable names) 
    HSSFRow headerRow = sheet.getRow(0); 
    // Read the row requested 
    HSSFRow row = sheet.getRow(dataRow); 

    //System.out.println("Creating a new HashMap from row " + dataRow + " in sheet " + sheetName); 

    // Define a collection of value/value pairs 
    HashMap<String,String> testData = new HashMap<String,String>(); 

    // Get count of columns != empty 
    int columnCount = row.getPhysicalNumberOfCells(); 
    //System.out.println(Integer.toString(columnCount)); 

    String textHeader; 
    String textData; 

    // Loop through the columns 
    for(int colcount=0; colcount < columnCount; colcount++) 
    { 
     // Read the column header and the cell value 
     HSSFCell cell = row.getCell(colcount); 
     HSSFCell headerCell = headerRow.getCell(colcount); 

     switch (headerCell.getCellType()) 
     { 
      case HSSFCell.CELL_TYPE_NUMERIC : 
      { 
       // cell type numeric. 
       textHeader = Double.toString(headerCell.getNumericCellValue()); 
       //System.out.println(textHeader); 
       break; 
      } 
      case HSSFCell.CELL_TYPE_STRING : 
      { 
       // cell type string. 
       HSSFRichTextString richTextString = headerCell.getRichStringCellValue(); 
       textHeader = richTextString.getString(); 
       break; 
      } 
      default : 
      { 
       // types other than String and Numeric. 
       textHeader = "Type not supported"; 
       break; 
      } 

     } 

     switch (cell.getCellType()) 
     { 
      case HSSFCell.CELL_TYPE_NUMERIC : 
      { 
       // cell type numeric. 
       textData = Double.toString(cell.getNumericCellValue()); 
       break; 
      } 
      case HSSFCell.CELL_TYPE_STRING : 
      { 
       // cell type string. 
       HSSFRichTextString richTextString = cell.getRichStringCellValue(); 
       textData = richTextString.getString(); 
       break; 
      } 
      case HSSFCell.CELL_TYPE_BLANK : 
      { 
       // cell type string. 
       textData = ""; 
       break; 
      } 
      default : 
      { 
       // types other than String and Numeric. 
       textData = "Type not supported"; 
       break; 
      } 

     } 


     // Add the value of each cell to the HashMap collection 
     testData.put(textHeader,textData); 
     //System.out.println(textHeader + "/" + textData); 

    } 

    try{ 
     // End the file object 

     myxls.close(); 
     System.out.println("Excel Input was closed"); 
    } 
    catch (IOException e){ 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    // Send the HashMap back to the calling code 
    return testData; 

} 
+1

什么是代码? – 2012-01-07 16:04:11

+0

完成重建将是我的第一步。 – sje397 2012-01-07 16:05:46

+0

您的程序是否启动了仍在运行或创建GUI组件(框架等)的非守护线程? – 2012-01-07 16:06:43

回答

0

调试我的代码后,我相信我已经找到了罪魁祸首:

硒的webdriver班配备了几个“司机”,每一个支持的浏览器类型(IE,火狐,Chrome)。当我创建一个Firefox对象时,它会尝试通过log4j启用日志记录(我没有配置它,因为我没有使用它)。我相信log4j会导致挂起的线程。

2

有关故障排除这一点,你可以采取线程转储,例如通过使用jstack命令(这里有一个完整的SO question)。这允许您查看哪些线程仍在运行以及它们正在执行的代码的哪一部分。

编辑

基础上JStack输出,我会说你读一个单独的Thread一些文件和read方法还是阻塞,等待输入作为javadoc of FileInputStream#read记录。

+0

我有来自JStack的输出。在这里看到输出:http://codepad.org/13apaw3y – user973718 2012-01-07 17:16:27

+0

@ user973718我添加了JStack输出到你的问题,并更新了我的答案。但是,如果没有代码,很难进一步帮助您 – Robin 2012-01-07 17:23:15

+0

我确实有一些从Excel文件中读取的代码。我仔细检查了代码,确保通过close方法释放流:它们是。我会再次检查该代码。我也使用Logger;它可以负责这些线程吗? – user973718 2012-01-07 17:29:45