运行某些测试用例的单元测试中存在文件访问问题



我在测试的排列块中遇到了并发问题,我确实在子文件夹中创建了一些文件(在某些测试用例运行中,文件访问出现IO异常(。我有一个参数化的测试,尽管有[NonParallelizable]属性,但测试用例似乎是并行运行的。

在VS2019的测试资源管理器中运行的测试中观察到该问题。

如果夹具中的另一个测试(而不是测试用例(仍然可以并行运行,那么是否有可能阻止某些测试的测试用例的并行执行呢。

[TestFixture]
public class ClassToTest_Fixture
{
[TestCase("SubFolder", new[] { "a", "b", "c", "d", "e", "f", "g", "h" })]
[TestCase("SubFolder", new[] { "a", "b", "c", "d", "e", "f", "g", "h" })]
[TestCase("SubFolder", new[] { "a", "b", "c", "d", "e", "f", "g", "h" })]
[TestCase("SubFolder", new[] { "a", "b", "c", "d", "e", "f", "g", "h" })]
[TestCase("SubFolder", new[] { "a", "b", "c", "d", "e", "f", "g", "h" })]
[NonParallelizable] //Doesn't help
public void TestMethod(string folder, string[] files)
{
#region Arrange
var fldr = Path.Combine(TestContext.CurrentContext.TestDirectory, folder);
if(!Directory.Exists(fldr))
{
Directory.CreateDirectory(fldr);
}
foreach(var fn in files)
{
File.Create(Path.Combine(fldr, fn));
} 
#endregion Arrange
//Act
//Assert
}
[Test]
public void TestMethodCanBeRunInParallel( )
{
}
}

简短回答:这目前不起作用,请参阅https://github.com/nunit/nunit/issues/3371

更多。。。

由于ParallelizableAttribute的操作始终与更高级别测试(fixture、命名空间、程序集(的并行状态有关,因此应在问题中指定该属性是用于fixture、程序集还是同一命名空间中的setupfixture。我假设一定有一些更高级别的设置,否则你不需要在这里使用[NonParallelizable],但我不知道这个设置是什么。:-(如果你澄清了,我会编辑它。

当您希望各个案例并行运行时,当更高级别的设置是非并行时,也会出现类似的问题。使用[Parallelizable(ParallelScope.Children)]``. m Unfortunately, theNonParallelizableAttributedoesn't take a scope argument and is simply a synonym for[Palallelizable(ParallelScope.Noein(]`可以很容易地解决这个问题。我认为这是我最初设计中的一个错误,也许当前团队会在未来的版本中纠正它。

解决方法。。。

  1. 最简单的事情是使包含这些方法的fixture不可并行。这可能是可能的,也可能是不可能的,这取决于您的应用程序的细节,您是否有参数化的fixture等。您也可以在fixture上尝试[Parallelizable(ParallelScope.Fixture)]。这应该允许固定装置,但不允许其子装置并行运行。

  2. 对你的团队来说更复杂,也许更令人困惑。。。添加另一个fixture类并将其标记为[NonParallelizable]。如果愿意,可以嵌套它,但不要从第一个类派生它,因为这会导致所有包含的测试运行两次。将方法与所有案例一起复制到新类中,这些案例可能不会并行运行。

如果这是我的问题,我会倾向于第一种方法,尽管性能会受到一些影响。开发人员的时间通常是你在测试写作中想要优化的,至少在你真正衡量一个重大问题之前是这样。

然后,您可以等着看下一个NUnit版本会带来什么。:-(

我有一个并发问题。。。。测试用例似乎是并行运行的 是一个错误的假设,这是我凭直觉做出的。在添加了带有时间戳和Thread.CurrentThread.ManagedThreadId的输出之后,我发现即使没有[NonParallelizable]属性,测试用例也会非并行运行。

问题是(我的错(,我没有足够关注File.Create(fileName)的返回值,它是FileStream
由于我还没有处理FileStream,所以在下一次测试用例运行时出现了问题(IO异常(。

添加FileStream.Close()解决了问题:

...
File.Create(Path.Combine(fldr, fn))?.Close();
...

最新更新