En tant que professionnel de l'assurance qualité , la création d'un nouvel utilisateur pour les tests de produits peut sembler une tâche simple - remplissez simplement le formulaire d'inscription et vous êtes prêt à commencer. Cependant, que se passe-t-il si vous avez besoin de tester un utilisateur avec un historique de messages d'un an ou d'évaluer le fonctionnement d'une fonctionnalité de service vidéo pour un groupe de test A/B particulier ? Ces situations peuvent rapidement devenir fastidieuses et chronophages lors de la création manuelle d'utilisateurs.
Dans cet article, nous partagerons notre parcours de développement d'un outil qui automatise entièrement ce processus. Plongeons-nous !
Présentation de notre outil de gestion des utilisateurs
Chez Social Discovery Group, nous fournissons des services en ligne qui connectent les gens du monde entier. Nos produits permettent aux utilisateurs de communiquer par chat et vidéo, et de partager du contenu multimédia. Au fur et à mesure que nos produits évoluaient, nous avons commencé à rencontrer des scénarios de test de plus en plus complexes. Par exemple, nous devions examiner le profil d'un utilisateur avec un abonnement expiré ou analyser la fonctionnalité d'une liste de contacts avec plus de 30 entrées.
Pour générer un utilisateur "riche en historique", nous avons dû exécuter plusieurs requêtes API, envoyer des messages à RabbitMQ et exécuter des scripts SQL. Comme ces étapes étaient déjà intégrées à nos tests automatisés, l'équipe d'assurance qualité manuelle nous a fréquemment demandé d'effectuer un test automatisé pour créer l'utilisateur nécessaire. Au fil du temps, la création d'un utilisateur unique a commencé à prendre plus de temps que le test lui-même. Par conséquent, nous avons décidé de trouver un moyen de permettre à tout employé de gérer le processus de création d'utilisateur de manière indépendante.
Notre automatisation de test est écrite en C#. Nous utilisons activement les appels d'API vers nos ressources d'application dans des tests automatisés. Par exemple, nous utilisons la méthode suivante pour l'enregistrement du client :
var client = new Client(); RegisterClient(client, param1, param2, param3);
Après avoir analysé notre framework, nous avons conclu que la solution la plus simple pour créer les utilisateurs nécessaires aux tests serait de développer une application ASP.NET Web Forms en utilisant nos méthodes. Nous avons imaginé un site Web que les testeurs QA pourraient utiliser pour créer facilement les utilisateurs requis.
Voici ce que nous avons fait :
Tout d'abord, nous avons ajouté une page pour la création d'utilisateurs. Les testeurs pouvaient sélectionner des paramètres supplémentaires et configurer l'utilisateur en fonction de ses préférences, soit en tant que nouvel utilisateur, soit avec un long historique de discussions.
Voici à quoi ressemblait le processus :
Voici le code de la page, y compris l'élément de sortie.
<%@ Page Language = "C#" AutoEventWireup = "true" CodeBehind = "WebForm1.aspx.cs"
Inherits = "Habrl.Pages.Registration.RegistrationForm1" %> <!DOCTYPE html> <html xmlns = "http://www.w3.org/1999/xhtml" > <head runat = "server" > <title></title> </head> <body> <form id = "registration" runat = "server" > <div> <div> <label>Client type:</label> <asp:DropDownList ID = "clientType" runat = "server" AutoPostBack = "true"
CssClass = "select" OnSelectedIndexChanged = "clientType_OnSelectedIndexChanged" > <asp:ListItem value = "regularClient" Selected = "True" >Regular client</asp:ListItem> <asp:ListItem value = "clientWithChatHistory" >Client with chat history</asp:ListItem> <asp:ListItem value = "inactiveClient" >Inactive Client</asp:ListItem> </asp:DropDownList> </div> <div id = "usersCountDiv" runat = "server" > <label>How much clients we should register:</label> <asp:TextBox ID = "clientsCount" runat = "server" CssClass = "input"
Text = "1" ></asp:TextBox> <div class = "errorMsg" > <asp:RequiredFieldValidator Display = "Dynamic" runat = "server"
ControlToValidate = "usersCount" ErrorMessage = "Define clients count!" ></asp:RequiredFieldValidator> <asp:RangeValidator Display = "Dynamic" runat = "server"
ControlToValidate = "clientsCount" Type = "Integer" MinimumValue = "1" MaximumValue = "30"
ErrorMessage = "We can create from 1 till 30 clients at once!" ></asp:RangeValidator> </div> </div> <div> <asp:Button CssClass = "MyButton separateButton" ID = "SubmitButton" runat = "server"
text = "Register" OnClick = "OnRegisterButtonClick" ></asp:Button> </div> </div> </form> <div runat = "server" id = "result" ></div> </body> </html>
Voici la mise en œuvre logique :
public partial class RegistrationForm : System . Web . UI . Page
{ int _clientsCount; string _clientType; protected void Page_Load ( object sender, EventArgs e )
{ _clientsCount = int.Parse(clientsCount.Text); _clientType = clientType.SelectedValue; } protected void OnRegisterButtonClick ( object sender, EventArgs e )
{ var clients = new ConcurrentBag<Client>(); Parallel.For( 0 , _clientsCount, _ =>
{ var client = new Client(); RegisterClient(client, _clientType); clients.Add(client); }); result.InnerHtml = GenerateTableViewForClientsEnumerable(clients); } }
Lors de l'inscription, nous recevons le tableau suivant :
La méthode RegisterClient utilisée dans UMT est identique à celle utilisée dans nos autotests. Cela signifie que chaque fois que nous introduisons de nouvelles fonctionnalités dans nos produits, nos tests automatiques sont automatiquement mis à jour et ces modifications sont également reflétées dans UMT. L'UMT sert essentiellement d'implémentation frontale sur nos contrats, qui fournissent le code d'autotest sous-jacent.
Grâce à l'UMT, toute l'équipe peut désormais créer facilement le profil utilisateur requis dans l'un de nos nombreux environnements de test en quelques clics seulement. L'équipe d'assurance qualité manuelle peut générer indépendamment les profils d'utilisateurs les plus complexes, sans nécessiter l'intervention de l'équipe d'automatisation. À notre grande surprise, l'équipe de développement a également commencé à tirer parti de l'UMT à ses fins.
Développement et amélioration
Après la sortie de l'UMT, nous avons commencé à recevoir des demandes de nouvelles fonctionnalités. Nous avons ajouté des pages pour la gestion des utilisateurs (y compris l'émulation du statut en ligne et la messagerie) et la gestion des paiements. Plus tard, l'équipe mobile nous a approchés avec une inquiétude : la création d'un utilisateur UMT sur des appareils mobiles nécessitait beaucoup de temps et d'efforts pour saisir les détails de l'e-mail et du mot de passe. En réponse, nous avons ajouté une fonctionnalité petite mais utile à l'UMT : la génération de codes QR avec des liens de connexion et des liens profonds pour les applications mobiles.
Alors que nous continuions à développer UMT, nous avons subi deux refontes majeures et ajouté un menu arborescent au site. En conséquence, la page d'enregistrement de l'utilisateur d'origine a subi une transformation importante et a maintenant une apparence entièrement différente.
Au cours des cinq ans et demi d'existence d'UMT, nous avons étendu l'outil bien au-delà de son objectif initial de faciliter les tests de produits. Nous avons ajouté des sections pour automatiser les activités DevOps, telles que le redémarrage des services et des serveurs, la configuration, le nettoyage et la liaison des environnements de test, et la fourniture d'informations statistiques, ainsi qu'une base de connaissances, etc. Dans la section suivante, j'examinerai de plus près certaines de ces fonctionnalités.
Autorisation
Au bout d'un moment, nous avons décidé de restreindre l'accès à l'UMT pour certains salariés (par exemple, ceux en période d'essai). Pour ce faire, nous avons ajouté une base de données et une table avec les rôles et les utilisateurs, mis en œuvre l'authentification de domaine et les autorisations attribuées. Avec ce système en place, nous pouvons identifier la session de l'utilisateur et lui donner accès à des fonctionnalités spécifiques en fonction de ses droits. Nous avons également ajouté l'autorisation Google à UMT, compte tenu de l'utilisation des services Google par notre entreprise.
Services et environnement de test
Comme UMT est devenu un outil populaire au sein de l'équipe, notre équipe d'assurance qualité souhaitait gérer les services et les bancs d'essai via UMT au lieu de s'appuyer sur divers scripts et outils comme Ansible. Nous avons ajouté la possibilité de redémarrer les services Docker et Windows, IIS et les nœuds Web, et de modifier les configurations de ces services. Nous avons également inclus une fonctionnalité permettant de configurer ces services et de les comparer entre les bancs d'essai.
TestRail et Jenkins
L'automatisation des tests est une partie cruciale de notre travail, et nous avons souvent plus de dix tests en cours à un moment donné. Cependant, il peut être difficile de localiser une course particulière parmi de nombreuses autres dans Jenkins ou de vérifier sa position dans la file d'attente. Pour résoudre ce problème, nous avons développé une page dans UMT qui affiche des données sur toutes les exécutions en cours et celles dans la file d'attente. Cette page interroge toutes nos instances Jenkins pour collecter des informations sur les tâches en cours d'exécution, qui sont ensuite présentées dans des tableaux pour une référence facile.
De plus, UMT propose une page distincte pour la création de TestPlans avec des TestRuns activés dans TestRail. En quelques clics, les utilisateurs peuvent choisir parmi plusieurs TestPlans de base avec des scénarios de test.
L'UMT s'est également avéré utile pour analyser les échecs d'autotests ou pour enquêter sur le comportement anormal des utilisateurs. Auparavant, ces tâches nécessitaient d'ouvrir manuellement Fiddler pour les requêtes API ou de se connecter à la base de données pour exécuter des requêtes SQL. Avec UMT, cependant, des pages dédiées fournissent des informations techniques complètes sur les utilisateurs créés dans le banc d'essai, ce qui rend la résolution des problèmes plus rapide et plus efficace.
Aujourd'hui, UMT est un projet à part entière qui continue d'évoluer au fur et à mesure que le département d'automatisation des tests reçoit de nouvelles tâches pour ajouter des fonctionnalités ou corriger des bugs. Les tâches prioritaires sont incluses dans le sprint. L'UMT reste un outil essentiel pour notre personnel, leur permettant d'économiser du temps et des efforts en rassemblant de nombreuses activités de routine en un seul endroit. Il n'est plus nécessaire de prendre des notes, d'enregistrer des requêtes d'API dans Fiddler ou Postman, ou d'ouvrir SQL Studio pour exécuter des routines de base de données. Donc, si votre entreprise fait face à des défis similaires, vous savez maintenant quoi faire.
Écrit par Pavel Yasonau, chef d'équipe de l'automatisation de l'assurance qualité chez Social Discovery Group