C# 单元测试中的DeploymentItem和TestCleanup冲突?

C# 单元测试中的DeploymentItem和TestCleanup冲突?,c#,unit-testing,C#,Unit Testing,我有一个应用程序,在许多类中有许多单元测试。许多测试都具有DeploymentItem属性以提供所需的测试数据: [TestMethod] [DeploymentItem("UnitTesting\testdata1.xml","mytestdata")] public void Test1(){ /*test*/ } [TestMethod] [DeploymentItem("UnitTesting\testdata2.xml","mytestdata")] public void

我有一个应用程序,在许多类中有许多单元测试。许多测试都具有DeploymentItem属性以提供所需的测试数据:

[TestMethod]
[DeploymentItem("UnitTesting\testdata1.xml","mytestdata")]
public void Test1(){
    /*test*/
}

[TestMethod]
[DeploymentItem("UnitTesting\testdata2.xml","mytestdata")]
public void Test1(){
    /*test*/
}
单独运行测试时,测试通过。当一次运行所有测试时(例如,当我选择“在当前上下文中运行所有测试”),一些测试会失败,因为其他测试留下的
DeploymentItem
s会导致测试获取错误的数据。(或者,一个测试错误地使用了用于另一个尚未运行的测试的文件。)

我发现了
[TestCleanup]
[ClassCleanup]
属性,这似乎会有所帮助。我补充说:

[TestCleanup]
public void CleanUp(){
    if(Directory.Exists("mytestdata"))
        Directory.Delete("mytestdata", true);
}
问题是,这会在每个测试方法之后运行,并且似乎会删除尚未运行的测试的DeploymentItems<代码>[ClassCleanup]将防止出现这种情况,但遗憾的是,它的运行频率不足以防止原始问题

从MSDN文档来看,DeploymentItem似乎只保证在测试执行之前文件会在那里,但它并不比这更具体。我想我看到了以下问题:

  • 执行测试的部署项
  • (发生了其他事情?)
  • 执行上一个测试的测试清理
  • 下一个测试执行
  • 测试失败,因为文件已丢失
  • 有人知道不同测试属性的执行顺序吗?我一直在找,但没找到多少

    我曾考虑让每个部署项使用其自己的、唯一的数据文件夹,但这变得很困难,因为要进行数百个测试。

    测试顺序如下:

  • 用AssemblyInitializeAttribute标记的方法
  • 用ClassInitializeAttribute标记的方法
  • 方法用TestInitializeAttribute标记
  • 用TestMethodAttribute标记的方法
  • 部分问题是VisualStudio以不确定的顺序(默认情况下)运行测试,并且一次运行多个测试。这意味着您无法在每次测试后删除文件夹



    一般来说,如果你能避免去磁盘进行单元测试,效果会更好。一般来说,除了代码之外,您不希望有任何东西会破坏您的测试。

    我也有类似的问题。在一些测试中,我需要删除一个已部署的项目-所有测试在单独运行时都通过,但在播放列表中运行时失败。我的解决方案很难看,但很简单:对每个测试使用不同的文件夹

    例如:

        [TestMethod]
        [DeploymentItem("Resources\\DSC06247.JPG", "D1")]
        public void TestImageUploadWithRemoval()
        {
            // Arrange
            myDeployedImagePath = Path.Combine(TestContext.DeploymentDirectory, "D1", "DSC06247.JPG");
            // Act ...
        }
    
        [TestMethod]
        [DeploymentItem("Resources\\DSC06247.JPG", "D2")]
        public void TestImageUploadWithoutRemoval()
        {
            // Arrange
            myDeployedImagePath = Path.Combine(TestContext.DeploymentDirectory, "D2", "DSC06247.JPG");
            // Act...
        }
    

    “一些测试失败,因为其他测试留下的DeploymentItems会导致测试获取错误的数据”-为什么会发生这种情况,您的单元测试是否在测试期间修改部署项?如果这是真的,您可以简单地创建您需要在每个测试中修改的部署项的副本以保留原始文件…每个测试是否使用不同的文件但共享相同的文件夹?是的,我同意避免访问磁盘。问题是,我正在测试代码,其目的是读取文件,因此必须有文件。这些文件还表示大型数据集,因此我无法在代码中轻松实例化一个可比较的对象,而且测试在小数据集上运行时并不总是有多大价值。这仍然是我正在解决的一个问题,但您确实回答了我关于执行顺序的问题,所以我会标记它。@SouthShoreAK您可能需要查看以确保每个路径都配置正确。@SouthShoreAK您真的要测试从文件系统读取文件,还是要测试代码如何处理来自文件系统的数据?如果是后者(我希望是这样),那么您需要模拟文件系统以进行测试。