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

时间:2015-07-22 08:39:06

标签: visual-studio-2012 msbuild tfsbuild tfs2013 vstest

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

  

数据库部署失败。路径   'C:\ Builds \ 1 \ Database1 \ Database1.sqlproj'不是a的有效路径   数据库项目文件。

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

这是一项已知功能,此主题上有一个MSDN页面https://msdn.microsoft.com/en-us/library/jj851202(v=vs.103).aspx(请参阅“修改测试项目”标题下的部分)。但是,我没有找到明确的解释。似乎还有一些拼写错误,例如指令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>

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

另一个名为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服务器和构建服务器是一台机器。但是,我在完整的开发环境中遇到了同样的错误。

任何想法。感谢。

1 个答案:

答案 0 :(得分:1)

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

请使用此博文作为参考。正如我们所说,MSDN文档正在更新。

三件事很重要

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

    static SqlDatabaseSetup() {     Environment.SetEnvironmentVariable(&#34; VisualStudioVersion&#34;,&#34; 12.0&#34;); }

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

  3. 相对路径从e:\ LocalTFSBuild \ Builds \ 2 \ DataDevelopers \ E2ECI \ bin目录开始,因此它变为.. \ src \ E2ECI \ E2ECIDB \ E2ECI.sqlproj

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