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

File access issue in unit test running some test cases

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

在 VS2019 的 Test-Explorer 中的测试 运行 中观察到该问题。

是否有可能阻止某些测试的测试用例的并行执行,如果 fixture 中的另一个测试(不是测试用例)仍然可以运行并行,那就太好了。

[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、namespaces、assembly)的并行状态有关,所以你应该在问题中指定是否在fixture上使用该属性,同一命名空间中的程序集或安装夹具。我假设必须有一些更高级别的设置,否则你不需要在这里使用 [NonParallelizable],但我不知道那个设置是什么。 :-) 如果你澄清一下,我会编辑它。

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

解决方法...

  1. 最简单的方法是使包含这些方法的装置 non-parallel 可用。这可能可行也可能不可行,具体取决于您的应用程序的详细信息、您是否有参数化的夹具等。您也可以在夹具上尝试 [Parallelizable(ParallelScope.Fixture)]。这应该允许夹具,但不是它的 children,并行到 运行。

  2. 更复杂,可能会让您的团队感到困惑...添加另一个夹具 class 并标记它 [NonParallelizable]。如果愿意,您可以嵌套它,但不要从第一个 class 派生它,因为这将导致所有包含的测试 运行 两次。将方法连同所有case复制到新的class中,可能不是运行并行

如果这是我的问题,我会倾向于第一种方法,即使这会影响性能。开发人员时间通常是您希望在 test-writing 中优化的时间,至少在您实际衡量一个重要问题之前是这样。

那么,您可以拭目以待,看看下一个 NUnit 版本会带来什么。 :-)

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

问题是(我的错),我没有足够重视 File.Create(fileName) 的 return 值,这是一个 FileStream.
由于我没有处理 FileStream 我在下一个测试用例 运行.

中遇到了问题(IO 异常)

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

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