参考 Microsoft.VisualStudio.QualityTools.UnitTestFramework 进行 CI 构建。

42
我在VS2015 RC中创建了一个C#测试项目,本地构建成功,但是当我尝试在我们的CI构建服务器(TeamCity)上构建时,会出现以下错误:

UnitTest1.cs(2,17): error CS0234: 命名空间'Microsoft'中不存在类型或命名空间名称为'VisualStudio'的项(是否缺少程序集引用?) [... .Tests.csproj] UnitTest1.cs(9,10): error CS0246: 找不到类型或命名空间名称为'TestMethod'(是否缺少using指令或程序集引用?) [... .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中创建测试项目时未自动包含所需的所有依赖项,尽管我可能有些天真(我是一个初学者的.NET开发者)。

19
为什么会有人将这个问题标记为不好?这是一个完全合理的问题。我是一名经验不足的 .net 开发者,在谷歌上花了相当多的时间却毫无进展,现在正在寻求一些指导来推动自己的开发工作。难道 Stack Overflow 如此精英主义,不允许我这样做吗?真的吗? - jamiet
@jaimiet 我曾经遇到过同样的问题,在你的TeamCity代理上,你是在Linux上使用Mono进行构建吗?Mono不会将该库作为其发行版的一部分提供。如果是在Windows下使用.NET,则有几种选项可用于安装它。 - TylerY86
5个回答

7
答案与eng.augusto的答案中的选项1类似。
微软没有为最新版本的Microsoft.VisualStudio.QualityTools.UnitTestFramework提供NuGet,而是将其作为Visual Studio的一部分提供 (通常在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中的引用以引用新位置。

5

嗯,我有一些想法,因此选择最适合您需求的一个。

  1. 简单的解决方法是将DLL标记为可本地复制,并在解决方案的同一文件夹中使用Assemblies文件夹,并引用“Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll”
  2. 在构建服务器上安装Visual Studio。听起来很疯狂,但这是您所拥有的最接近“开发人员机器”的选择。
  3. DLL安装到GAC中,这样您就不必再费心了。
  4. 修复NuGet包(添加.NET Framework版本的引用)并使用它。
  5. 降级.NET Framework版本,以便使用NuGet包。
  6. 创建自己的NuGet服务器!(并添加所需的DLL引用)。

在我个人看来,我会选择第一个答案,因为它似乎是使用NuGet解决所有程序包问题的“最佳方式”,但您正在使用一个您不知道是否应该信任的DLL。

在像C或C ++这样的“旧”语言中使用的系统中,通常会下载源代码和代码运行所需的库,因此我不认为NuGet包是最好的解决方法。

使用第一种选项,您总是拥有相同的版本,并可以检查文件的MD5,确切地知道在您的构建服务器中运行了什么。

也许真正的最佳选项应该是6。当您使用自己的NuGet服务器处理DLL时,让您的生活更棒,更可靠。


6
或者您可以避免所有这些恐怖,使用xunit、nunit等不是来自微软的任何东西。 - Sam
我在几个自己拥有的项目中遇到了这个问题,实际上是使用 NUnit 进行测试,但一些引用与某些测试项目一起出现。直到我将它们放入我们的 TeamCity 系统中,我才意识到这一点。 - Dan Atkinson

3

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

输入图像描述


2
此软件包已被下架: https://www.nuget.org/packages/Microsoft.VisualStudio.QualityTools.UnitTestFramework.Updated/ - Robert Sirre
3
目前,可以在以下网址找到 Visual Studio 15.0 版本的测试框架:https://www.nuget.org/packages/VS.QualityTools.UnitTestFramework/15.0.27323.2。虽然许多这些包声称是由微软创建的,但通常所有者都是一些随机的人,因此我不确定是否存在许可问题。 - Jesper Matthiesen

2

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

在我的情况下,在我的构建输出中有几行带有单词Considered。这意味着构建正在考虑这些文件夹作为文件可能位于的位置。其中一行如下:

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 从本地机器复制到开发服务器上的该文件夹中,错误消失了。


1
当然,微软做得很好。要解决这个问题,您需要将dll复制到某个方便的位置,并从您的项目.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#中,有各种各样的东西,它们并没有增加任何价值,只会带来混乱。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接