[JAVA] Tester automatiquement avec la jauge

Aperçu

Je m'appelle @SatohJohn et je suis en charge du troisième jour du calendrier de l'avent Java. Cette fois, j'écrirai les paramètres pour écrire un test automatisé à l'aide de Gauge. Apparemment, c'est un peu la même chose que annoncé au JJUG, mais je suis désolé. Je voudrais résumer les détails en phrases.

Qu'est-ce que la jauge

https://getgauge.io/index.html Un outil qui vous permet d'écrire des tests automatisés en démarque.

mérite

Démérite

Préparation

Installer la jauge https://getgauge.io/get-started.html Sur mac, vous pouvez installer avec brew.

Constitution

Créez un projet maven comme suit. (commande d'arbre pratique!

.
├── driver
│   ├── chromedriver_linux
│   ├── chromedriver_mac
│   └── chromedriver_windows.exe
├── env
│   └── default
│       ├── default.properties
│       └── java.properties
├── manifest.json
├── pom.xml
├── specs
│   └── test.spec
└── src
    └── test
        └── java
            ├── StepImplementation.java
            └── VerifyImplementation.java

Le pilote est inclus car le chrome est cette fois utilisé dans le sélénium. manifest.json décrit le format d'implémentation et les informations de plugin de Gauge.

manifest.json


{
  "Language": "java",
  "Plugins": [
    "spectacle"
  ]
}

Placez les paramètres dans env. Il y a d'autres paramètres, mais je pense que c'est ce que vous utilisez réellement.

default.properties


#Répertoire pour mettre le résultat de l'exécution
gauge_reports_dir = reports
#S'il faut mettre à jour les résultats de la mise en œuvre
overwrite_reports = true
#Voulez-vous prendre une capture d'écran en cas d'échec
screenshot_on_failure = true
#Journal des détails de la mise en œuvre
logs_directory = logs

java.properties


#Paramètres à transmettre à la JVM
gauge_jvm_args = -Dselenide.browser=chrome
#Niveau d'initialisation de l'état(Voir ci-dessous)
gauge_clear_state_level = scenario

pom.xml ressemble à ceci:

pom.xml


<dependencies>
    <dependency>
        <groupId>com.thoughtworks.gauge</groupId>
        <artifactId>gauge-java</artifactId>
        <version>0.6.5</version>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.codeborne</groupId>
        <artifactId>selenide</artifactId>
        <version>4.8</version>
        <scope>test</scope>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
        <plugin>
            <groupId>com.thoughtworks.gauge.maven</groupId>
            <artifactId>gauge-maven-plugin</artifactId>
            <version>1.3.0</version>
            <executions>
                <execution>
                    <phase>test</phase>
                    <configuration>
                        <specsDir>specs</specsDir> <!--Répertoire des spécifications à exécuter-->
                    </configuration>
                    <goals>
                        <goal>execute</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Veuillez changer la version de la goyave. Sinon, il entrera en conflit avec la bibliothèque selenide avant l'exécution et vous obtiendrez l'exception suivante.

Failed: Before Suite
Message: java.lang.NoSuchMethodError: com.google.common.util.concurrent.SimpleTimeLimiter.create(Ljava/util/concurrent/ExecutorService;)Lcom/google/common/util/concurrent/SimpleTimeLimiter;

Le répertoire où specs contient le démarquage. java in test est une implémentation de markdown. La méthode d'écriture est la suivante.

Comment écrire

Fondamentalement, je pense que le flux d'écriture d'un test automatisé est le suivant.

  1. Implémentez la méthode avec @ Step
  2. Appelez cette méthode à partir du fichier de spécifications
  3. Si des étapes similaires apparaissent, résumez-les

1. Implémentez la méthode avec @ Step

Pour implémenter la partie à exécuter, créez une classe appropriée comme indiqué ci-dessous et ajoutez @ Step à la méthode. À ce stade, décidez du nom lorsqu'il est appelé depuis le fichier de spécifications. [1]

StepImplementation.java


import com.codeborne.selenide.Selenide;
import com.thoughtworks.gauge.Step;

public class StepImplementation {
    @Step("<url>ouvert") //[1]
    public void open(String url/*[2]*/) {
        Selenide.open(url); //[3]
    }
}

représente une variable, mais peu importe si elle ne correspond pas au nom de l'argument. (Est-il plus facile de voir si elles correspondent) [2] S'il existe une implémentation nommée "Open" Variable "", le test ne sera pas effectué car il s'agit de "Duplicate step implementation". Soyez prudent lorsque vous écrivez des étapes dans plusieurs classes. Ce test utilise Selenide pour ouvrir la page des variables. [3] La même chose est vraie pour Verify.

VerifyImplementation.java


import com.codeborne.selenide.Selenide;
import com.thoughtworks.gauge.Step;
import org.hamcrest.CoreMatchers;
import org.junit.Assert;

public class VerifyImplementation {
    @Step("Le titre est<title>Être")
    public void verifyTitle(String title) {
        String actual = Selenide.title();
        Assert.assertThat(actual, CoreMatchers.is(title));
    }
}

Dans cet exemple, Selenide obtient le titre de la page et le compare avec l'argument.

2. Appelez cette méthode à partir du fichier de spécifications

test.spec


tester[4]
====================

##Ouvrez la page JJUG[5]
[6]
* "http://www.java-users.jp/ccc2017fall/"ouvert
*Le titre est"JJUG CCC 2017 Fall"Être

[4] Ce sera la spécification complète de ce fichier. Vous pouvez exécuter le scénario du même fichier au moment de l'exécution. [5] Ce sera le nom du cas de test (scénario). [6] \ * est le contenu (étape) du test à effectuer. L'implémentation écrite précédemment en Java est appelée. "Le contenu est passé en argument. Vous pouvez également écrire avec <>. Vous pouvez transmettre des fichiers et des tables locaux ainsi que des caractères simples. Si vous écrivez le texte sans écrire \ # etc., il sera traité comme un commentaire. (Je voulais vraiment écrire [6] sur la ligne *

Voir https://docs.getgauge.io/longstart.html pour une méthode de description détaillée.

3. Si des étapes similaires apparaissent, résumez-les

Le résumé s'appelle un concept. Écrivez le concept dans un fichier .cpt.

test.cpt


#tester
* "http://www.java-users.jp/ccc2017fall/"ouvert

Si vous écrivez comme ci-dessus, vous pouvez réécrire test.spec comme suit

test.spec


tester
====================

##Ouvrez la page JJUG
*tester
*Le titre est"JJUG CCC 2017 Fall"Être

Traitement avant l'exécution du test

Avec @ BeforeSuite, vous pouvez modifier les paramètres du navigateur avant d'effectuer le test automatisé.

public class BeforeStepImplementation {
    @BeforeSuite
    public void beforeSuite() {
        ChromeOptions options = new ChromeOptions();
        if (SystemUtils.IS_OS_MAC) {
            System.setProperty("webdriver.chrome.driver", "./driver/chromedriver_mac");
        } else if (SystemUtils.IS_OS_WINDOWS) {
            System.setProperty("webdriver.chrome.driver", "./driver/chromedriver_windows.exe");
        } else if (SystemUtils.IS_OS_LINUX) {
            System.setProperty("webdriver.chrome.driver", "./driver/chromedriver_linux");
        }
        options.addArguments("--no-experiments",
                "--disable-translate",
                "--disable-plugins",
                "--disable-extensions",
                "--no-default-browser-check",
                "--clear-token-service",
                "--disable-default-apps",
                "--enable-logging",
                "--headless", "--disable-gpu", //Si vous avez ces deux, ce sera une exécution sans tête
                "test-type");
        ChromeDriver chromeDriver = new ChromeDriver(options);
        WebDriverRunner.setWebDriver(chromeDriver);
    }
}

De plus, il y a @ BeforeSpec, @ BeforeScenario, @ BeforeStep et After de chaque minutage, il est donc possible d'initialiser à chaque minutage.

Exécutez des tests automatisés de maven

J'ai un plugin, donc je lance juste mvn test. Le résultat sera le suivant.

#tester
  ##Ouvrez la page JJUG ✔ ✔

Specifications: 1 executed      1 passed        0 failed        0 skipped
Scenarios:      1 executed      1 passed        0 failed        0 skipped

Total time taken: 5.535s
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 15.036 s
[INFO] Finished at: 2017-12-02T22:17:39+09:00
[INFO] Final Memory: 11M/159M
[INFO] ------------------------------------------------------------------------

Résumé

Introduction de l'outil de test automatisé Gauge. Je pense que c'est très agréable de pouvoir le décrire avec un balisage. En outre, la démarque facilite la révision. Écrivons un test automatisé! Au fait, cette démo est postée sur github, alors essayez-la! https://github.com/furyu-john/gauge-sample

Recommended Posts

Tester automatiquement avec la jauge
Test d'intégration avec Gradle
Testez Nokogiri avec Rspec.
Test de charge avec JMeter
Faites un test unitaire avec Junit.
Tester Active Strage avec RSpec
Tester le résolveur GraphQL avec rspec
tester
Test de l'API REST à l'aide de REST Assured Part 2
tester
Faites défiler automatiquement l'arrière-plan avec libGDX
tester
tester
[Java] Tester des méthodes privées avec JUnit
Copier et coller le test avec RSpec
Tester les relations d'inclusion de liste avec AssertJ
Contrôleur de cadre de test Spring avec Junit
[rails] Faisons un test unitaire avec Rspec!
Avec EqualsVerifier, le test equals () s'est terminé en un instant
Contrôler l'ordre de test dans Junit4 avec un type d'énumération
Test Java EE (CDI / intercepteur) avec Arquillian
Effectuer un test de confirmation de transaction avec Spring Boot
[Ruby on Rails] Test du contrôleur avec RSpec
[Ruby on Rails] Test de modèle avec RSpec
Comment tester l'étendue privée avec JUnit
Le test JUnit 5 Gradle génère une erreur avec l'annotation Lombok
Présentation du test Java automatisé avec JUnit 5 + Gradle
Test de validation de classe de formulaire avec Spring Boot