web-dev-qa-db-fra.com

Sélection aléatoire du fichier CSV dans Jmeter

J'ai un très gros fichier CSV (plus de 8 000 éléments) d'URL que je lis avec un élément CSV Data Set Config. Il remplit le chemin d'un échantillonneur HTTP Request et itère avec un contrôleur while. 

Ceci est correct, sauf que je souhaite que chaque utilisateur (fil) sélectionne une URL aléatoire dans la liste des URL CSV. Ce que je ne veux pas, c'est que chaque thread utilise des éléments CSV de manière séquentielle.

J'ai été capable d'y parvenir avec un contrôleur d'ordres aléatoires avec plusieurs échantillonneurs de requêtes HTTP. Cependant, plus de 8 000 échantillonneurs HTTP sont vraiment bloqués dans un état inutilisable. C'est pourquoi j'ai mis les URL de l'échantillonneur HTTP dans le fichier CSV. Cependant, il ne semble pas que je puisse utiliser le contrôleur d'ordre aléatoire avec les données du fichier CSV. Alors, comment puis-je obtenir une sélection aléatoire d'éléments de données CSV par thread?

14
Andy Arismendi

Il y a un autre moyen d'y parvenir:

  • créer un groupe de threads séparé
  • en fonction de ce que vous voulez réaliser:
    • ajouter un nombre de boucles (aléatoire) -> ceci définira un décalage de début pour le groupe de threads qui fait le travail
    • ajoutez un nombre de boucles ou indéfiniment et un minuteur et laissez-le boucler pendant que l'autre groupe de threads est en cours d'exécution. Ce groupe de threads lira une ligne 'pseudo' aléatoire

Ce n'est pas vraiment aléatoire, le fichier est toujours lu séquentiellement, mais votre fil de travail effectue des sauts dans le fichier. Cela a fonctionné pour moi ;-)

8
Ray

Il n'y a pas de fonction de sélection aléatoire lors de la lecture de données csv. La raison en est que vous auriez besoin de lire tout le fichier en mémoire avant de le faire, ce qui est une mauvaise idée avec un outil de test de charge (tout outil de test de charge).

D'autres outils commerciaux résolvent ce problème en retraçant automatiquement les données. Dans JMeter, vous pouvez atteindre le même objectif manuellement en triant simplement les données à l'aide d'un champ arbitraire. Si vous faites un tri par, par exemple, Nom, le résultat est une distribution aléatoire.

Remarque. Si vous vous assurez que le All Threads par défaut est défini pour la configuration du jeu de données CSV, les données seront uniques dans la portée du processus JMeter.

3
Oliver Lloyd

Comme d'autres réponses l'ont indiqué, la raison pour laquelle vous ne pouvez pas sélectionner une ligne au hasard est que vous devez lire l'intégralité du fichier en mémoire, ce qui est inefficace.

Plutôt que d'essayer de demander à JMeter de gérer cela à la volée, pourquoi ne pas simplement randomiser l'ordre des fichiers avant de commencer le test?

Un langage de script tel que Perl simplifie ceci:

 cat unrandom.csv | Perl -MList::Util=shuffle -e 'print shuffle<STDIN>' > random.csv
1
Andre

Je ne sais pas si cela fonctionnera, mais je le suggérerai quand même.

Pourquoi ne pas diviser vos URL en 100 fichiers CSV différents. Ensuite, dans chaque thread, vous générez le nombre aléatoire et utilisez ce nombre pour identifier le fichier CSV à lire à l'aide de la fonction __CSVRead.

CSVRead "> http://jmeter.Apache.org/usermanual/functions.html#_CSVRead

Maintenant, la seule partie que je ne suis pas sûr si la fonction __CSVRead rouvre le fichier à chaque fois ou partage le même descripteur de fichier dans les threads.

Vous voudrez peut-être l'essayer. S'il vous plaît partager vos découvertes.

0
Manish Sapariya

Une solution beaucoup plus simple. Dans le fichier CSV, ajoutez une autre colonne (disons B) Apply = Rand () dans la première cellule de la colonne B (disons B1). Cela créera un nombre flottant aléatoire. Faites glisser le coin de la cellule (par exemple B1) pour l'appliquer à toutes les URL correspondantes. Colonne B. ____.] Supprimer la colonne B.

0
Jai Singh

Le nouveau Random CSV Data Set Config de BlazeMeter devrait parfaitement répondre à vos besoins.

0
David Le Borgne