我正在使用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;
}