我正在使用 Visual Studio 的内置单元测试工具为 C# 项目编写单元测试,其中许多测试需要使用文件 TestData.xlsx
。
目前,当我运行测试时,我注意到之前的测试没有及时释放对文件的保留,以便下一次测试使用它。这会导致测试失败。我应该如何编写测试以防止这种情况发生?
这是我正在处理的示例:
[TestClass]
public class ExcelWorksheetExtensionTests
{
private ExcelPackage excelPackage;
private ExcelWorksheet excelWorksheet;
[TestInitialize]
[DeploymentItem(@"Assets\TestData.xlsx")]
public void TestInitialize()
{
FileInfo fileInfo = new FileInfo(@"Assets\TestData.xlsx");
this.excelPackage = new ExcelPackage(fileInfo);
this.excelWorksheet = this.excelPackage.Workbook.Worksheets["Sheet1"];
}
[TestCleanup]
public void TestCleanup()
{
this.excelPackage.Dispose();
}
// This test may succeed...
[TestMethod]
public void TestGetRowIndexForExistingName()
{
Assert.AreEqual(this.excelWorksheet.GetRowIndex("Object49").Value, 6);
}
// ...But this test will fail because TestInitialize re-runs too quickly.
[TestMethod]
public void TestGetRowIndexForMissingName()
{
Assert.IsFalse(this.excelWorksheet.GetRowIndex("NonExistentName").HasValue);
}
}
最佳答案
我对 EPPlus 不太熟悉,但据我所知,您有一个共享资源 ExcelWorksheet
并且在每个测试中都从不同的线程开始访问它。您必须检查查询调用是否是线程安全的?
我不确定您使用的是哪个版本的“EPPlus”,但最新版本 (4.1.1) 没有名为 GetRowIndex
的函数,但我已将测试改进为如下所示:
[TestClass]
public class ExcelWorksheetExtensionTests
{
private FileInfo _fileInfo;
[TestInitialize]
public void TestInitialize()
{
_fileInfo = new FileInfo(@"C:\Test.xlsx");
}
// This test may succeed...
[TestMethod]
public void TestGetRowIndexForExistingName()
{
using (var excelPackage = new ExcelPackage(_fileInfo))
{
var excelWorksheet = excelPackage.Workbook.Worksheets["Sheet1"];
Assert.AreEqual(excelWorksheet.GetValue(1, 1), 6.0);
}
}
// ...But this test will fail because TestInitialize re-runs too quickly.
[TestMethod]
public void TestGetRowIndexForMissingName()
{
using (var excelPackage = new ExcelPackage(_fileInfo))
{
var excelWorksheet = excelPackage.Workbook.Worksheets["Sheet1"];
Assert.IsFalse(excelWorksheet.GetValue(1, 1) == null);
}
}
}
现在每个测试都有它的 ExcelWorksheet
实例,并且消除了先前共享资源上的潜在竞争条件,现在两个测试都顺利通过了。
关于c# - 安全地编写依赖于相同文件资源的单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46771585/