【问题标题】:Using a DB File to run Tests on Azure Devops使用 DB 文件在 Azure Devops 上运行测试
【发布时间】:2020-06-09 15:16:40
【问题描述】:

有没有办法使用其中一项任务在 Azure Devops 管道上创建数据库文件?

我的想法是在代理上创建一个 localdb(使用 VS)并像使用 VS 一样在该数据库文件上运行单元测试(SSDT)。我可以创建 db 文件 Tools>connect db> Sql server db 文件并输入一个名称。我可以连接到它并运行测试。似乎我无法在 Azure devops 管道上执行此操作。

我知道首选方法是分配一个 Azure SQL 服务器并针对这些服务器运行测试,但数据库非常小,如果我可以针对 db 文件运行这些测试,这似乎是一个更好的主意。

【问题讨论】:

  • 或者您使用内存数据库进行测试?
  • 我不想在 azure 上创建需要定价层的人。因此,我想在代理上创建一个 db 文件,以便我可以对其进行测试,因为它很小。
  • 或者有充分的理由不做我正在做的事情吗?
  • 内存数据库顾名思义就是在内存中创建的。它是实体框架中的一个特性,例如:docs.microsoft.com/en-us/ef/core/miscellaneous/testing

标签: c# unit-testing azure-devops azure-pipelines sql-server-data-tools


【解决方案1】:

基本上我找到了一种在代理上完成这一切的方法。但是,如果您使用较新的语法,则必须更新代理 localdb。

- task: CopyFiles@2
  inputs:
    Contents: '**/Output/*.dacpac'
    flattenFolders: true
    TargetFolder: '$(Build.ArtifactStagingDirectory)'

- task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: |      
      sqllocaldb start MSSQLLocalDB
      sqllocaldb info MSSQLLocalDB

      #import SqlServer module
      Import-Module -Name "SqlServer"

      # create variable with SQL to execute
      $sql = "
      CREATE DATABASE [MyDatabase]
        CONTAINMENT = NONE
        ON  PRIMARY
        ( NAME = N'MyDatabase', FILENAME = N'd:\a\1\s\testing.Data\test\bin\Output\MyDatabase.mdf' , SIZE = 1048576KB , FILEGROWTH = 262144KB )
        LOG ON
        ( NAME = N'MyDatabase_log', FILENAME = N'd:\a\1\s\testing.Data\test\bin\Output\MyDatabase_log.ldf' , SIZE = 524288KB , FILEGROWTH = 131072KB )
      GO

      USE [master]
      GO
      ALTER DATABASE [MyDatabase] SET RECOVERY SIMPLE WITH NO_WAIT
      GO

      ALTER AUTHORIZATION ON DATABASE::[MyDatabase] TO [sa]
      GO "
      Invoke-SqlCmd -ServerInstance "(localdb)\MSSQLLocalDB" -database master -Query $sql

- task: SqlDacpacDeploymentOnMachineGroup@0
  inputs:
    TaskType: 'dacpac'
    DacpacFile: '$(Build.ArtifactStagingDirectory)/*.dacpac'
    TargetMethod: 'connectionString'
    ConnectionString: 'Data Source=(localdb)\.;Initial Catalog=MyDatabase;Integrated Security=True;'

有了这个,您可以将生成的已创建 .mdf 文件附加到您的 localdb 并将您的 dacpac 发布到它。然后,如果您想运行测试,您可以这样做。

【讨论】:

  • 太棒了!感谢您在这里分享您的解决方案,您可以 Accept it as an Answer ,这样它可以帮助遇到相同问题的其他社区成员,我们可以存档这个帖子,谢谢。
【解决方案2】:

使用数据库文件在 Azure Devops 上运行测试

作为解决方法,您可以尝试签入 LocalDb 文件(mdf 和 ldf),将文件复制到输出并更改连接字符串以使用当前执行路径:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
     optionsBuilder.UseSqlServer($”Data Source=(LocalDB)\\MSSQLLocalDB;Initial Catalog=Contacts;AttachDbFilename={AppDomain.CurrentDomain.BaseDirectory}Core\\IntegrationTests\\Contacts.mdf;Integrated Security=True”);
}

您可以查看文档Integration Testing with SQL LocalDb on your build server 了解一些详细信息。

希望这会有所帮助。

【讨论】:

  • 谢谢,这很有帮助。我找到了一种在托管代理上执行此操作的方法,但在这里回复不好
猜你喜欢
  • 2022-08-16
  • 2021-06-16
  • 2019-06-08
  • 2023-02-26
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 2020-03-30
  • 1970-01-01
相关资源
最近更新 更多