test duration on CI pipeline with more databases
This commit is contained in:
committed by
Bjarke Berg
parent
817b63266d
commit
f1aa22e9e3
@@ -22,7 +22,6 @@ namespace Umbraco.Tests.Integration.Testing
|
||||
protected IUmbracoDatabaseFactory _databaseFactory;
|
||||
protected IList<TestDbMeta> _testDatabases;
|
||||
|
||||
protected const int ThreadCount = 2;
|
||||
|
||||
protected UmbracoDatabase.CommandInfo[] _cachedDatabaseInitCommands = new UmbracoDatabase.CommandInfo[0];
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Umbraco.Core.Persistence;
|
||||
@@ -18,6 +19,7 @@ namespace Umbraco.Tests.Integration.Testing
|
||||
public const string InstanceName = "UmbracoTests";
|
||||
public const string DatabaseName = "UmbracoTests";
|
||||
|
||||
private readonly TestDatabaseSettings _settings;
|
||||
private readonly LocalDb _localDb;
|
||||
private static LocalDb.Instance s_localDbInstance;
|
||||
private static string s_filesPath;
|
||||
@@ -25,26 +27,26 @@ namespace Umbraco.Tests.Integration.Testing
|
||||
public static LocalDbTestDatabase Instance { get; private set; }
|
||||
|
||||
// It's internal because `Umbraco.Core.Persistence.LocalDb` is internal
|
||||
internal LocalDbTestDatabase(ILoggerFactory loggerFactory, LocalDb localDb, string filesPath, IUmbracoDatabaseFactory dbFactory)
|
||||
internal LocalDbTestDatabase(TestDatabaseSettings settings, ILoggerFactory loggerFactory, LocalDb localDb, string filesPath, IUmbracoDatabaseFactory dbFactory)
|
||||
{
|
||||
_loggerFactory = loggerFactory;
|
||||
_databaseFactory = dbFactory;
|
||||
|
||||
_settings = settings;
|
||||
_localDb = localDb;
|
||||
s_filesPath = filesPath;
|
||||
|
||||
Instance = this; // For GlobalSetupTeardown.cs
|
||||
|
||||
_testDatabases = new[]
|
||||
{
|
||||
// With Schema
|
||||
TestDbMeta.CreateWithoutConnectionString($"{DatabaseName}-1", false),
|
||||
TestDbMeta.CreateWithoutConnectionString($"{DatabaseName}-2", false),
|
||||
var counter = 0;
|
||||
|
||||
// Empty (for migration testing etc)
|
||||
TestDbMeta.CreateWithoutConnectionString($"{DatabaseName}-3", true),
|
||||
TestDbMeta.CreateWithoutConnectionString($"{DatabaseName}-4", true),
|
||||
};
|
||||
var schema = Enumerable.Range(0, _settings.SchemaDatabaseCount)
|
||||
.Select(x => TestDbMeta.CreateWithoutConnectionString($"{DatabaseName}-{++counter}", false));
|
||||
|
||||
var empty = Enumerable.Range(0, _settings.EmptyDatabasesCount)
|
||||
.Select(x => TestDbMeta.CreateWithoutConnectionString($"{DatabaseName}-{++counter}", true));
|
||||
|
||||
_testDatabases = schema.Concat(empty).ToList();
|
||||
|
||||
s_localDbInstance = _localDb.GetInstance(InstanceName);
|
||||
if (s_localDbInstance != null)
|
||||
@@ -80,7 +82,7 @@ namespace Umbraco.Tests.Integration.Testing
|
||||
_prepareQueue.Add(meta);
|
||||
}
|
||||
|
||||
for (int i = 0; i < ThreadCount; i++)
|
||||
for (int i = 0; i < _settings.PrepareThreadCount; i++)
|
||||
{
|
||||
var thread = new Thread(PrepareDatabase);
|
||||
thread.Start();
|
||||
|
||||
@@ -3,7 +3,9 @@
|
||||
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.SqlClient;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Umbraco.Core.Persistence;
|
||||
@@ -16,28 +18,29 @@ namespace Umbraco.Tests.Integration.Testing
|
||||
/// </remarks>
|
||||
public class SqlDeveloperTestDatabase : BaseTestDatabase, ITestDatabase
|
||||
{
|
||||
private readonly TestDatabaseSettings _settings;
|
||||
private readonly string _masterConnectionString;
|
||||
public const string DatabaseName = "UmbracoTests";
|
||||
|
||||
public static SqlDeveloperTestDatabase Instance { get; private set; }
|
||||
|
||||
public SqlDeveloperTestDatabase(ILoggerFactory loggerFactory, IUmbracoDatabaseFactory databaseFactory, string masterConnectionString)
|
||||
public SqlDeveloperTestDatabase(TestDatabaseSettings settings, ILoggerFactory loggerFactory, IUmbracoDatabaseFactory databaseFactory, string masterConnectionString)
|
||||
{
|
||||
_loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
|
||||
_databaseFactory = databaseFactory ?? throw new ArgumentNullException(nameof(databaseFactory));
|
||||
|
||||
_settings = settings;
|
||||
_masterConnectionString = masterConnectionString;
|
||||
|
||||
_testDatabases = new[]
|
||||
{
|
||||
// With Schema
|
||||
TestDbMeta.CreateWithMasterConnectionString($"{DatabaseName}-1", false, masterConnectionString),
|
||||
TestDbMeta.CreateWithMasterConnectionString($"{DatabaseName}-2", false, masterConnectionString),
|
||||
var counter = 0;
|
||||
|
||||
// Empty (for migration testing etc)
|
||||
TestDbMeta.CreateWithMasterConnectionString($"{DatabaseName}-3", true, masterConnectionString),
|
||||
TestDbMeta.CreateWithMasterConnectionString($"{DatabaseName}-4", true, masterConnectionString),
|
||||
};
|
||||
var schema = Enumerable.Range(0, _settings.SchemaDatabaseCount)
|
||||
.Select(x => TestDbMeta.CreateWithMasterConnectionString($"{DatabaseName}-{++counter}", false, masterConnectionString));
|
||||
|
||||
var empty = Enumerable.Range(0, _settings.EmptyDatabasesCount)
|
||||
.Select(x => TestDbMeta.CreateWithMasterConnectionString($"{DatabaseName}-{++counter}", true, masterConnectionString));
|
||||
|
||||
_testDatabases = schema.Concat(empty).ToList();
|
||||
|
||||
Instance = this; // For GlobalSetupTeardown.cs
|
||||
}
|
||||
@@ -54,7 +57,7 @@ namespace Umbraco.Tests.Integration.Testing
|
||||
_prepareQueue.Add(meta);
|
||||
}
|
||||
|
||||
for (int i = 0; i < ThreadCount; i++)
|
||||
for (int i = 0; i < _settings.PrepareThreadCount; i++)
|
||||
{
|
||||
var thread = new Thread(PrepareDatabase);
|
||||
thread.Start();
|
||||
|
||||
@@ -10,16 +10,16 @@ namespace Umbraco.Tests.Integration.Testing
|
||||
{
|
||||
public class TestDatabaseFactory
|
||||
{
|
||||
public static ITestDatabase Create(string filesPath, ILoggerFactory loggerFactory, TestUmbracoDatabaseFactoryProvider dbFactory)
|
||||
public static ITestDatabase Create(TestDatabaseSettings settings, string filesPath, ILoggerFactory loggerFactory, TestUmbracoDatabaseFactoryProvider dbFactory)
|
||||
{
|
||||
string connectionString = Environment.GetEnvironmentVariable("UmbracoIntegrationTestConnectionString");
|
||||
|
||||
return string.IsNullOrEmpty(connectionString)
|
||||
? CreateLocalDb(filesPath, loggerFactory, dbFactory)
|
||||
: CreateSqlDeveloper(loggerFactory, dbFactory, connectionString);
|
||||
? CreateLocalDb(settings, filesPath, loggerFactory, dbFactory)
|
||||
: CreateSqlDeveloper(settings, loggerFactory, dbFactory, connectionString);
|
||||
}
|
||||
|
||||
private static ITestDatabase CreateLocalDb(string filesPath, ILoggerFactory loggerFactory, TestUmbracoDatabaseFactoryProvider dbFactory)
|
||||
private static ITestDatabase CreateLocalDb(TestDatabaseSettings settings, string filesPath, ILoggerFactory loggerFactory, TestUmbracoDatabaseFactoryProvider dbFactory)
|
||||
{
|
||||
if (!Directory.Exists(filesPath))
|
||||
{
|
||||
@@ -33,10 +33,10 @@ namespace Umbraco.Tests.Integration.Testing
|
||||
throw new InvalidOperationException("LocalDB is not available.");
|
||||
}
|
||||
|
||||
return new LocalDbTestDatabase(loggerFactory, localDb, filesPath, dbFactory.Create());
|
||||
return new LocalDbTestDatabase(settings, loggerFactory, localDb, filesPath, dbFactory.Create());
|
||||
}
|
||||
|
||||
private static ITestDatabase CreateSqlDeveloper(ILoggerFactory loggerFactory, TestUmbracoDatabaseFactoryProvider dbFactory, string connectionString)
|
||||
private static ITestDatabase CreateSqlDeveloper(TestDatabaseSettings settings, ILoggerFactory loggerFactory, TestUmbracoDatabaseFactoryProvider dbFactory, string connectionString)
|
||||
{
|
||||
// NOTE: Example setup for Linux box.
|
||||
// $ export SA_PASSWORD=Foobar123!
|
||||
@@ -47,7 +47,7 @@ namespace Umbraco.Tests.Integration.Testing
|
||||
throw new InvalidOperationException("ENV: UmbracoIntegrationTestConnectionString is not set");
|
||||
}
|
||||
|
||||
return new SqlDeveloperTestDatabase(loggerFactory, dbFactory.Create(), connectionString);
|
||||
return new SqlDeveloperTestDatabase(settings, loggerFactory, dbFactory.Create(), connectionString);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
|
||||
namespace Umbraco.Tests.Integration.Testing
|
||||
{
|
||||
public class TestDatabaseSettings
|
||||
{
|
||||
public int PrepareThreadCount { get; set; }
|
||||
|
||||
public int SchemaDatabaseCount { get; set; }
|
||||
|
||||
public int EmptyDatabasesCount { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -282,7 +282,15 @@ namespace Umbraco.Tests.Integration.Testing
|
||||
return s_dbInstance;
|
||||
}
|
||||
|
||||
s_dbInstance = TestDatabaseFactory.Create(filesPath, loggerFactory, dbFactory);
|
||||
// TODO: pull from IConfiguration
|
||||
var settings = new TestDatabaseSettings
|
||||
{
|
||||
PrepareThreadCount = 4,
|
||||
EmptyDatabasesCount = 2,
|
||||
SchemaDatabaseCount = 4
|
||||
};
|
||||
|
||||
s_dbInstance = TestDatabaseFactory.Create(settings, filesPath, loggerFactory, dbFactory);
|
||||
|
||||
return s_dbInstance;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user