单元测试记录(或运行)多次
问题描述:
我有这个简单的测试:单元测试记录(或运行)多次
protected readonly ILog logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().ReflectedType);
private static int count = 0;
[Test]
public void TestConfiguredSuccessfully()
{
logger.Debug("in test method" + count++);
}
log4net的设置是这样的:
[TestFixtureSetUp]
public void SetUp()
{
log4net.Config.BasicConfigurator.Configure();
}
的问题是,如果我运行这个测试中NUnit的一次,我得到的输出(如预期):
1742 [TestRunnerThread] DEBUG Tests.TestSomthing (null) - in test method0
但是,如果我在nUnit.exe按再次运行(或更多)我得到以下几点:
1742 [TestRunnerThread] DEBUG Tests.TestSomthing (null) - in test method1
1742 [TestRunnerThread] DEBUG Tests.TestSomthing (null) - in test method1
等等(如果我运行它5次,我会得到5个重复行)。现在,如果我从reSharper单独运行相同的测试,则输出很好,不会重复。但是,如果我在同一班的其他测试中进行此测试,则输出会重复三次。
我完全困惑。这到底是怎么回事?
答
Log4net正在每次测试运行时重新初始化,并且每次都添加appender(s)。我怀疑ReSharper没有表现出行为,因为它每次都会启动一个新进程(ReSharper测试运行器),而NUnit GUI不会。
我在过去曾经有过不同的风格,但是现在我已经使用了一个“SetupFixture”来初始化log4net(等等)。
[SetUpFixture]
public class UnitTestSuiteSetupTeardown
{
[SetUp]
public void Setup()
{
log4net.Config.BasicConfigurator.Configure();
}
[TearDown]
public void Teardown()
{
//Teardown stuff...
}
}
为每个测试程序集添加一个,并确保该类没有名称空间。它将在您的所有测试中运行一次,即组件中的所有测试。我个人在解决方案级别拥有其中的一个,然后将其添加为每个测试项目的链接。
更新
上面的例子如下的问题,并设置了基本配置。在我的实际SetUpFixture中,我从log4net配置文件(我再次在解决方案级别存储,然后添加为所有测试项目的链接)初始化log4net,例如,
[SetUpFixture]
public class UnitTestSuiteSetupTeardown
{
[SetUp]
public void Setup()
{
LogFactory.Configure();
}
[TearDown]
public void Teardown()
{
//Teardown stuff...
}
}
还有一个示例LogFactory类型的类。
public static class LogFactory
{
public const string DefaultConfigFileName = "log4net.config";
static ILog GetLogger(Type callingType)
{
return new Log4NetLogger(LogManager.GetLogger(callingType));
}
public static void Configure()
{
Type type = typeof(LogFactory);
FileInfo assemblyDirectory = AssemblyInfo.GetCodeBaseDirectory(type);
FileInfo configFile = new FileInfo(Path.Combine(assemblyDirectory.FullName,
DefaultConfigFileName));
XmlConfigurator.ConfigureAndWatch(configFile);
log4net.ILog log = LogManager.GetLogger(type);
log.ToString();
}
}
明天试试你的解决方案。我最终只是向'Configure()'方法提供'新的ConsoleAppender()'并且它工作。 – 2010-06-15 10:01:58