将数据库项目发布为TestInitialize的一部分

时间:2012-06-06 13:00:34

标签: visual-studio unit-testing visual-studio-2012

在Visual Studio中运行单元(或本例中的集成)测试时,有没有办法在TestInitialize方法中发布数据库项目(在同一解决方案中)?

这个想法是,实际命中数据库的每个集成测试应该是一个已知良好且干净的数据库,最好的方法是使用每个测试完全刷新数据库。我一直在网上四处寻找有关数据库和测试的大量相关信息,但没有关于在运行自动化测试时刷新数据库的信息。我也没有在Visual Studio界面中找到任何东西,或者至少我错过了它。

我正在使用Visual Studio Ultimate 2012 RC。

2 个答案:

答案 0 :(得分:3)

在向同事发送a helpful link后,我最终使用Process.Start运行sqlpackage.exe进行部署。从Visual Studio的角度来看,它并不像我希望的那样干净,但它完成了工作。我的引导现在看起来像这样:

private const string SQL_PUBLISH_COMMAND = @"C:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin\sqlpackage.exe";
private const string SQL_PUBLISH_COMMAND_ARGUMENTS = @"/Action:Publish /SourceFile:C:\Data\Code\NewEdCo\Domain\NewEdCo.Database.SQLExpress\bin\Debug\NewEdCo.Database.SQLExpress.dacpac /Properties:CreateNewDatabase=True /TargetServerName:hactar\sqlexpress2012 /TargetDatabaseName:NewEdCoTest";


private void DeployTestDatabase()
{
    var procInfo = new ProcessStartInfo
    {
        Arguments = SQL_PUBLISH_COMMAND_ARGUMENTS,
        CreateNoWindow = true,
        ErrorDialog = false,
        FileName = SQL_PUBLISH_COMMAND,
        RedirectStandardOutput = true,
        UseShellExecute = false
    };
    var proc = new Process
    {
        StartInfo = procInfo
    };

    proc.Start();
    var result = proc.StandardOutput.ReadToEnd();
}

[TestInitialize]
public void BootstrapTests()
{
    DeployTestDatabase();
}

[TestCleanup]
public void TearDownTests()
{
    DeployTestDatabase();
}

用于ProcessStartInfo的选项和标准输出的读取(即使我还没有做任何事情)是为了使任务保持同步。这样,测试就不会相互踩踏。这增加了集成测试的执行时间,但这对我的需求来说很好。

我意识到我在之前完成了一次完整的刷新。如果随着测试次数的增加需要太长时间,我会重新考虑它。但是现在我想确保它在测试之前刷新,并且在测试之后不留痕迹。

sqlpackage.exe

MSDN has an extensive list of options

答案 1 :(得分:0)

面对同样的问题,我发现DACSmash NuGet包很容易从project site上的示例开始工作。

相关问题