ncrunch所有测试传递首次运行,但代码更改后失败,按下所有按钮时按下所有按钮
题
我正在使用nunit和ninject在VS2012中的新MVC 4解决方案中运行Ncrunch。
当我首先打开解决方案所有50左右的测试运行并成功通过。
在我做出任何代码(甚至只是一个添加的空白区域)之后,我的大多数单元测试都失败了ncrunch报告。如果我按Ncrunch窗口中的“运行所有测试”,会发生同样的事情。
但如果你击中'运行所有测试'按下'按钮,请再次测试所有50个测试通行证,并且ncrunch报告一切都很好。
当您每次单独运行每个测试时它们都会通过。
当他们失败时,他们似乎在我的ninject设置代码中失败
错误:testfixturesetup在controllertestsetup中失败
public class ControllerTestSetup
{
[SetUp]
public void InitIntegrationTest()
{
var context = IntegrationTestContext.Instance;
context.Init();
context.NinjectKernel.Load<MediGapWebTestModule>();
}
[TearDown]
public void DisposeIntegrationTest()
{
IntegrationTestContext.Instance.Dispose();
}
}
public class IntegrationTestContext : IDisposable
{
private static IntegrationTestContext _instance = null;
private static readonly object _monitor = new object();
private IntegrationTestContext() { }
public static IntegrationTestContext Instance
{
get
{
if (_instance == null)
{
lock (_monitor)
{
if (_instance == null)
{
_instance = new IntegrationTestContext();
}
}
}
return _instance;
}
}
}
.
所有测试也在重新哈尔测试赛道中运行,每次都没有问题。
有人知道什么可能导致这个吗?
我猜它与实例属性中的单身锁代码有关,但我不确定。
============================================================================== 进展:
我能够通过在Try Catch语句中包装并将错误写入输出窗口中的上述NINject Setup方法中的错误。
除了尝试多次加载模块引起的例外,即使是我肯定没有,我不使用任何类型的自动模块加载。
这发生在线
LocalSessionFactoryModule.SetMappingAssemblies(() => new[] { typeof(ProviderMap).Assembly });
_kernel.Load<LocalSessionFactoryModule>();
_sessionFactory = _kernel.Get<ISessionFactory>();
.
localsessionFactoryModule是用于NinjectModule类的Ninject模块类。
为什么这只发生在ncrunch和我能做什么来解决这个问题?有没有办法检查模块是否已加载?
解决方案
ncrunch将永远不会在同一过程中执行测试并发性,因此除非您在测试逻辑内有多线程行为,否则应该安全地说这不是单身锁定或线程引起的问题。
如您已经尝试禁用并行执行,这没有差异,我假设问题不会通过并发在测试运行器进程之外的资源(即磁盘上的文件)引起的问题。
这意味着问题几乎肯定与正在执行测试的顺序相关。几乎所有手动测试跑步者(包括Resharper)都将以从开始完成的定义序列中运行测试。这对一致性有益,但它可以在测试以不一致/随机顺序运行时屏蔽可能表面的问题。 Ncrunch将按优先级顺序执行测试,并且还可以重用测试运行之间的测试进程,如果他们尚未考虑到这一点,这可能会使测试的运行时行为不同。
曲面(且因此调试)序列相关问题的有用方法是尝试通过使用ncrunch以手动定义的顺序运行测试。如果右键单击“NCrunch Tests”窗口中的测试,请在“高级”菜单下,找到使用现有任务Runner进程运行测试的选项。尝试对您的几个测试进行此操作以查看您是否可以重现曲面突出问题的序列。当它发生时,您应该很容易地将调试器获得到测试上,并找出为什么它失败。
大多数序列相关问题是由不清楚的静态成员引起的,因此确保您的每个测试都是在假设在过程中运行的另一个测试留下现有状态。另一种选择是确保所有国家都被撕裂的测试完全清除(虽然在我看来,这通常是一种较少的务实方法)。