Dijeli putem


Stvaranje funkcije C# Power Fx test (pretpregled)

Napomena

Značajke pretpregleda nisu namijenjene u proizvodne svrhe i mogu imati ograničene funkcije. Te su značajke dostupne prije službenog izdavanja da bi se klijentima omogućio prijevremeni pristup i slanje povratnih informacija.

Microsoft Power Fx moćan je jezik s niskim kodom koji se koristi i Power Apps može se proširiti pomoću C# za stvaranje prilagođenih testnih funkcija. Ovaj članak objašnjava kako stvoriti funkciju C# Power Fx test, pružajući besprijekorno iskustvo i za proizvođače i za razvojne inženjere.

Model proširivosti testnog motora Power Apps "bez litica" osigurava da korisnici mogu proširiti mogućnosti testnog motora Power Apps bez nailaženja na bilo kakve prepreke. Ovaj model omogućuje programerima stvaranje prilagođenih funkcija pomoću C#, u koje se mogu integrirati za Power Fx rukovanje složenim scenarijima.

Moduli testnog motora

Moduli testnog motora za Power Fx unutarnji testni motor izrađeni su pomoću modela proširivosti. Kôd proizvoda možete koristiti kao primjere kako se Test Engine može proširiti.

Evo primjera Power Fx funkcije koja pruža pregled koda za rukovanje dijaloškim okvirom uvjetnog pristanka u aplikaciji radnog područja.

Dijaloški okvir za pristanak upit je koji se prikazuje korisnicima tražeći njihovu dozvolu za pristup određenim resursima ili izvođenje određenih radnji. Ovaj dijalog je ključan za održavanje sigurnosti i osiguravanje da su korisnici svjesni i da se slažu s radnjama koje se poduzimaju u njihovo ime.

Primjer dijaloškog okvira za pristanak na vezu za aplikaciju koja se povezuje s web-mjestom SharePoint .

Dijaloški okvir za pristanak važan je jer pomaže u sprječavanju neovlaštenog pristupa i radnji. Osigurava da su korisnici informirani i daju svoj izričiti pristanak prije izvođenja bilo kakvih osjetljivih operacija. To je važno u scenarijima u kojima aplikacija treba pristupiti korisničkim podacima ili izvršiti radnje, a ovo uvjetno ponašanje može utjecati na automatizirane testove.

Jedan od izazova s dijalozima za pristanak je taj što testove mogu učiniti nedeterminističkim. Upit se može uvjetno pojaviti na temelju različitih čimbenika, kao što su korisničke dozvole ili prethodne interakcije. Ovaj uvjetni izgled može zakomplicirati proces testiranja jer testni modul mora na odgovarajući način rukovati tim dijaloškim okvirima.

Apstrahiranje složenosti s Power Fx

Power Fx pomaže apstrahirati složenost uvjetnog čekanja dijaloškog okvira za pristanak i stvaranja veza ako je potrebno. Kreatori mogu koristiti Power Fx za definiranje logike za rukovanje dijaloškim okvirima za pristanak na jednostavniji i intuitivniji način.

Evo primjera upotrebe Power Fx za rukovanje dijaloškim okvirom za pristanak na prilagođenoj stranici:

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

U ovom primjeru ConsentDialog funkcija provjerava je li dijaloški okvir za pristanak vidljiv. Ako jest, funkcija može odgovoriti na dijaloški okvir koji potvrđuje pristanak za testni račun. Nakon obrade dijaloškog okvira izvršavaju se preostali koraci testa.

Argument Table dopušta proces čekanja dijaloškog okvira za pristanak je vidljiva oznaka s navedenim tekstom.

Proširenje Power Fx testnih funkcija pomoću C#

Sljedeći primjer je primjer oglednog koda koji se može koristiti kao početna točka za dovršetak ovog primjera:

// 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
        }
    }
}

Objašnjenje primjera funkcije ConsentDialogFunction

  • Imenski prostor i uvozi: Uvozi potrebne imenske prostore i definira imenski prostor. testengine.module
  • Definicija klase: Klasa ConsentDialogFunction nasljeđuje od ReflectionFunction i definira prilagođenu funkciju ConsentDialog.
  • Konstruktor: Inicijalizira funkciju s potrebnim ovisnostima, uključujući ITestInfraFunctions i ITestState ILogger.
  • Metoda izvršenja: Bilježi izvršenje i poziva metodu ExecuteAsync za rukovanje dijaloškim okvirom pristanka.
  • ExecuteAsync metoda: dohvaća kontekst stranice i obrađuje dijaloški okvir za pristanak s vremenskim ograničenjem.