MSTest:从公共目录部署项目的明智方法?

时间:2012-06-20 08:57:17

标签: mstest deploymentitem

我最近在尝试处理DeploymentItem时丢了一些头发。

我们有一些本机dll的常用目录,许多测试依赖于这些。

对于C ++项目,我们使用propertypages,其中定义了这些路径。这些甚至可以在C#项目中导入,也可以通过一些手动编辑(因为它们是MSBuild文件)。我仍然无法弄清楚如何在测试中使用它们。

不幸的是,DeploymentItemAttribute不能使用工作表中的属性,但它可以使用环境变量。我希望避免强迫每个人定义全局环境变量......

我已经看到网络上的各种建议,但还没有真正找到一个简单的解决方案。

有人对此有好的方法吗?

2 个答案:

答案 0 :(得分:2)

安德斯的回答是一个很好的解决方案,但就我而言:

  1. 我不喜欢将二进制文件保留在源代码树中的想法
  2. 许多dll没有特定版本,并且会定期更新 基础。
  3. 我不知何故最终得到了这个解决方案:

    首先,我将全局VC ++属性页包含到测试项目中。这必须通过在.csproj顶部的<Project>标记下添加此指令来手动完成:

    <Import Project="$(UserProfile)\AppData\Local\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props" />

    我现在可以访问在我的C ++环境中定义dll路径的属性/宏。

    然后我

    1. 在测试项目中添加了一个新的子文件夹,比如"NativeDlls"
    2. 将所需的dll添加为NativeDlls文件夹的链接
    3. 链接是绝对的,但可以用来自的宏替换 上面包含的属性表:
    4. <Content Include="$(MyLibLocation)\GDAL18BIN\gdal18.dll">

      <Link>NativeDlls\mylib.dll</Link>

      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>

      </Content>

      然后dll就可以部署了:

      [TestMethod]
      [DeploymentItem(@"NativeDlls")]
      public void TestSomeStuff()
      {
      }
      

      而且,正如Anders所提到的:剩下的工作是设置调试/发布和32/64条件。

答案 1 :(得分:1)

如果这些是仅由此项目使用的外部依赖项(不在源树之间共享),那么我建议将它们移动到源代码控制中。依赖项应与源代码一起进行版本控制。理由是您应该能够检查源树的修订版(历史记录中的任何修订版),并且应该构建它。如果您在源代码管理下具有的二进制依赖项,那么在构建特定版本的源时,您将无法知道所需的依赖项版本。

如果您可以将依赖项移动到源树(例如$ svnroot / trunk / dependencies),那么您可以使用仅具有相对路径的测试部署。它可以在TeamCity以及任何开发人员机器下运行。

如果您无法对依赖项进行版本控制,或者出于其他原因必须将它们置于存储库之外,则可以使用测试部署可以使用的环境变量。见This msdn post for an example

编辑:移动了关于管理二进制依赖关系的评论

对于csprojs,我只在项目中有一个dll-reference到源代码树下的lib目录中的dll:s(即引用.. \ lib \ log4net.dll)。如果要为单独的构建引用单独的库,例如对于x86 / 64或Debug / Release不同,那么VS不支持它,但是MsBuild和csproj文件都支持,所以你可以添加条件引用,但是你必须手动编辑csproj以包含例如x86依赖,只有平台是x86等等。