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.
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
.
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
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.
-
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}");
}
} -
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.
-
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());
}infoVous devez obtenir l'adresse du serveur de test à l'aide de
Application.ClientOptions.BaseAddress
. Ensuite, utiliser cette URL dans les requêtes de typeawait 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 viapage.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.
- 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; - Utiliser la propriété dans le test
Snowfall.Tests/Web.Mvc/TestsE2E/AccueilTests.cs
//...
// Act
await Page.GotoAsync($"{BaseUrl}");
//... - 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('/');
//...