【问题标题】:How to use a single Log4Net instance in mutliple Nunit TestFixtures with SetUpFixture如何通过 SetUpFixture 在多个 Nunit TestFixture 中使用单个 Log4Net 实例
【发布时间】:2011-11-15 03:02:50
【问题描述】:

我刚刚开始使用 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; }
    }

}

这是我拥有的众多 TestFixture 之一,每个都基于 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 中使用它?

我在 Google 上搜索了很多,也许它很简单。我的项目结构是否存在一些设计问题?

【问题讨论】:

    标签: events nunit log4net


    【解决方案1】:

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

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

    FileAppender.AppendToFile属性

    获取或设置指示是否应附加文件的标志 到或覆盖

    关于[SetupFixture],我相信你用错了。它不应该通过这个属性标记每个 TesFixture 的基类,这看起来很乱。您应该声明被认为是 SetupFixture 的类,并用[SetupFixture] 属性对其进行标记,以便在给定(声明)命名空间内的所有 TestFixture 中调用一次。

    来自 NUnit 文档,SetUpFixtureAttribute

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

    【讨论】:

    • 感谢您的回复。我已经改变了你提到的 SetUpFixture 。我仍然使用两个 ILog 但没关系,它们都附加到同一个文件。现在每个派生类都可以使用基类中的 ILog,因为我不再将它声明为静态,以便 Logger 可以知道它来自哪个类,之前它总是记录为 BaseTest。现在它记录为 LoginPageTest、SearchPageTest 等。
    • 但是AppendToFile="true" 对你有帮助吗?
    • 是的,这就是我在 部分的 App.config 中设置的内容。 :)
    猜你喜欢
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 2021-04-07
    相关资源
    最近更新 更多