我刚开始使用Selenium Webdriver及其EventFiring,以便我可以将驱动程序抛出的任何异常记录到文件或电子邮件等。
我已经让Log4Net正常工作,我的单元测试与Selenium一起正常运行。
我遇到的问题是让Log4Net创建1个日志文件,但是对于多个测试装置。
以下是一些重要的课程,我认为我需要向您展示以解释我的问题。
public class EventLogger : EventFiringWebDriver
{
// Not sure if this is the best place to declare Log4Net
public static readonly ILog Log = LogManager.GetLogger(typeof(EventLogger));
public EventLogger(IWebDriver parentDriver) : base(parentDriver)
{
// To get Log4Net to read the configuration file on what logger to use
// To console , file, email etc
XmlConfigurator.Configure();
if (Log.IsInfoEnabled)
{
Log.Info("Logger started.");
}
}
protected override void OnFindingElement(FindElementEventArgs e)
{
base.OnFindingElement(e);
//TODO:
if (Log.IsInfoEnabled)
{
Log.InfoFormat("OnFindingElement: {0}", e);
}
}
protected override void OnElementClicked(WebElementEventArgs e)
{
base.OnElementClicked(e);
//TODO:
if (Log.IsInfoEnabled)
{
Log.InfoFormat("OnElementClicked: {0}", e.Element.GetAttribute("id"));
}
}
}
这是我的SetupFixture - 我每次运行新的TestFixture类时都会运行它。
[SetUpFixture]
public class BaseTest
{
protected static readonly ILog Log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
private FirefoxProfile firefoxProfile;
private IWebDriver driver;
private EventLogger eventLogger;
public IWebDriver StartDriver()
{
Common.WebBrowser = ConfigurationManager.AppSettings["WebBrowser"];
Log.Info("Browser: " + Common.WebBrowser);
switch (Common.WebBrowser)
{
case "firefox":
{
firefoxProfile = new FirefoxProfile { AcceptUntrustedCertificates = true };
driver = new FirefoxDriver(firefoxProfile);
break;
}
case "iexplorer":
{
driver = new InternetExplorerDriver();
break;
}
case "chrome":
{
driver = new ChromeDriver();
break;
}
}
driver.Manage().Timeouts().ImplicitlyWait(Common.DefaultTimeSpan);
// Here is where I start my EventLogger to handle the events from selenium
// web driver, onClick, OnFindingElement etc.
// Is this the best way? Seems a bit messy, lack of structure
return eventLogger = new EventLogger(driver);
}
public EventLogger EventLogger
{
get { return eventLogger; }
}
}
这是我拥有的众多TestFixtures之一,每个都基于Selenium2 PageObjects
[TestFixture]
public class LoginPageTest : BaseTest
{
private IWebDriver driver;
private LoginPage loginPage;
[SetUp]
public void SetUp()
{
// Where I use the Log from the BaseTest
// protected static readonly ILog Log <-- top of BaseTest
Log.Info("SetUp");
driver = StartDriver();
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(30));
loginPage = new LoginPage();
PageFactory.InitElements(driver, loginPage);
}
[Test]
public void SubmitFormInvalidCredentials()
{
Console.WriteLine("SubmitFormInvalidCredentials");
loginPage.UserName.SendKeys("invalid");
loginPage.Password.SendKeys("invalid");
loginPage.SubmitButton.Click();
IWebElement invalidCredentials = driver.FindElement(By.Id("ctl00_ctl00_ctl00_insideForm_insideForm_ctl02_title"));
Assert.AreEqual("Invalid user name or password", invalidCredentials.Text);
}
}
我的Log.txt
文件显然是在每次TestFixture
运行后反复重写的,
如何设置我的NUnit测试,以便我只运行一次Log4Net,以便我可以在EventLogger
和TestFixtures
中使用它?
我已经搜索过很多东西,也许它很简单。我的项目结构是否存在一些设计问题?
答案 0 :(得分:3)
尝试在您正在使用的FileAppender的log4net配置中明确设置AppendToFile="True"
:
<log4net>
<appender name="..." type="log4net.Appender....">
<appendToFile value="true" />
获取或设置一个标志,指示是否应追加该文件 <或p>
关于[SetupFixture]
,我相信你是以错误的方式使用它。它不应该通过这个属性标记每个TesFixture的基类,这看起来很混乱。你应该声明一个被认为是SetupFixture的类,并用[SetupFixture]
属性来标记它,这样就可以为给定(声明)命名空间中的所有TestFixtures调用它。
来自NUnit文档,SetUpFixtureAttribute:
这是标记包含一次性的类的属性 给定的所有测试装置的设置或拆卸方法 命名空间。该类最多可包含一个标有该方法的方法 SetUpAttribute和一个用TearDownAttribute
标记的方法