使用TestNG @Test和@DataProvider功能会导致log4j写入多个日志文件条目

时间:2017-04-04 18:01:12

标签: selenium log4j testng-dataprovider

我正在使用Selenium和TestNG来运行自动化测试,使用log4j v1.2来编写日志文件......

TestNG有@Test和@DataProvider注释功能,允许我将保存在Excel文件中的参数传递给我的测试方法......

当我的Excel工作表中只有一行时,测试方法只运行一次,测试方法中的log4j代码正确地写入我的日志文件...

当我的Excel工作表中有两行或更多行时,测试方法会多次运行,对Excel工作表中的每一行都会运行一次......

不幸的是,在第二次运行时,每个日志条目都是重复的... 在第三次运行时,每个日志条目都是三重的... 在第四次运行时,每个日志条目都是四重的,依此类推......

如何让log4j避免此问题?

问题涉及的java代码的材料部分如下......

   @Test(dataProvider="parchmentData")
   public void CCRwitheTranscript(String recipient, String email, String fileattachment, String fileattachmenttype) throws InterruptedException, FileNotFoundException

  {

   //Console and File Logging using log4j
   //Creates Pattern Layout
    PatternLayout layout = new PatternLayout();
    String conversionPattern = "%d %-7p [%t] %c %x - %m%n";
    layout.setConversionPattern(conversionPattern);

    //Creates Console Appender
    ConsoleAppender consoleAppender = new ConsoleAppender();
    consoleAppender.setLayout(layout);
    consoleAppender.activateOptions();

    //Creates Daily Rolling File Appender - User configurable to minutely (yyyy-MM-dd-HH-mm)...
    DailyRollingFileAppender rollingFileAppender = new DailyRollingFileAppender();
    rollingFileAppender.setFile("CCRwitheTranscript.log");
    rollingFileAppender.setDatePattern("'.'yyyy-MM-dd-HH'.log'");
    rollingFileAppender.setLayout(layout);
    rollingFileAppender.activateOptions();

    //Configures Root Logger
    Logger rootLogger = Logger.getRootLogger();
    rootLogger.setLevel(Level.INFO);  //The level value (ALL; TRACE; DEBUG; INFO; WARN; ERROR; FATAL) determines which logger messages will be written to the log file
    rootLogger.addAppender(consoleAppender);
    rootLogger.addAppender(rollingFileAppender);

    // creates a custom logger and log messages
    Logger logger = Logger.getLogger(DDT.ParchmentCCRwitheTranscriptExcel.class);
    //logger.setAdditivity(false);
    logger.trace("this is a trace log message");
    logger.debug("this is a debug log message");
    logger.info("this is an information log message");
    logger.warn("this is a warning log message");
    logger.error("this is a error log message");
    logger.fatal("this is a fatal log message");
    logger.info("-----");

    //Internet Explorer WebDriver
   System.setProperty("webdriver.ie.driver", "C:\\temp\\Selenium\\IEDriverServer.exe");
   WebDriver driver = new InternetExplorerDriver();

   //Console Data Spacer
   logger.info("-----");

    //Print Current Class Name
   logger.info("Class Name via logger: " + Thread.currentThread().getStackTrace()[1].getClassName());

   //Print Current Method Name
   logger.info("Method Name via logger: " + Thread.currentThread().getStackTrace()[1].getMethodName());

   //Print Browser SessionID
   logger.info("Session ID via logger: " + ((RemoteWebDriver)driver).getSessionId().toString());

   logger.info("Home Page");
   logger.info("Home Page Title Verified - User is able to login successfully!");

   logger.info("Co-Curricular Record with eTranscript Page");

   logger.info("Co-Curricular Record with eTranscript Page Title Verified!");

             logger.error("Checkout button is missing on Shopping Cart Page!");

 logger.error("I Accept checkbox is missing on Consent Page!");               

 logger.error("Confirm button is missing on Review Order Page!");

 logger.error("Home link is missing on Thank You Page!");

   //Close Chrome or IE Browsers
   driver.close();
}

// DataProvider的

   @DataProvider(name="parchmentData")
   public Object[][] passData()
   {
          ExcelDataConfig config=new ExcelDataConfig("C:\\Users\\dkedmondson\\workspace\\ParchmentTestData.xlsx");

          //In order to change the sheet where the "Co-Curricular Record with eTranscript" data is located
          String sheetname="CCR with eTranscript";

          int sheet=config.getSheetIndex(sheetname);
          String workbookname=config.getWorkbookName();
          String workbookpath=config.getWorkbookPath();

          int rows=config.getRowCount(sheetname);
          int columns=config.getColumnCount(sheetname);
          int sheets=config.getSheetCount();

          Object[][] data=new Object[rows-1][columns];  //Defining data=new Object[rows-1][columns], in order to save only data rows in the Excel worksheet

          for(int i=1; i<rows; i++)  //Initializing i=1, in order to save only data rows in the Excel worksheet
          {

                 for (int j=0; j<columns; j++)
                 {

                 data[i-1][j]=config.getData(sheetname, i, j);  //Saving as data[i-1][j], in order to save only data rows in the Excel worksheet

                 }
          }

          return data;

}

0 个答案:

没有答案