6.6 Тестирование
Для тестирования методов разрабатываемых проектов фоновых задач на существующей базе данных необходимо выполнить следующие шаги:
Cоздать Nunit Test project

Рисунок 9
Подключить NuGet пакеты
- Eos.Delo.Platform.Storage.Model
- Eos.Delo.Platform.Storage.Tests.Base
Пример подключения зависимостей <ItemGroup>:
|
<PackageReference Include="Eos.Delo.Platform.Storage.Model" Version="22.8.0-alpha.30" />
<PackageReference Include="Eos.Delo.Platform.Storage.Tests.Base" Version="22.8.0-alpha.30" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="5.0.11" />
<PackageReference Include="nunit" Version="3.13.2" />
<PackageReference Include="NUnit3TestAdapter" Version="4.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.0.0" />
|
Добавить файл appsettings.json
Для подключения к базе данных используется информация из файла appsettings проекта. В нем настраивается уровень логгирования, строки подключения, информация о приложении. Файл appsettings.json добавляется в проект с дополнительным свойством "Копировать в выходной каталог" - "Всегда":
|
{
"Logging": {
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
},
"Eos": {
"DynamicAssemblyPath": "dynamic-assemblies",
"DynamicMetadataPath": "ar-metadata"
},
"ConnectionStrings": {
"FzName.Test:SQLServer": "Server=.\\sqlexpress;User ID=delo;Password=delo;Initial Catalog=DELO_DB",
"FzName.Test:PostgreSQL": "Host=localhost;Port=5432;Database=delo; User ID=delo;Password=delo;CommandTimeout=20;Timeout=40;",
"FzName.Test:Oracle": "Data Source=localhost:1521;User Id=delo;Password=delo"
},
"ApplicationInfo": {
"Name": "TestApp",
"AppVersion": "1.0"
}
}
|
Описание строки подключения к БД можно взять из настроек тестового стенда в файле appsettings.json по ключу "ConnectionStrings.Default".
Создать класс TestSetup
Для подключения к БД необходимо создать класс, наследуемый от TestsSetupGql:
|
// Создание класса, наследуемого от TestsSetupGql
using Eos.Delo.Platform.Storage.Tests.Base;
using Eos.Platform.Metadata;
namespace FzName.Test
{
public class TestsSetup : TestsSetupGql
{
public TestsSetup(HbmProviderType providerType = HbmProviderType.SQLServer) : base(providerType) { }
}
}
|
Указать namespase в котором содержится класс TestSetup для строк connectionString в файле appsettings.json перед типом СУБД ("FzName.Test:SQLServer").
Cоздать класс с тестами.
В классе тестов необходимо создать метод OneTimeSetUp, который будет выполняться перед запуском тестов, конфигурирующий провайдер подключения к БД.
|
// Создание класса с тестамиnamespace FzName.Test
{
public class Tests
{
private Dictionary<HbmProviderType, TestsSetup> _testsSetup = new()
{
{ HbmProviderType.SQLServer, new TestsSetup(HbmProviderType.SQLServer) },
{ HbmProviderType.PostgreSQL, new TestsSetup(HbmProviderType.PostgreSQL) },
{ HbmProviderType.Oracle, new TestsSetup(HbmProviderType.Oracle) }
};
[OneTimeSetUp]
public virtual void OneTimeSetUp()
{
foreach (var setup in _testsSetup.Values)
{
//здесь можно добавить свои сервисы в ServiceCollection и файлы конфигурации в configurationBuilder
//если указан параметр isMainData = true то будут выполнены скрипы Data/{HbmProviderType}/adddata.sql и Data/{HbmProviderType}/{dataSql[i]}.sql
setup.OneTimeSetUpBase(new ServiceCollection(), services =>
{
}, builder => { }, isCustomQueries: true,
isMainData: false, aliasName: "", useArMetadata: true,
useLogging: true, arMetadataGeneration: true, dataSql: new string[0]);
if (setup.ProviderNotConfigured)
throw new Exception();
}
}
[Test]
[TestCase(HbmProviderType.SQLServer)]
[TestCase(HbmProviderType.Oracle)]
public void Test1(HbmProviderType providerType)
{
var db = _testsSetup[providerType].ServiceProvider.GetRequiredService<IDataContext>();
//логика теста
}
}
}
|
Пример тестов для ФЗ находится в дистрибутиве системы в архиве «APISamples.zip» (проект Eos.Delo.Samples.Daemons.UnitTest).
При необходимости работы с доп. реквизитами, перед их получением необходимо добавить вызов метода ArValuesGenerateSuccess
Код ArValuesGenerateSuccess
|
// Дополнительные реквизиты - добавление вызова метода ArValuesGenerateSuccessprivate async Task ArValuesGenerateSuccess(IDataContext context, IServiceProvider serviceProvider)
{
var configuration = serviceProvider.GetRequiredService<IConfiguration>();
var path = configuration.GetDynamicMetadataPath();
await ArValueXmlMetadataGenerationHelper.GenerateAsync(context, path, "Eos.Delo.Platform.Storage.Model", "dbo", "ArValuesContext");
Assert.IsTrue(File.Exists(Path.Combine(path, "ArValuesAdd.hbm.xml")));
var stream = typeof(HbmClass).Assembly.GetManifestResourceStream("Eos.Platform.Metadata.eos-platform-mapping.xsd");
string readXsdMessage = "";
var schema = XmlSchema.Read(stream, (o, a) => {
Assert.Warn(a.Message);
readXsdMessage += a.Message;
});
Assert.IsTrue(string.IsNullOrEmpty(readXsdMessage));
var schemas = new XmlSchemaSet();
schemas.Add(schema);
string validateMessage = "";
var xDoc = XDocument.Load(Path.Combine(path, "ArValuesAdd.hbm.xml"));
xDoc.Validate(schemas, (o, a) => {
Assert.Warn(a.Message);
validateMessage += a.Message;
});
Assert.IsTrue(string.IsNullOrEmpty(validateMessage));
}
|
Возможные ошибки:
- Если тесты не запускаются, необходимо проверить и обновить зависимости.
- Если появляется ошибка "error CodeGeneration: Error: Связанный тип … не найден», следует обновить версии Eos.Delo.Platform.Storage.Model и Eos.Delo.Platform.Storage.Tests.Base.
- Если ошибка "System.InvalidCastException: Unable to cast object of type 'Eos.Delo.Platform.Storage.Model.DataContextCaching' to type 'Eos.Platform.AppSettings.IAppSettingsContext'.
Необходимо добавить в файл appsettings.json следующий код с названием модуля, проекта тестов:
|
"Eos": {
"DynamicAssemblyPath": "dynamic-assemblies",
"DynamicMetadataPath": "ar-metadata",
"ExtensionDbContexts": {
"Eos.Platform.AppSettings.IAppSettingsContext": {
"Module": "FzName.Test",
"Library": "Eos.Platform.AppSettings"
}
}
|
