我正在使用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);
}
}
答案 0 :(得分:2)
我对EPPlus不太熟悉,但我可以看到的是你有一个共享资源GetRowIndex
,它开始从每个测试中的不同线程访问。你必须检查查询调用是否是线程安全的?
我不确定您使用的是什么版本的'EPPlus',但是使用最新版本(4.1.1)时,没有一个名为[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
现在每个测试都有{{1}}的实例,并且消除了先前共享资源上的潜在竞争条件,现在两个测试都以漂亮的颜色传递。