如何并行化需要使用FileParameter的NUnit测试?

问题描述 投票:0回答:2
  • .NET 8.0
  • NUnit 4.1.0

我有一堆包含在

TestFixture
属性中的测试。

每个测试用例当前都以

FileParameter
的形式打开一个文件并将其传递给函数:

string path = "./filepath";
FileParameter file = new(new FileStream(path, FileMode.Open));
_ = await SomeFunction(file);
file.Data.Close();

我想并行执行夹具中的每个测试用例。我已经能够使用

[Parallelizable(ParallelScope.Children)]
对其他灯具执行此操作,它可以同时运行灯具内的所有测试。

问题是,如果测试正在打开和关闭文件,那么如果它们同时运行,则该文件将在其他测试有机会使用它之前关闭。

并行化的最佳方法是什么,以便每个测试都可以打开相同的文件并同时使用它?

不能选择将文件内容作为字符串读取并使用它。

c# file parallel-processing nunit
2个回答
1
投票

如果每个测试只需要读取访问权限,那么您可以通过定义

FileAccess
FileShare
常量在每次执行之间共享只读文件。

string path = "./filepath";
FileParameter file = new(new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read));
_ = await SomeFunction(file);
file.Data.Close();

1
投票

我的建议是将数据复制到内存流:

private byte[] data;

[OneTimeSetUp]
public void OneTimeSetUp()
{
    data = File.ReadAllBytes("./filepath");
}

[Test]
public async void MyTest()
{
    using var memoryStream = new MemoryStream(data);
    FileParameter file = new( memoryStream );
    _ = await SomeFunction(file);
}

这确保了所有测试都可以并行运行,并且还应该有助于提高性能。如果测试写入流,您可能希望为每个测试创建数据的副本。

如果您确实需要实际的文件流,或者文件太大而无法保留在内存中,则此方法不适合。但如果是这种情况,您可能希望按顺序运行此类测试以避免出现问题,并可能将它们放在单独的类别中,这样它们就不会减慢所有其他测试的速度。

© www.soinside.com 2019 - 2024. All rights reserved.