SQL Server 2014 单元测试 - 部署到构建服务器

SQL Server 2014 Unit Test - Deployment to Build Server

我第一次尝试将 Visual Studio 2013 SQL 服务器数据库项目与测试项目一起使用。它在我的本地机器上似乎工作正常,但在构建服务器上使用 TFS2013.4 运行 时出错,由于路径不正确:

Database deployment failed. Path 'C:\Builds\Database1\Database1.sqlproj' is not a valid path to a database project file.

在运行测试之前找不到要部署的数据库项目。

这是一个已知功能,这里有一个关于该主题的 MSDN 页面 https://msdn.microsoft.com/en-us/library/jj851202(v=vs.103).aspx(请参阅标题 "Modify the Test Project" 下的部分)。但是,我觉得解释不清楚。似乎还有一些错字,例如指令 6 似乎让您将 app.config 从 x 更改为 y,但我看不出有什么不同。他们似乎在 BuildComputer.sqlunitttest.config 中还有一个额外的 't' 或者这是故意的?不确定。

基于这个 MSDN 页面,我现在有一个 app.config 如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="SqlUnitTesting" type="Microsoft.Data.Tools.Schema.Sql.UnitTesting.Configuration.SqlUnitTestingSection, Microsoft.Data.Tools.Schema.Sql.UnitTesting, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </configSections>
  <SqlUnitTesting  AllowConfigurationOverride="true">
    <DatabaseDeployment DatabaseProjectFileName="..\..\..\Database1\Database1.sqlproj" 
      Configuration="Debug" />
    <DataGeneration ClearDatabase="true" />
    <ExecutionContext Provider="System.Data.SqlClient" ConnectionString="Data Source=(localdb)\ProjectsV12;Initial Catalog=SimpleUnitTestDB;Integrated Security=True;Pooling=False"
      CommandTimeout="30" />
    <PrivilegedContext Provider="System.Data.SqlClient" ConnectionString="Data Source=(localdb)\ProjectsV12;Initial Catalog=SimpleUnitTestDB;Integrated Security=True;Pooling=False"
      CommandTimeout="30" />
  </SqlUnitTesting>
</configuration>

注意添加到 SqlUnitTesting 部分的属性 AllowConfigurationOverride="true"

还有另一个名为 Azure-Dev-VS13.sqlunittest.config 的配置文件,其中 Azure-Dev-VS13 是构建服务器名称。本期内容为:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
        <section name="SqlUnitTesting" type="Microsoft.Data.Tools.Schema.Sql.UnitTesting.Configuration.SqlUnitTestingSection, Microsoft.Data.Tools.Schema.Sql.UnitTesting, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </configSections>
    <SqlUnitTesting>
        <DatabaseDeployment DatabaseProjectFileName="..\..\..\TestTeamProject\Database1\Database1.sqlproj" 
            Configuration="Debug" />
        <DataGeneration ClearDatabase="true" />
        <ExecutionContext Provider="System.Data.SqlClient" ConnectionString="Data Source=(localdb)\ProjectsV12;Initial Catalog=SimpleUnitTestDB;Integrated Security=True;Pooling=False"
            CommandTimeout="30" />
        <PrivilegedContext Provider="System.Data.SqlClient" ConnectionString="Data Source=(localdb)\ProjectsV12;Initial Catalog=SimpleUnitTestDB;Integrated Security=True;Pooling=False"
            CommandTimeout="30" />
    </SqlUnitTesting>
</configuration>

唯一的区别是 DatabaseProjectFileName 属性中路径的变化。

我还在

的部署类别下使用单个条目向解决方案添加了 Local.testsettings
<solutionDirectory>\TestProject1\Azure-Dev-VS13.sqlunittest.config

但是,无论我做什么,我都会收到相同的错误消息,但没有引用更改后的路径,所以我认为它仍在读取原始 app.config。

以上示例来自测试单机设置,其中开发机器、TFS 服务器和构建服务器是一台机器。但是,我在我们的完整开发环境中遇到了同样的错误。

任何想法。谢谢。

SSDT blog 中描述了更详细的操作指南版本。

请使用此博客 post 作为参考。 MSDN 文档正在我们说话时更新。

三件事很重要

  1. 要求更新测试项目中的 SqlDatabaseSetup.cs 文件。对于 C#,需要在 SqlDatabaseSetup class.

    中添加以下代码

    静态 SqlDatabaseSetup() { Environment.SetEnvironmentVariable("VisualStudioVersion", "12.0"); }

  2. TFS2013 具有不同的文件夹结构。相对路径应根据您的设置进行设置。例如,我有一个包含 'E2ECIDB' 和 'E2ECITest' 项目的解决方案 'E2ECI'。它位于名为 'DataDevelopers' 的 TFS 项目源代码控制存储库下。我设置的TFS构建文件夹结构是e:\LocalTFSBuild\Builds\DataDevelopers\E2ECI\src\E2ECI\E2ECIDB。

相对路径从e:\LocalTFSBuild\Builds\DataDevelopers\E2ECI\bin目录开始所以变成..\src\E2ECI\E2ECIDB\E2ECI.sqlproj

  1. 目前有一个覆盖 app.config 文件的已知错误。推荐的方法是修改 app.config 文件以设置 TFS 服务器的路径,并在本地测试运行的解决方案中为每个开发人员或本地开发机器添加额外的配置文件。