参考用于CI构建的Microsoft.VisualStudio.QualityTools.UnitTestFramework

时间:2015-06-02 11:50:33

标签: c# visual-studio unit-testing vs-2015-preview

我在VS2015 RC中创建了一个C#测试项目。它在本地构建,但是当我尝试在我们的CI构建服务器(TeamCity)上构建时,它失败并出现错误:

  

UnitTest1.cs(2,17):错误CS0234:类型或命名空间名称   “VisualStudio”在名称空间“Microsoft”中不存在(是吗?   缺少程序集引用?)   [d:\ BuildAgent \工作\ e486bf18e454d0c2 \ dh.PSP.Coordinator.Api.Tests \ dh.PSP.MetadataService.Api.Tests.csproj]   UnitTest1.cs(9,10):错误CS0246:类型或命名空间名称   找不到“TestMethod”(你是否错过了使用指令或   装配参考?)   [d:\ BuildAgent \工作\ e486bf18e454d0c2 \ dh.PSP.Coordinator.Api.Tests \ dh.PSP.MetadataService.Api.Tests.csproj]   UnitTest1.cs(9,10):错误CS0246:类型或命名空间名称   找不到“TestMethodAttribute”(你是否错过了使用   指令或程序集引用?)   [d:\ BuildAgent \工作\ e486bf18e454d0c2 \ dh.PSP.Coordinator.Api.Tests \ dh.PSP.MetadataService.Api.Tests.csproj]   UnitTest1.cs(6,6):错误CS0246:类型或命名空间名称   找不到'TestClass'(你是否错过了使用指令或   装配参考?)   [d:\ BuildAgent \工作\ e486bf18e454d0c2 \ dh.PSP.Coordinator.Api.Tests \ dh.PSP.MetadataService.Api.Tests.csproj]   UnitTest1.cs(6,6):错误CS0246:类型或命名空间名称   找不到'TestClassAttribute'(你错过了使用吗?   指令或程序集引用?)   [d:\ BuildAgent \工作\ e486bf18e454d0c2 \ dh.PSP.Coordinator.Api.Tests \ dh.PSP.MetadataService.Api.Tests.csproj]

显然这是因为包含这些命名空间的程序集(Microsoft.VisualStudio.QualityTools.UnitTestFramework)不在构建服务器上,在我的本地计算机上它位于C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ Common7 \ IDE \ PublicAssemblies \ Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll。 我想我可以将程序集复制到我的解决方案中,以便它成为代码库的一部分,但手动移动文件感觉就像是一个不优雅的黑客。我在nuget上搜索并找到http://www.nuget.org/packages/Microsoft.VisualStudio.QualityTools.UnitTestFramework/,我认为这会解决问题,但安装该软件包失败了:

  

Install-Package:无法安装包   'Microsoft.VisualStudio.QualityTools.UnitTestFramework 11.0.50727.1'。   您正在尝试将此程序包安装到目标项目中   '.NETFramework,Version = v4.5.2',但包中不包含任何内容   程序集引用或与之兼容的内容文件   框架

解决这个问题的最佳选择是什么?我很惊讶在VS2015中创建一个测试项目并不会自动包含我需要的所有依赖项,但也许我很天真(我是一个刚刚起步的点网)。

5 个答案:

答案 0 :(得分:3)

答案类似于eng.augusto's answer中的选项1 Microsoft不为最新版本的Microsoft.VisualStudio.QualityTools.UnitTestFramework提供NuGet,  但它作为Visual Studio的一部分提供 (normally at C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Enterprise \ Common7 \ IDE \ PublicAssemblies \ Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll)

我创建了文件夹Microsoft.VisualStudio.QualityTools作为我的解决方案的子文件夹并复制了

Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll Microsoft.VisualStudio.QualityTools.UnitTestFramework.xml

应将文件添加到源代码控制中(即使通常忽略DLL) 然后我在Test.csproj中更改了引用以引用新位置。

答案 1 :(得分:2)

嗯,我有一些想法,所以选择最适合您需求的想法

  1. 一个简单的答案应该是将DLL标记为本地复制并在解决方案的同一文件夹中使用像Assemblies这样的文件夹并引用" Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll"
  2. 在构建服务器中安装Visual Studio。听起来很疯狂,但它最接近"开发者机器"你有。
  3. 安装DLL in the GAC,这样您就不必为此烦恼了。
  4. 修复NuGet包(添加.NET Framework版本的参考)并使用它。
  5. 降级.NET Framework版本,以便您可以使用NuGet包。
  6. 创建您自己的NuGet服务器! (并添加所需DLL的引用)。
  7. 恕我直言,我选择了第一个答案,因为它似乎是最好的方式"使用NuGet来解决你所有的软件包问题,但你使用的是一个你不知道它是否应该被信任的DLL。

    用于" old"像C或C ++这样的语言,您可以下载代码运行所需的源代码和库,所以我认为NuGet包不是最好的解决方案。

    使用第一个选项,您始终拥有相同的版本,并且可以检查文件的MD5并确切知道构建服务器中正在运行的内容。

    也许真正最好的选择应该是6.当您使用自己的NuGet服务器来处理您的DLL时,让您的生活更加精彩和值得信赖。

答案 2 :(得分:2)

对于在VS 2017中创建的项目。添加Nuget包Microsoft.VisualStudio.QualityTools.UnitTestFramework.Updated允许在CI上构建单元测试项目,而不在构建服务器上安装VS:

enter image description here

答案 3 :(得分:0)

在我们的IT团队要求我从开发服务器上卸载VS2013之后,尝试通过CI / CD流程在开发服务器上使用MSBuild时遇到了这个问题。

在我的构建输出中,有几行带有已考虑一词。这意味着该版本正在考虑这些文件夹以查找文件可能位于的位置。这些行之一如下:

Considered "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll", but it didn't exist.

我从本地计算机上将 Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll 复制到开发服务器上的该文件夹中,错误消失了。

答案 4 :(得分:0)

当然,Microsoft做得很好。要解决此问题,您需要将dll的文件复制到某些提示文件中,然后从ptoject .csproj文件中引用它们。

    <HintPath>..\packages\Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll</HintPath>
    </Reference>
  </ItemGroup>
  <ItemGroup>
      <Reference Include="QualityTools-Fakes">
        <HintPath>..\packages\Microsoft.QualityTools.Testing.Fakes.dll</HintPath>
      </Reference>
    </ItemGroup>
  <ItemGroup>

我不明白为什么我们从VSudio添加此文件时不会更新同一文件,而是没人知道它会做什么。在Java中,只有一个文件pom.xml或build.gradle,仅此而已。在C#中,有各种各样的东西,除了混乱之外没有其他价值。