Поделиться через


Создание тестовой функции C# Power Fx (предварительный просмотр)

Примечание.

Предварительные версии функций не предназначены для использования в производственной среде, а их функциональность может быть ограничена. Они доступны перед официальным выпуском, чтобы клиенты могли досрочно получить доступ и предоставить отзывы.

Microsoft Power Fx — мощный язык программирования с низким объемом кода, используемый в Power Apps, и его можно расширить с помощью C# для создания пользовательских тестовых функций. В этой статье объясняется, как создать тестовую функцию на языке C# Power Fx , обеспечивая удобство работы как для создателей, так и для разработчиков.

Модель расширяемости «без обрывов» тестового движка Power Apps гарантирует, что пользователи могут расширять возможности Power Apps тестового движка, не сталкиваясь ни с какими препятствиями. Эта модель позволяет разработчикам создавать пользовательские функции с использованием C#, которые можно интегрировать в Power Fx для обработки сложных сценариев.

Модули тестового движка

Модули тестового движка для Power Fx внутреннего тестового движка построены с использованием модели расширяемости. Вы можете использовать код продукта в качестве примера того, как можно расширить Test Engine.

Вот пример функции, которая предоставляет схему кода для обработки диалогового окна условного согласия в приложении Power Fx Chanvas .

Диалоговое окно согласия — это приглашение, которое появляется у пользователей и запрашивает их разрешение на доступ к определенным ресурсам или выполнение определенных действий. Этот диалог имеет решающее значение для поддержания безопасности и обеспечения того, чтобы пользователи были осведомлены и согласны с действиями, предпринимаемыми от их имени.

Пример диалогового окна согласия на подключение для приложения, подключающегося к SharePoint сайту.

Диалог согласия важен, поскольку он помогает предотвратить несанкционированный доступ и действия. Он гарантирует, что пользователи будут проинформированы и дадут свое явное согласие перед выполнением любых конфиденциальных операций. Это важно в сценариях, где приложению необходимо получить доступ к пользовательским данным или выполнить действия, и такое условное поведение может повлиять на автоматизированные тесты.

Одна из проблем диалогов о согласии заключается в том, что они могут сделать тесты недетерминированными. Подсказка может появляться в зависимости от различных факторов, таких как разрешения пользователя или предыдущие взаимодействия. Такое условное появление может усложнить процесс тестирования, поскольку тестовая система должна обрабатывать эти диалоги соответствующим образом.

Абстрагирование сложности с помощью Power Fx

Power Fx помогает абстрагироваться от сложности условного ожидания диалога согласия и создания соединений при необходимости. Создатели могут использовать Power Fx для определения логики обработки диалоговых окон согласия более простым и интуитивно понятным способом.

Вот пример использования Power Fx для обработки диалогового окна согласия на пользовательской странице:

Preview.ConsentDialog(Table({Text: "Center of Excellence Setup Wizard"}))

В этом примере функция ConsentDialog проверяет, видно ли диалоговое окно согласия. Если это так, функция может ответить на диалоговое окно, подтверждая согласие на тестовую учетную запись. После обработки диалога выполняются оставшиеся шаги теста.

Аргумент Table позволяет процессу ожидания диалога согласия завершиться, если видна метка с предоставленным текстом.

Расширение Power Fx тестовых функций с помощью C#

Следующий пример представляет собой образец кода структуры, который можно использовать в качестве отправной точки для завершения этого примера:

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
using Microsoft.Extensions.Logging;
using Microsoft.Playwright;
using Microsoft.PowerApps.TestEngine.Config;
using Microsoft.PowerApps.TestEngine.TestInfra;
using Microsoft.PowerFx;
using Microsoft.PowerFx.Core.Utils;
using Microsoft.PowerFx.Types;

namespace testengine.module
{
    /// <summary>
    /// This will check the custom pages of a model driven app looking for a consent dialog
    /// </summary>
    public class ConsentDialogFunction : ReflectionFunction
    {
        private readonly ITestInfraFunctions _testInfraFunctions;
        private readonly ITestState _testState;
        private readonly ILogger _logger;
        private static TableType SearchType = TableType.Empty()
              .Add(new NamedFormulaType("Text", FormulaType.String, displayName: "Text"));
    
        /// <summary>
        /// Constructor: Initializes the function with necessary dependencies, 
        /// including ITestInfraFunctions, ITestState, and ILogger.
        /// </summary>
        /// <param name="testInfraFunctions">The test infrastructure functions.</param>
        /// <param name="testState">The test state.</param>
        /// <param name="logger">The logger instance.</param>
        public ConsentDialogFunction(ITestInfraFunctions testInfraFunctions, 
           ITestState testState, 
           ILogger logger) : base(DPath.Root.Append(
               new DName("Preview")), 
               "ConsentDialog", 
               FormulaType.Blank, 
               SearchType)
               {
                  _testInfraFunctions = testInfraFunctions;
                  _testState = testState;
                  _logger = logger;
               }

        /// <summary>
        /// Execute Method: Logs the execution and calls the ExecuteAsync 
        /// method to handle the consent dialog.
        /// </summary>
        /// <param name="searchFor">The table value to search for.</param>
        /// <returns>A blank value.</returns>
        public BlankValue Execute(TableValue searchFor)
        {
            _logger.LogInformation("------------------------------\n\n" +
                "Executing ConsentDialog function.");

            ExecuteAsync(searchFor).Wait();

            return FormulaValue.NewBlank();
        }

        /// <summary>
        /// ExecuteAsync Method: Retrieves the page context and handles the consent dialog with a timeout.
        /// </summary>
        /// <param name="searchFor">The table value to search for.</param>
        /// <returns>A task representing the asynchronous operation.</returns>
        private async Task ExecuteAsync(TableValue searchFor)
        {
            var page = _testInfraFunctions
               .GetContext()
               .Pages
               .Where(p => p.Url.Contains("main.aspx"))
               .First();

            // ... IPage to handle consent dialog with timeout
        }
    }
}

Объяснение примера ConsentDialogFunction

  • Пространства имен и импорт: Импортирует необходимые пространства имен и определяет testengine.module пространство имен.
  • Определение класса: ConsentDialogFunction Класс наследует от ReflectionFunction и определяет пользовательскую функцию ConsentDialog.
  • Конструктор: инициализирует функцию с необходимыми зависимостями, включая ITestInfraFunctions, ITestState и ILogger.
  • Метод выполнения: регистрирует выполнение и вызывает ExecuteAsync метод для обработки диалогового окна согласия.
  • Метод ExecuteAsync: извлекает контекст страницы и обрабатывает диалоговое окно согласия с тайм-аутом.