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

Sou*_*eAK 4 c# unit-testing

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

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

[TestMethod]
[DeploymentItem("UnitTesting\testdata2.xml","mytestdata")]
public void Test1(){
    /*test*/
}
Run Code Online (Sandbox Code Playgroud)

当测试单独运行时,它们会通过.当所有都立即运行时(例如,当我选择"在当前上下文中运行所有测试"时),某些测试失败,因为DeploymentItem其他测试留下的s会导致测试获取错误的数据.(或者,测试错误地使用了尚未运行的另一个测试文件.)

我发现了这些[TestCleanup][ClassCleanup]属性,看起来会有所帮助.我补充说:

[TestCleanup]
public void CleanUp(){
    if(Directory.Exists("mytestdata"))
        Directory.Delete("mytestdata", true);
}
Run Code Online (Sandbox Code Playgroud)

麻烦的是,这在每个测试方法之后运行,并且似乎它将删除尚未运行的测试的DeploymentItems.[ClassCleanup]会阻止这种情况,但不幸的是,它不会经常运行以防止原始问题.

从MSDN文档中,似乎DeploymentItem仅保证在测试执行之前文件将存在,但它并不比那更具体.我想我看到了以下问题:

  1. 用于测试的部署项目
  2. (其他的事情发生了吗?)
  3. 从先前的测试执行测试清理
  4. 下一个测试执行
  5. 测试失败,因为文件已经消失

有谁知道不同测试属性的执行顺序?我一直在寻找,但我找不到多少.

我曾想过让每个部署项目都使用自己独特的数据库文件夹,但这很难实现,因为需要进行数百次测试.

Rya*_*tes 5

测试属性的顺序如下:

  1. 用AssemblyInitializeAttribute标记的方法.
  2. 使用ClassInitializeAttribute标记的方法.
  3. 用TestInitializeAttribute标记的方法.
  4. 用TestMethodAttribute标记的方法.

问题的一部分是Visual Studio以非确定性顺序(默认情况下,但可以更改)运行测试,并且一次运行多个.这意味着您无法在每次测试后删除该文件夹.


在一般情况下,如果你能避免将磁盘单元测试这将是很多更好.一般来说,除了可能破坏测试的代码之外,您不希望有任何其他内容.

  • @SouthShoreAK你真的想测试从文件系统读取文件,还是想测试你的代码如何处理来自文件系统的数据?如果它是后者(我希望它是),你想*mock*文件系统用于测试目的. (3认同)