安全地编写依赖于相同文件资源的单元测试?

时间:2017-10-16 13:30:41

标签: c# visual-studio unit-testing

我正在使用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);
        }
    }

1 个答案:

答案 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}}的实例,并且消除了先前共享资源上的潜在竞争条件,现在两个测试都以漂亮的颜色传递。