SSDT项目+集成/端到端测试+ TearDown

时间:2015-11-06 11:08:26

标签: c# nunit integration-testing xunit sql-server-data-tools

让我们说我有一个sql server数据工具项目(SSDT)和一堆集成/端到端测试(故意不说单元测试)。有没有办法通过测试类库中的代码TearDown并重新发布现有的测试数据库?

PS:

我目前正在尝试这个(路径和文件名简化):

var p = new System.Diagnostics.Process
{
    StartInfo =
    {
    FileName =
        @"C:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin\sqlpackage.exe /Action:Publish /SourceFile:“D:\Database_20151114_18-23-29.dacpac” Profile:”D:\LocalDatabase.publish.xml”",
    UseShellExecute = true
    }
};
p.Start();

不幸的是,我得到了:

{"The system cannot find the file specified"}

dacpac和xml文件绝对存在。有任何想法吗?另外,是否可以自动创建最新的dacpac文件?

3 个答案:

答案 0 :(得分:1)

假设在运行测试的计算机上安装了SSDT,您可以通过TearDown中的shell命令运行 sqlpackage.exe 。 sqlpackage.exe是SSDT用来发布数据库的。

[TearDown]
public void TearDown() {
   System.Diagnostics.Process p = new System.Diagnostics.Process();
   p.StartInfo.FileName = @"C:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin\sqlpackage.exe /Action:Publish /SourceFile:C:\DbProject\bin\Debug\DbProject.dacpac /TargetServerName:localhost /TargetDatabaseName:TestDb";
   p.StartInfo.UseShellExecute = true;
   p.Start();
}

有关sqlpackage.exe参数的信息,请参阅here。请注意,sqlpackage.exe可能与我上面使用的路径不同。

答案 1 :(得分:1)

这样的事情似乎可以解决问题:

const string dacPacFileName = @"D:\Bla.dacpac";
var connectionString = ConfigurationManager.ConnectionStrings["BlaConnectionString"].ConnectionString;

var dacPackage = DacPackage.Load(dacPacFileName);
var dacServices = new DacServices(connectionString);      
var dacOptions = new DacDeployOptions();
dacOptions.CreateNewDatabase = true;
dacServices.Deploy(dacPackage, "Bla", true, dacOptions); 

但是,它仍然需要手动创建dapac文件。这也可以自动化吗?

答案 2 :(得分:1)

是的,绝对有可能使整个过程自动化。大致是这样的:

  • 在端到端测试项目中添加对Microsoft.Build库的引用
  • 使用该库从代码构建您的测试项目,以获取最新的DacPac
  • 使用either NuGetinstalling the SSDT tools添加对Microsoft.SqlServer.Dac库的引用
  • 使用创建的DacPac,在每个测试开始时使用该库中与Dac相关的类和方法发布数据库的新副本。

excellent existing answer包含有关操作方法的所有详细信息。