Question

J'essaie de charger un service Web tester.

J'ai une méthode simple qui prend 2 paramètres envoyés au service Web et renvoie la réponse, et j'ai créé un test d'unité à partir de cette méthode.

Parce que je veulent besoin pour tester diverses entrées différentes pour tester efficacement le service, je configurais un CSV avec ~ 1000 lignes en tant que DataSource pour le test de l'unité.

Je peux exécuter ce test d'un seul appareil et il va tourner à travers toutes les lignes, appelant séquentiellement le service Web avec des valeurs différentes.

Cependant , ce n'est pas ce dont j'ai besoin. I BESOIN Chaque ligne correspondre à un utilisateur différent sur un fil différent, à l'aide de la configuration de test de charge pour inclure les délais de réflexion, augmente les utilisateurs avec la charge de pas, la configuration de test de test, etc.

Je peux y parvenir en retirant ma source de données à partir des valeurs de test de l'unité et de codage rigide. mais c'est un test fondamentalement imparfait: afin de > Vraiment Testez le service Web, j'ai besoin de chaque utilisateur pour envoyer des valeurs différentes et obtenir des résultats différents.

...

Ainsi, comment puis-je accrocher une source de données à un test de charge et avoir ce test de charge démarrer l'instance de chaque utilisateur d'un test d'unité avec des valeurs différentes?

Était-ce utile?

La solution

J'ai fini par utiliser cette réponse comme guide: https://stackoverflow.com/a/7813465/237723

Plutôt que de créer un test d'unité à partir de la méthode de l'application de console et du test de charge que le test de l'unité , j'ai créé un simple formulaire Web ASP.NET qui a pris les entrées et appelé le service Web.

J'ai enregistré un test de performance Web à l'aide de ce nouveau formulaire et créé un test de charge pour exécuter ce wpest.


  1. Après avoir enregistré le test, j'ai ajouté le CSV comme une source de données à ce test.

  2. Il y avait 2 "demandes" enregistrées: le premier message initial et suivant. Assurez-vous de les laisser tous les deux ! J'ai supprimé la demande Favicon.ico parce que cela n'existait pas. (Ces précautions peuvent être évitables)

  3. En développant la demande postale, j'ai modifié les propriétés des paramètres de zone de texte correspondant à mes 2 entrées de service Web pour obtenir leurs valeurs de la colonne appropriée de la CSV.

  4. J'ai changé la méthode d'accès à la source de données pour "ne pas déplacer automatiquement le curseur" (vous devez développer la source de données à la table et éditer ses propriétés via le clic droit / f4.)

  5. J'ai ensuite créé le WebTestPlugin (à partir de la réponse liée) qui déplace manuellement le curseur en fonction de l'utilisateur (AT) étant exécuté. Cela correspondra à l'instance utilisateur que le test de charge s'étend selon le plan d'étape. Après avoir créé cette classe, créez le projet, puis ajoutez-le à votre test de performance Web.


  6. public class webtestplugin : WebTestPlugin
    {
        public override void PreWebTest(object sender, PreWebTestEventArgs e)
        {
            base.PreWebTest(sender, e);
            e.WebTest.MoveDataTableCursor("DataSource1", "addresses#csv", e.WebTest.Context.WebTestUserId);                        
        }
    }
    

Autres conseils

Juste pour répondre à votre question, je suis à peu près sûr que cela ne peut pas être fait de la boîte de Mstest et Nunit ( Cette approche ne colle pas dans ce scénario).


Mais, imho, n'allez pas y aller ... de mon expérience, simulant ~ 1000 utilisateurs sur une seule machine produira des résultats Bad , car le test rencontrera toutes sortes de clients Limites - Problèmes de piscine de fil, problèmes de trafic sortants et entrants, etc. Je ne dis pas que cela ne peut pas être surmonté, mais il est suffisamment tordu pour envisager une approche différente.

Je ne recommande pas d'utiliser des outils de test de charge (il y en a beaucoup d'entre eux) dans ce cas, car il est suffisamment simple pour écrire un peu d'outil à vous et sauter les problèmes de configuration et les courbes d'apprentissage d'un 3ème fête.

Qu'est-ce que je recommande, écrit un outil à vous et l'exécuter de machines séparées. Il n'est pas nécessaire que ce ne soit pas à gérer par un cadre de test (je ne peux pas me faire appeler un test unitaire, car il n'est pas), une application de console fera l'affaire. Voici un code pour vous aider à démarrer:

private ConcurrentBag<string> logs = new ConcurrentBag<string>();

public void GetLoad(int numberOfUsers, List<string> myParams)
{
    var users = new string[numberOfUsers];
    for (int i = 0; i < numberOfUsers; i++)
    {
        users[i] = string.Format("LoadTest{0}", i + 1);
    }

    var userThreads = new List<Thread>();
    for (int i = 0; i < numberOfUsers; i++)
    {
        int index = i;
        userThreads.Add(new Thread(()=> CallWebService(users[index], myParams[index])));
    }

    Parallel.ForEach(userThreads, thread=>thread.Start());
    foreach (var userThread in userThreads)
    {
        userThread.Join();
    }
    var outputFilename = string.Format("LoadTest.{0}Users.txt", numberOfUsers);
    File.AppendAllLines(outputFilename, logs);
}

L'image montre montrer où effectuer la modification.

 Entrez la description de l'image ici

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top