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

标签 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);
        }
    }

最佳答案

我对 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/

相关文章:

python - Visual Studio fatal error C1510 : Cannot load language resource clui. dll。安装 Pandas 时

visual-studio - 如何在 Visual Studio 中从搜索中排除 .svn 目录?

.net - 是否可以从另一个设置文件中获取 Resharper 设置文件 'inherit'?

c# - 动态添加点击事件

c# - 使列不可为空,EF 外键错误

unit-testing - Kotlin 机器人。断言 assertEquals widtch Pair.Failed 测试

unit-testing - Lisp 中破坏性函数的单元测试

javascript - Angular2 服务的 Karma/Jasmine 测试用例

c# - 如何从字符串中删除无效代码点?

C# ANTLR 语法?