Test de bundles Nuxeo avec Nuxeo CLI


Thu 18 May 2017 Par Arnaud Kervern

Tester le code que l'on est en train d'écrire est toujours une bonne idée. Cela vous permet de vérifier les éléments qui ne fonctionnent pas et d'effectuer des tests de régression tout en ajoutant du nouveau code. C'est une bonne pratique qui devient encore plus importante lorsque votre équipe grandit et que vos projets Nuxeo Studio sont de plus en plus complexes. Grâce à la gestion des branches (Branch Management) de Nuxeo Studio et à Nuxeo CLI, vous pouvez créer du code plus complexe, ajuster la taille de votre équipe, trouver les bugs pendant que vous codez et valider votre projet Studio.

Connecter Nuxeo CLI à votre compte Nuxeo Online Services (NOS)

Depuis la version 1.5 de Nuxeo CLI, vous pouvez associer votre projet à votre compte NOS pour réaliser certaines opérations. C'est une fonctionnalité toute nouvelle et nous allons continuer à l'améliorer dans les semaines à venir. Mais cette interface est déjà très utile, donc n'arrêtez pas votre lecture ici !

Commençons tout d'abord par réaliser l'association des deux. À l'aide de votre émulateur de terminal préféré, accédez au répertoire racine de votre projet (ou créez-en un) et exécutez la commande suivante :

$ nuxeo studio

Vous devez ensuite saisir vos identifiants de connexion NOS et un nom symbolique pour votre projet. (Ne vous en faites pas, les noms ne sont pas conservés. Le stockage se fait à l'aide de tokens.)

Exécutez nuxeo studio de la manière suivante :

$ nuxeo studio
     info You are going to link a Studio project to this project.q
? NOS Username: akervern
? NOS Password: ********
? Studio Project: akervern-SANDBOX

Après avoir saisi vos identifiants de connexion et votre projet Studio, votre arbre de dépendances Maven sera mis à jour. Votre réponse à la dernière question dépendra de votre fichier de paramétrage général Maven. Le répertoire Maven de Studio est protégé et vous devez avoir la permission de télécharger vos artéfacts et d'accéder à internet. Nuxeo CLI ajoutera vos identifiants de connexion NOS au serveur nuxeo-studio s'ils ne sont pas déjà enregistrés. Et j'insiste : vous devez VRAIMENT lire et suivre le guide Password Encryption de Maven avant de poursuivre. Avoir un mot de passe en clair n'est vraiment pas une bonne idée.

Si vous hésitez encore à écraser votre fichier settings.xml, suivez le guide :

 conflict ../../../../.m2/settings.xml
? Overwrite ../../../../.m2/settings.xml? (Ynaxdh)
  y) écraser
  n) ne pas écraser
  a) écraser ce fichier et tous les autres
  x) annuler
  d) afficher les différences entre l'ancien et le nouveau
  h) aide, liste toutes les options
  Answer:

Je vous conseille de commencer par afficher les différences (d) afin de vous assurer que les lignes modifiées sont correctes. Si tout semble bon, vous pouvez appliquer (y) vos changements.

Créer une opération de scripting simple

La prochaine étape consiste à créer un script d'automatisation simple dans notre projet Studio. Ouvrez Nuxeo Studio et créez une opération d'automatisation appelée smartest_thing avec void en entrée et en sortie.

Le contenu est assez basique :

function run(input, params) {
  return 5;
}

N'oubliez pas de sauvegarder cette opération. La prochaine étape est certainement plus intéressante.

Tests unitaires dans Studio

Partons du principe que vous disposez de connaissances de test basiques de Nuxeo et que vous avez regardé un peu le fonctionnement de notre framework de tests unitaires basé sur Junit. Et si vous avez lu ma documentation sur le test des bundles Studio (How to Test a Studio Bundle) vous êtes prêt à continuer et vous avez en plus toute ma gratitude !

Nous allons utiliser notre nouvelle annotation PartialDeploy (disponible depuis la 9.1 ou la 8.10-HF04) qui vous permet de sélectionner précisément les contributions que vous souhaitez déployer pendant votre test, quels que soient les prérequis. Elle vient avec plusieurs classes préremplies pour vous aider à déployer la plupart des éléments que vous pouvez configurer dans Studio :

  • org.nuxeo.runtime.test.runner.TargetExtensions.ContentModel: Déploie les schémas, les types de documents, le cycle de vie, les répertoires et la politique de versionnage.
  • org.nuxeo.runtime.test.runner.TargetExtensions.ContentTemplate: Déploie tout ce qui est présent dans ContentModel et les modèles de contenu.
  • org.nuxeo.runtime.test.runner.TargetExtensions.Automation: Déploie tout ce qui est présent dans ContentModel, la chaîne d'automatisation et le script d'automatisation.

Tester le script d'automatisation

Commençons par exécuter un test vide :

$ nuxeo bootstrap test-empty
     info Installation of single-module is skipped.
     info You'll be prompted for generation of:
     info   blog-project-core: test-empty

   create Generate Module: blog-project-core

   create Generating Test empty
     info   Parameters: Unit test package, Unit test class name, Using feature
? Unit-Test package: org.nuxeo.sample
? Unit-Test class name: MySmartestOperation
? Using Feature: AutomationFeature
     info Maven dependency: org.nuxeo.runtime:nuxeo-runtime-test:::test
     info Maven dependency: org.nuxeo.ecm.platform:nuxeo-platform-test:::test
     info Maven dependency: org.nuxeo.ecm.platform:nuxeo-platform-audit-core::test-jar:test
     info Maven dependency: org.nuxeo.ecm.automation:nuxeo-automation-test:::test
    force pom.xml
   create src/test/java/org/nuxeo/sample/MySmartestOperation.java
     info You can start editing code or you can continue with calling another generator (nuxeo bootstrap [<generator>..])

Ouvrez la classe de test unitaire MySmartestOperation à partir de votre environnement de développement préféré. Nous allons maintenant aligner le test pour nous assurer que notre opération renvoie bien 5.

Notez que si vous souhaitez tester quelque chose de plus "réel", vous devez également déployer le bundle du projet en question.

package org.nuxeo.sample;

import static org.junit.Assert.assertEquals;

import javax.inject.Inject;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.nuxeo.ecm.automation.AutomationService;
import org.nuxeo.ecm.automation.OperationContext;
import org.nuxeo.ecm.automation.OperationException;
import org.nuxeo.ecm.automation.test.AutomationFeature;
import org.nuxeo.ecm.core.test.DefaultRepositoryInit;
import org.nuxeo.ecm.core.test.annotations.Granularity;
import org.nuxeo.ecm.core.test.annotations.RepositoryConfig;
import org.nuxeo.runtime.test.runner.Features;
import org.nuxeo.runtime.test.runner.FeaturesRunner;
import org.nuxeo.runtime.test.runner.PartialDeploy;
import org.nuxeo.runtime.test.runner.TargetExtensions;

/**
 * Empty Unit Testing class.
 * <p/>
 *
 * @see <a href="https://doc.nuxeo.com/corg/unit-testing/">Unit Testing</a>
 */
@RunWith(FeaturesRunner.class)
@Features(AutomationFeature.class)
@RepositoryConfig(init = DefaultRepositoryInit.class, cleanup = Granularity.METHOD)
// !! Notez que le préfixe "studio.extension." est ajouté au nom de votre projet
@PartialDeploy(bundle = "studio.extensions.akervern-SANDBOX", extensions = TargetExtensions.Automation.class)
public class MySmartestOperation {

    @Inject
    protected AutomationService automationService;

    @Test
    public void assertWeAreSmart() throws OperationException {
        // !! Notez que le préfixe "javascript." est ajouté au nom de votre scripting
        Object res = automationService.run(new OperationContext(), "javascript.smartest_thing");
        assertEquals(5, res);
    }
}

Et voilà ! Vous venez d'écrire votre premier test unitaire validant le comportement de votre script d'automatisation. Bienvenue dans le monde du TDD (test-driven development) !

Bonus

Si vous faites partie des passionnés de déploiements parfaits, ou que vous aimez simplement bien faire votre travail ou suivre les meilleures pratiques, il est probable que vous ayez déjà un package Nuxeo (Nuxeo Package) dans les modules de votre projet. Si ce n'est pas le cas, lancez-vous en exécutant le nuxeo bootstrap package et tous les membres de votre équipe seront en admiration devant vous. Vous pouvez ensuite créer votre projet et ouvrir le package situé ici : {votre-projet}-package/target/{votre-projet}-1.0.zip. Jetez un œil à son contenu. Vous pouvez voir qu'il contient maintenant le fichier jar correspondant à votre projet Nuxeo. Vous pouvez désormais installer vos bundles Java personnalisés et le projet Studio. Et vous verrez, un déploiement moins complexe vous laissera plus de temps pour profiter de la vie !


Tagged: Nuxeo Studio, Nuxeo CLI, How to