СЭД «ДЕЛО»
Руководство пользователя
×

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"
      }
    }
 
Онлайн помощь создана в Dr.Explain