web-dev-qa-db-fra.com

Exécution de scripts Selenium avec JMeter

J'ai des scripts d'automatisation Selenium prêts avec un flux fonctionnel, maintenant je veux intégrer ces scripts avec JMeter pour les tests de charge.
Est-ce possible?
Si oui, comment intégrer les deux?

Mon premier objectif est d'exécuter le script d'automatisation à l'aide de Selenium que d'exécuter ces scripts dans jmeter pour les tests de charge ou de performances.

26
Rahul Mendiratta

Vous trouverez ci-dessous différentes manières d'exécuter des cas de test Selenium à partir de JMeter:


Échantillonneur de demande JUnit

L'exécution de tests Selenium de cette manière peut être utile si vous souhaitez réutiliser des scénarios Selenium déjà automatisés (Java) au lieu de réécrire des scripts JS pour WebDriver Sampler .

Sélénium RC


  1. Préparez le projet de test et la configuration de Selenium.

    1.1. Téléchargez Selenium Java bibliothèques clientes et placez Selenium-Java-${version}.jar Dans le chemin de classe JMeter, par exemple %JMETER_HOME%/lib/.
    1.2. Le serveur Selenium doit être à l'écoute:

    Java -jar Selenium-server-standalone-${version}.jar
    

    1.3. Exportez le plan de test Selenium au format .jar et enregistrez-le dans %JMETER_HOME%/lib/junit/.

    REMARQUE: Votre classe de test doit étendre TestCase ou SeleneseTestCase pour permettre à JMeter de récupérer ce plan de test, nom du scénario de test devrait commencer par "test").
    REMARQUE: Par défaut SeleneseTestCase étend JUnit 3.x TestCase, également SeleneseTestCase s'attend à ce que le serveur externe Selenium soit en cours d'exécution.

  2. Configurer échantillonneur de demande JUnit

    2.1. Dans le plan de test JMeter, ajoutez échantillonneur de demande JUnit .
    Réglez Class Name Selon l'un du plan de test Selenium.
    Définissez Test Method Pour tester qui est sur le point de s'exécuter.
    Laissez les autres paramètres par défaut.

    enter image description here

    JUnit 3.x contre 4.x
    JUnit Request Sampler peut traiter les classes et méthodes de style JUnit3 et JUnit4. Pour que Sampler recherche les tests JUnit 4 (annotations @Test), Cochez la case Search for Junit4 annotations (instead of JUnit 3) dans les paramètres ci-dessus.
    Les annotations JUnit4 suivantes sont reconnues:

    @Test - utilisé pour trouver des méthodes et des classes de test. Les attributs "attendus" et "timeout" sont pris en charge.
    @ Avant - traité de la même manière que setUp () dans JUnit3
    @ After - traité de la même manière que tearDown () dans JUnit3
    @ BeforeClass, @AfterClass - traitées comme des méthodes de test afin qu'elles puissent être exécutées indépendamment si nécessaire

  3. Vous êtes prêt à commencer votre test au sélénium avec JMeter.

Code Java pour l'échantillonneur de demande JUnit:

JUnit 3.x

package com.example.tests;

import com.thoughtworks.Selenium.*;

public class Selenium extends SeleneseTestCase {

    private static Selenium selenium;

    public void setUp() throws Exception {
        Selenium = new DefaultSelenium("localhost", 4444, "*firefox", "http://www.google.com/");
        Selenium.start();
        Selenium.windowMaximize();
    }

    public void testSelenium() throws Exception {
        Selenium.open("/");
        Selenium.waitForPageToLoad("30000");
        Assert.assertEquals("Google", Selenium.getTitle());
    }

    public void tearDown() throws Exception {
        Selenium.close();
    }
}

JUnit 4.x

Le script de test écrit dans JUnit 4 utilise des annotations JUnit:

package com.example.tests;

import com.thoughtworks.Selenium.*;

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class Selenium extends SeleneseTestCase {

    private static Selenium selenium;

    @Before
    public void setUp() throws Exception {
        Selenium = new DefaultSelenium("localhost", 4444, "*firefox", "http://www.google.com/");
        Selenium.start();
        Selenium.windowMaximize();
    }

    @Test
    public void testSelenium() throws Exception {
        Selenium.open("/");
        Selenium.waitForPageToLoad("30000");
        Assert.assertEquals("Google", Selenium.getTitle());
    }

    @After
    public void tearDown() throws Exception {
        Selenium.stop();
    }
}

Selenium WebDriver


Ce cas est une alternative à WebDriver Sampler mentionné dans une autre réponse ci-dessous.

Conditions préalables

La seule différence avec le boîtier Selenium RC est la préparation de la configuration Selenium:

1.1. Téléchargez et mettez Selenium-server-standalone-${version}.jar Dans le chemin de classe JMeter, par ex. %JMETER_HOME%/lib/.
REMARQUE: Il n'est pas nécessaire de démarrer le serveur Selenium.

Toutes les autres étapes sont les mêmes que dans le scénario décrit ci-dessus.


package org.openqa.Selenium.example;

import junit.framework.TestCase;

import org.junit.Before;
import org.junit.Test;
import org.junit.After;
import org.openqa.Selenium.*;
import org.openqa.Selenium.WebDriver;
import org.openqa.Selenium.WebElement;
import org.openqa.Selenium.firefox.FirefoxDriver;
import org.openqa.Selenium.firefox.FirefoxProfile;

public class Selenium extends TestCase {
    public static WebDriver driver;

    @Before
    public void setUp() {
        FirefoxProfile profile = new FirefoxProfile();
        driver = new FirefoxDriver(profile);
    }

    @Test
    public void testSelenium() throws Exception {
        driver.get("http://www.google.com/");
        Assert.assertEquals("Google", driver.getTitle());
    }

    @After
    public void tearDown() {
        driver.quit();
    }
}

Mise à jour.

Autres bons points et guides pas à pas pour utiliser le bundle Selenium + JUnit + JMeter:


Échantillonneur BeanShell

Dans ce cas, le scénario de test Selenium est exécuté directement dans JMeter's BeanShell Sampler .

  1. La préparation de la configuration de Selenium est complètement identique aux cas décrits ci-dessus: téléchargez les bibliothèques Selenium, placez-les dans le chemin de classe JMeter, démarrez le serveur Selenium (dans le cas de Selenium RC).
  2. Mettez votre scénario de test Selenium dans BeanShell Sampler:

enter image description here

Sélénium RC

import com.thoughtworks.Selenium.*;
import Java.util.regex.Pattern;

Boolean result = true;

try {
    Selenium = new DefaultSelenium("localhost", 4444, "*iexplore", "http://www.google.com/");
    Selenium.start();
    Selenium.windowMaximize();

    Selenium.open("/");
    Selenium.waitForPageToLoad("30000");  

    if (!Selenium.isTextPresent("Google")) result = false;
} catch (Exception ex) {
    ex.printStackTrace();
    IsSuccess = false;
    ResponseCode = "500";
    ResponseMessage = ex.getMessage();
} finally {
    Selenium.stop();
}

IsSuccess = result;
return result;

Selenium WebDriver

import org.openqa.Selenium.By;
import org.openqa.Selenium.WebDriver;
import org.openqa.Selenium.WebElement;
import org.openqa.Selenium.htmlunit.HtmlUnitDriver;

Boolean result = true;

try {
    driver = new HtmlUnitDriver();
    driver.setJavascriptEnabled(true);

    driver.get("http://www.google.com/");

    if (!driver.getTitle().contains("Google")) result = false;
} catch (Exception ex) {
    ex.printStackTrace();
    IsSuccess = false;
    ResponseCode = "500";
    ResponseMessage = ex.getMessage();
} finally {
    driver.quit();
}

IsSuccess = result;
return result;

Échantillonneur JSR223 + Groovy

Dans ce cas, le scénario de test Selenium est exécuté via JSR223 Sampler + Groovy .
Pour considérations de performances cette approche semble être plus préférable que d'utiliser BeanShell Sampler décrit ci-dessus.

  1. La préparation de la configuration de Selenium est complètement identique aux cas décrits ci-dessus: téléchargez les bibliothèques Selenium, placez-les dans le chemin de classe JMeter, démarrez le serveur Selenium (dans le cas de Selenium RC).
  2. Ajout de la prise en charge Groovy pour l'échantillonneur JSR223:

    2.1. télécharger le dernier Groovy distribution binaire;
    2.2. copiez groovy-all-${VERSION}.jar à partir du dossier de distribution "intégrable" et déposez-le dans %JMETER_HOME%/lib/;
    2.3. redémarrez JMeter.

  3. Configurer l'échantillonneur JSR233:

    3.1. ajouter l'échantillonneur JSR233 au groupe de threads;
    3.2. définissez Script Language sur groovy dans les paramètres de l'échantillonneur;
    3.3. mettez votre scénario de test Selenium dans la section Script (le code Java sera accepté):

enter image description here

Sélénium RC

import com.thoughtworks.Selenium.*;
import Java.util.regex.Pattern;

Boolean result = true;

try {
    Selenium = new DefaultSelenium("localhost", 4444, "*iexplore", "http://www.google.com/");
    Selenium.start();
    Selenium.windowMaximize();

    Selenium.open("/");
    Selenium.waitForPageToLoad("30000");      

    if (!Selenium.isTextPresent("Google")) result = false;
} catch (Exception ex) {
    ex.printStackTrace();
    log.error(ex.getMessage());
     SampleResult.setSuccessful(false);
     SampleResult.setResponseCode("500");
     SampleResult.setResponseMessage(ex.getMessage());
} finally {
    Selenium.stop();
}

SampleResult.setSuccessful(result);
return result;

Selenium WebDriver

import org.openqa.Selenium.By;
import org.openqa.Selenium.WebDriver;
import org.openqa.Selenium.WebElement;
import org.openqa.Selenium.htmlunit.HtmlUnitDriver;

Boolean result = true;

try {
    driver = new HtmlUnitDriver();
    driver.setJavascriptEnabled(true);

    driver.get("http://www.google.com/");

    if (!driver.getTitle().contains("Google")) result = false;
} catch (Exception ex) {
    ex.printStackTrace();
    log.error(ex.getMessage());
     SampleResult.setSuccessful(false);
     SampleResult.setResponseCode("500");
     SampleResult.setResponseMessage(ex.getMessage());
} finally {
    driver.quit();
}

SampleResult.setSuccessful(result);
return result;

Notes communes pour les boîtiers d'échantillonneur BeanShell/JSR223:

  • Utilisez des fichiers externes .bsh/.groovy avec test-scenario (champ Script file) Au lieu d'utiliser le code Beanshell/Groovy directement dans l'échantillonneur pour des tests intensifs.
  • Étant donné que les échantillonneurs BeanShell/JSR233 ont accès aux variables de JMeter, vous pouvez définir l'état du test (= exécution de l'échantillonneur) directement dans le scénario de test (via, par exemple, IsSuccess = STATUS Ou SampleResult.setSuccessful(STATUS), voir le code ci-dessus), sans utiliser Assertion de réponse.
27
Aliaksandr Belik

Il existe un moyen plus simple d'exécuter des scripts Selenium.

  1. Téléchargez plugin WebDriver et déplacez-vous vers le dossier lib /.
  2. Ajoutez jp @ gc - Firefox Driver Config et jp @ gc - Web Driver Sampler à votre arbre de test

Jmeter test tree

  • Ajoutez ce code

        var pkg = JavaImporter(org.openqa.Selenium)
        var support_ui = JavaImporter(org.openqa.Selenium.support.ui.WebDriverWait)
        var wait = new support_ui.WebDriverWait(WDS.browser, 5000)
        WDS.sampleResult.sampleStart()
        WDS.log.info("Opening page...");
        WDS.browser.get('http://duckduckgo.com')
        var searchField = WDS.browser.findElement(pkg.By.id('search_form_input_homepage'))
        searchField.click()
        WDS.log.info("Clicked search field")
        searchField.sendKeys(['blazemeter'])
        WDS.log.info("Inserted blazemeter keyword")
        var button = WDS.browser.findElement(pkg.By.id('search_button_homepage'))
        button.click()
        WDS.log.info("Clicked search button");
        var link = WDS.browser.findElement(pkg.By.ByCssSelector('#r1-0 > div.links_main > h2 > a.large > b'))
        link.click()
        WDS.log.info("Clicked blazemeter link");
        WDS.log.info(WDS.name + ' finishing...');
        WDS.sampleResult.sampleEnd()
    
  • Faites votre test

Pour plus d'informations sur la syntaxe du code et les meilleures pratiques, vous pouvez essayer tilisation de Selenium avec l'échantillonneur WebDriver de JMeter article.

8
Bob

Il ne devrait pas être nécessaire d'utiliser Selenium avec JMeter. Le script Selenium prendra une instance d'un navigateur à la fois. Alors que JMeter n'utilise pas une instance réelle d'un navigateur pour générer la charge.

Veuillez me faire savoir si le script Selenium peut être utilisé pour générer une charge du point de vue de l'interface utilisateur pour 5000 utilisateurs. C'est probablement possible. Mais alors, disons-nous que le script Selenium nécessiterait maintenant 5000 instances d'un navigateur sur le même système? Le test fonctionnera-t-il ou suspendra-t-il le système à la place? JMeter dispose également d'excellentes options en tant qu'enregistreur. Il fournit d'excellentes statistiques du point de vue des tests de "charge".

Un instant si nous pensons que les utilisateurs qui connaissent Selenium ne sauront pas comment scripter dans JMeter et donc une courbe d'apprentissage. Mais dans le cas de JMeter, ce n'est même pas vrai. C'est parce qu'il n'est pas nécessaire de créer quelque chose comme une séquence logique ou un programme en premier lieu.

3
user11116659

Donc, fondamentalement, vous enregistrez votre script avec Selenium d'abord, puis réenregistrez les cas de test Selenium à l'aide de jmeter. :-)

http://codenaut.blogspot.com/2011/06/icefaces-load-testing.html

1
r0ast3d