Aller au contenu principal

4-4 Exécuter un scénario de test simple (MVC)

Créer une classe de test

Dans le cas présent, j'ai créé une classe de test appellée AccueilTests sous Snowfall.Tests/Tests.Mvc/TestsE2E.

Elle hérite de WebMvcE2ETestBase, ce qui est essentiel afin de démarrer le serveur de test.

Snowfall.Tests/Web.Mvc/TestsE2E/AccueilTests.cs
public class AccueilTests : WebMvcE2ETestBase
{
public AccueilTests(
SnowfallMvcKestrelApplicationFactory factory,
TestDatabaseFixture db)
: base(factory, db) { }
}

Enregistrer un scénario avec Codegen

Ensuite, la méthode la plus facile est d'enregistrer un scénario avec Codegen.

Pour ce faire, exécutez l'outil Codegen à partir du terminal (et à partir du dossier de projet de tests).

pwsh bin/Debug/net9.0/playwright.ps1 codegen

Cela vous ouvrira un navigateur et la fenêtre suivante pour enregistrer vos actions. Vous pouvez utiliser le menu déroulant Target pour changer le format du test. Utilisez Library pour xUnit.

Imgur

Ensuite, démarrez votre projet (MVC ou API) et accédez à l'URL du projet dans la fenêtre de navigateur propre à Codegen. Naviguez pour créer le scénario de test souhaité et vous verrez les étapes se répliquer en tests Playwright xUnit.

Utiliser le résultat du scénario comme base pour créer un test

Ensuite, vous pouvez utiliser une bonne partie du code généré pour votre test. Cependant n'oubliez pas que vous devez insérer des donnnées de test pour supporter votre test!. Nous reviendrons à l'insertion

info

Jusqu'à l'instruction Page.GotoAsync, ce que Playwright vous fourni est en fait présent dans la classe de base WebMvcE2ETestBase. Votre test peut donc ignorer ces lignes normalement.

  1. Créez une fonction de test de base pour afficher la page d'accueil

    public class AccueilTests : WebMvcE2ETestBase
    {
    public AccueilTests(
    SnowfallMvcKestrelApplicationFactory factory,
    TestDatabaseFixture db)
    : base(factory, db) { }

    [Fact]
    public async Task Obtenir_AccueilUtilisateurAnonyme_PageContientEvenements()
    {
    string baseUrl = Application.ClientOptions.BaseAddress.ToString();
    await Page.GotoAsync($"{baseUrl}");
    }
    }
  2. Vous pouvez essayer d'exécuter le test. Une fenêtre de navigateur devrait s'ouvrir et se fermer ensuite. De plus, on ne fait pas de "assert", donc le test devrait passer automatiquement.

  3. Ajoutez des données et vérifiez que la page contient le nom de la ville insérée en BD.

    Snowfall.Tests/Web.Mvc/TestsE2E/AccueilTests.cs
    [Fact]
    public async Task Obtenir_AccueilUtilisateurAnonyme_PageContientEvenements()
    {
    // Arrange
    string baseUrl = Application.ClientOptions.BaseAddress.ToString();
    var ville = new Ville()
    {
    Nom = "Paris",
    PaysIso = "fr"
    };
    ville = await VilleRepository.Create(ville);

    List<Evenement> evenementsList = new()
    {
    new Evenement()
    {
    Nom = "Evenement de test",
    Description = "Description de l'événement",
    Capacite = 10,
    Prix = 100,
    Date = DateTime.Now,
    ImagePath = "image.jpg",
    VilleId = ville.Id,
    },
    };
    foreach (var evenement in evenementsList)
    {
    await EvenementRepository.Create(evenement);
    }

    // Act
    await Page.GotoAsync($"{baseUrl}");

    // Assert
    Assert.Contains(ville.Nom, await Page.ContentAsync());
    }
    info

    Vous devez obtenir l'adresse du serveur de test à l'aide de Application.ClientOptions.BaseAddress. Ensuite, utiliser cette URL dans les requêtes de type await page.GotoAsync($"{url}");.

    Le test généré par Codegen doit donc être légèrement modifié pour utiliser la bonne URL plutôt qu'une URL codée en dur.

    Finalement, le code généré par Codegen ne contient pas de Assert, vous devrez les ajouter vous-même selon ce que vous voulez tester.

    Ici, je fais un Assert que le contenu de la page contient le nom de la ville insérée en BD pour les tests en récupérant le texte via page.ContentAsync().

    Plusieurs autres fonctions sont disponibles sur page pour récupérer d'autres informations.

Améliorations l'URL de base

Il serait fastidieux dans chaque test de récupérer l'URL de base via string baseUrl = Application.ClientOptions.BaseAddress.ToString();. De plus cette URL de base se termine par un /, ce qu'on voudra enlever pour l'ajouter nous-même dans les tests.

  1. Dans la classe de base du test, créer un attribut pour retourner l'URL de base, tout en retirant le "/" à la fin.
    Snowfall.Tests/Web.Mvc/TestsE2E/WebMvcE2ETestBase.cs
    [Collection("Test Database Collection")]
    public abstract class WebMvcE2ETestBase : IClassFixture<SnowfallMvcKestrelApplicationFactory>, IClassFixture<TestDatabaseFixture>, IAsyncLifetime, IDisposable
    {
    protected readonly SnowfallMvcKestrelApplicationFactory Application;
    protected readonly TestDatabaseFixture Database;
    protected IPage Page { get; private set; } = null!;
    protected string BaseUrl => Application.ClientOptions.BaseAddress.ToString().Trim('/');
    protected readonly IVilleRepository VilleRepository;
    protected readonly IEvenementRepository EvenementRepository;

    private IBrowser? _browser;
    private readonly IServiceScope _scope;
  2. Utiliser la propriété dans le test
    Snowfall.Tests/Web.Mvc/TestsE2E/AccueilTests.cs
    //...

    // Act
    await Page.GotoAsync($"{BaseUrl}");

    //...
  3. Vous pouvez apporter la même modification dans la classe de base de tests E2E pour Blazor
    Snowfall.Tests/Web.Api/TestsE2E/WebApiE2ETestBase.cs
    public abstract class WebApiE2ETestBase : IClassFixture<SnowfallApiKestrelApplicationFactory>, IClassFixture<TestDatabaseFixture>, IAsyncLifetime, IDisposable
    {
    protected readonly SnowfallApiKestrelApplicationFactory Application;
    protected readonly TestDatabaseFixture Database;
    protected string BaseUrl => Application.ClientOptions.BaseAddress.ToString().Trim('/');
    //...