如何在具有SetUpFixture的多个Nunit TestFixture中使用单个Log4Net实例

时间:2011-11-09 17:42:01

标签: events nunit log4net

我刚开始使用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,以便我可以在EventLoggerTestFixtures中使用它?

我已经搜索过很多东西,也许它很简单。我的项目结构是否存在一些设计问题?

1 个答案:

答案 0 :(得分:3)

尝试在您正在使用的FileAppender的log4net配置中明确设置AppendToFile="True"

<log4net>
    <appender name="..." type="log4net.Appender....">
      <appendToFile value="true" />

FileAppender.AppendToFile属性

  

获取或设置一个标志,指示是否应追加该文件   <或p>

关于[SetupFixture],我相信你是以错误的方式使用它。它不应该通过这个属性标记每个TesFixture的基类,这看起来很混乱。你应该声明一个被认为是SetupFixture的类,并用[SetupFixture]属性来标记它,这样就可以为给定(声明)命名空间中的所有TestFixtures调用它。

来自NUnit文档,SetUpFixtureAttribute

  

这是标记包含一次性的类的属性   给定的所有测试装置的设置或拆卸方法   命名空间。该类最多可包含一个标有该方法的方法   SetUpAttribute和一个用TearDownAttribute

标记的方法