我有一堆包含在
TestFixture
属性中的测试。
每个测试用例当前都以
FileParameter
的形式打开一个文件并将其传递给函数:
string path = "./filepath";
FileParameter file = new(new FileStream(path, FileMode.Open));
_ = await SomeFunction(file);
file.Data.Close();
我想并行执行夹具中的每个测试用例。我已经能够使用
[Parallelizable(ParallelScope.Children)]
对其他灯具执行此操作,它可以同时运行灯具内的所有测试。
问题是,如果测试正在打开和关闭文件,那么如果它们同时运行,则该文件将在其他测试有机会使用它之前关闭。
并行化的最佳方法是什么,以便每个测试都可以打开相同的文件并同时使用它?
不能选择将文件内容作为字符串读取并使用它。
如果每个测试只需要读取访问权限,那么您可以通过定义
FileAccess
和 FileShare
常量在每次执行之间共享只读文件。
string path = "./filepath";
FileParameter file = new(new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read));
_ = await SomeFunction(file);
file.Data.Close();
我的建议是将数据复制到内存流:
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);
}
这确保了所有测试都可以并行运行,并且还应该有助于提高性能。如果测试写入流,您可能希望为每个测试创建数据的副本。
如果您确实需要实际的文件流,或者文件太大而无法保留在内存中,则此方法不适合。但如果是这种情况,您可能希望按顺序运行此类测试以避免出现问题,并可能将它们放在单独的类别中,这样它们就不会减慢所有其他测试的速度。