TFS 构建 - "content" 单元测试的 \out 文件夹中不存在构建类型文件?

TFS build - "content" build type files not present in a unit test's \out folder?

我有一个包含单元测试项目和各种其他项目(单元测试引用)的解决方案。其中一个项目引用了一个程序集,该程序集又依赖于本机互操作 DLL,我已使用 "Content" 和 "Copy Always".

的构建操作将其添加到项目中

我可以构建并且 运行 单元在我的 PC 上测试正常,但它们在 TFS (2012) 构建期间失败。在服务器的 \build\...\bin\ 文件夹中可以看到互操作 DLL,但它不在 \build\...\tst\[test_name]\Out\ 文件夹中。

我假设 TFS 试图通过复制它认为单元测试的依赖项来变得聪明?我已经尝试将互操作 DLL 添加到单元测试项目(以与上述相同的方式),但没有任何区别。我还尝试将 [DeploymentItem] 属性添加到其中一个单元测试(以复制互操作 DLL),但它似乎不起作用。

我终于弄明白了,虽然不是很明显。默认情况下,TFS 构建会创建三个子文件夹:- \bin、\src 和 \tst。后者是测试项目及其依赖项被复制的地方(到 \Out 子文件夹),但我的互操作 DLL 不会被复制,因为它不是托管项目依赖项。 这在我的开发 PC 上不是问题 - 当构建单元测试项目时,Visual Studio 支持互操作 DLL 的 "copy always" 选项(即使它在不同的项目中),确保它被复制到单元测试项目的 \bin 文件夹中。

我尝试了 [DeploymentItem] 属性,但运气不佳 - 有一些关于路径相对位置的相互矛盾的文章,而且您似乎还必须有一个 .testsettings 文件目前这个工作。在花了 时间签入和测试各种排列后,我在这方面从未取得任何成功。

我还尝试使用 .testsettings 文件("Deployment" 选项卡)部署文件。使事情复杂化的是,我的互操作 DLL 必须驻留在 \bin 文件夹下的子文件夹中(它是 SQLite.Interop.dll,如果有人感兴趣的话)。 .testsettings 部署选项卡似乎不支持文件夹结构,因此互操作 DLL 将被复制到 \tst\Out 文件夹,而不是所需的子文件夹。

最后,我能够从 TFS 服务器的 \bin 文件夹中将构建配置为 运行 单元测试,因此它的工作方式与开发 PC 相当:-

  1. 创建一个 .testsettings 文件并将其添加到解决方案中。在属性对话框的 "Deployment" 选项卡中,我勾选了 "Enable Deployment" 复选框。我在此选项卡上指定任何文件。

  2. 将文件签入 TFS,然后编辑我的构建定义并相应地设置流程 -> 自动化测试 -> 测试程序集 -> 运行 设置文件。