diff --git a/test/Directory.Packages.props b/test/Directory.Packages.props index 2dcd2f6da76..81ec9b34c8d 100644 --- a/test/Directory.Packages.props +++ b/test/Directory.Packages.props @@ -18,5 +18,6 @@ + diff --git a/test/EFCore.AspNet.SqlServer.FunctionalTests/EFCore.AspNet.SqlServer.FunctionalTests.csproj b/test/EFCore.AspNet.SqlServer.FunctionalTests/EFCore.AspNet.SqlServer.FunctionalTests.csproj index ed3086b264d..ace9f5c6456 100644 --- a/test/EFCore.AspNet.SqlServer.FunctionalTests/EFCore.AspNet.SqlServer.FunctionalTests.csproj +++ b/test/EFCore.AspNet.SqlServer.FunctionalTests/EFCore.AspNet.SqlServer.FunctionalTests.csproj @@ -4,7 +4,6 @@ $(DefaultNetCoreTargetFramework) Microsoft.EntityFrameworkCore.AspNet.SqlServer.FunctionalTests Microsoft.EntityFrameworkCore - True true $(DefineConstants);EXCLUDE_ON_MAC diff --git a/test/EFCore.OData.FunctionalTests/EFCore.OData.FunctionalTests.csproj b/test/EFCore.OData.FunctionalTests/EFCore.OData.FunctionalTests.csproj index 1778dd946d9..93cc4314ba8 100644 --- a/test/EFCore.OData.FunctionalTests/EFCore.OData.FunctionalTests.csproj +++ b/test/EFCore.OData.FunctionalTests/EFCore.OData.FunctionalTests.csproj @@ -5,7 +5,6 @@ Microsoft.EntityFrameworkCore.OData.FunctionalTests Microsoft.EntityFrameworkCore disable - True true diff --git a/test/EFCore.SqlServer.FunctionalTests/EFCore.SqlServer.FunctionalTests.csproj b/test/EFCore.SqlServer.FunctionalTests/EFCore.SqlServer.FunctionalTests.csproj index d91e7e88ddf..2c818963e2c 100644 --- a/test/EFCore.SqlServer.FunctionalTests/EFCore.SqlServer.FunctionalTests.csproj +++ b/test/EFCore.SqlServer.FunctionalTests/EFCore.SqlServer.FunctionalTests.csproj @@ -5,7 +5,6 @@ Microsoft.EntityFrameworkCore.SqlServer.FunctionalTests Microsoft.EntityFrameworkCore true - True true @@ -77,5 +76,6 @@ + diff --git a/test/EFCore.SqlServer.FunctionalTests/TestUtilities/TestEnvironment.cs b/test/EFCore.SqlServer.FunctionalTests/TestUtilities/TestEnvironment.cs index d0d5fa5df76..c670d70ddf4 100644 --- a/test/EFCore.SqlServer.FunctionalTests/TestUtilities/TestEnvironment.cs +++ b/test/EFCore.SqlServer.FunctionalTests/TestUtilities/TestEnvironment.cs @@ -3,6 +3,7 @@ using Microsoft.Data.SqlClient; using Microsoft.Extensions.Configuration; +using Testcontainers.MsSql; namespace Microsoft.EntityFrameworkCore.TestUtilities; @@ -16,8 +17,46 @@ public static class TestEnvironment .Build() .GetSection("Test:SqlServer"); - public static string DefaultConnection { get; } = Config["DefaultConnection"] - ?? "Data Source=(localdb)\\MSSQLLocalDB;Database=master;Integrated Security=True;Connect Timeout=60;ConnectRetryCount=0"; + private static readonly Lazy _defaultConnection = new(InitializeConnectionString); + + public static string DefaultConnection => _defaultConnection.Value; + + private static MsSqlContainer? _container; + + private static string InitializeConnectionString() + { + // If a connection string is specified (env var, config.json...), always use that. + var configured = Config["DefaultConnection"]; + if (!string.IsNullOrEmpty(configured)) + { + return configured; + } + + // Otherwise, on Windows default to LocalDB, and on non-Windows spin up a testcontainer + if (OperatingSystem.IsWindows()) + { + return "Data Source=(localdb)\\MSSQLLocalDB;Database=master;Integrated Security=True;Connect Timeout=60;ConnectRetryCount=0"; + } + + _container = new MsSqlBuilder("mcr.microsoft.com/mssql/server:2025-latest") + .Build(); + + _container.StartAsync().GetAwaiter().GetResult(); + + AppDomain.CurrentDomain.ProcessExit += (_, _) => + { + try + { + _container.DisposeAsync().AsTask().GetAwaiter().GetResult(); + } + catch + { + // Ignore errors during container cleanup + } + }; + + return _container.GetConnectionString(); + } private static readonly string _dataSource = new SqlConnectionStringBuilder(DefaultConnection).DataSource; diff --git a/test/EFCore.SqlServer.FunctionalTests/config.json b/test/EFCore.SqlServer.FunctionalTests/config.json index f4880f2152f..23c46fc5b59 100644 --- a/test/EFCore.SqlServer.FunctionalTests/config.json +++ b/test/EFCore.SqlServer.FunctionalTests/config.json @@ -1,7 +1,7 @@ { "Test": { "SqlServer": { - "DefaultConnection": "Data Source=(localdb)\\MSSQLLocalDB;Database=master;Integrated Security=True;Connect Timeout=60;ConnectRetryCount=0", + "DefaultConnection": null, "ElasticPoolName": "", "SupportsMemoryOptimized": null } diff --git a/test/EFCore.SqlServer.HierarchyId.Tests/EFCore.SqlServer.HierarchyId.Tests.csproj b/test/EFCore.SqlServer.HierarchyId.Tests/EFCore.SqlServer.HierarchyId.Tests.csproj index 8b60caddb2d..37c03897bbe 100644 --- a/test/EFCore.SqlServer.HierarchyId.Tests/EFCore.SqlServer.HierarchyId.Tests.csproj +++ b/test/EFCore.SqlServer.HierarchyId.Tests/EFCore.SqlServer.HierarchyId.Tests.csproj @@ -5,7 +5,6 @@ Microsoft.EntityFrameworkCore.SqlServer.HierarchyId.Tests Microsoft.EntityFrameworkCore.SqlServer disable - True true diff --git a/test/EFCore.VisualBasic.FunctionalTests/EFCore.VisualBasic.FunctionalTests.vbproj b/test/EFCore.VisualBasic.FunctionalTests/EFCore.VisualBasic.FunctionalTests.vbproj index 6b860b8698c..2d7241547ea 100644 --- a/test/EFCore.VisualBasic.FunctionalTests/EFCore.VisualBasic.FunctionalTests.vbproj +++ b/test/EFCore.VisualBasic.FunctionalTests/EFCore.VisualBasic.FunctionalTests.vbproj @@ -4,7 +4,6 @@ Microsoft.EntityFrameworkCore $(DefaultNetCoreTargetFramework) Microsoft.EntityFrameworkCore.VisualBasic.FunctionalTests - True latest