Publié par
Il y a 3 années · 4 minutes · Craft, Data

Fixtures – SQL vers DbSetup

Fixtures – SQL vers DbSetup

A l’ère impitoyable des tests, beaucoup d’entre nous ont cherché la bonne méthode pour se créer une base de fixtures correcte. Mais ce n’est pas toujours évident, surtout quand il s’agit de maintenance.

TL; DR : Cet article présente un petit utilitaire disponible sur Github vous permettant de migrer vos fixtures SQL vers des fixtures DbSetup. Vous pouvez récupérer Sql2DbSetup directement sur Github.

SQL, ou la douleur des insert massifs

N’avez-vous jamais été confronté à la modification d’une ligne d’insert contenant 20 colonnes ou plus ? Mais si, cherchez bien, vous avez bien dû, un jour ou l’autre, remplacer la valeur « 1 » par la valeur « 2 » sur la colonne 26 dans une ligne telle que :

INSERT INTO MYTABLE(COL1, COL2, COL3, COL4, COL5, COL6, COL7, COL8, COL9, COL10, COL11, COL12, COL13, COL14, COL15, COL16, COL17, COL18, COL19, COL20, COL21, COL22, COL23, COL24, COL25, COL26, COL27, COL28, COL29, COL30, COL31, COL32, COL33, COL34, COL35, COL36, COL37, COL38, COL39, COL40) VALUES (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)

Heureusement, en Java, ceci n’est normalement plus un problème grâce à des outils comme DbUnit ou DBSetup, comme nous allons l’expliquer.

Les outils d’insertion de fixtures

Actuellement, plusieurs outils existent, tels DbUnit et DbSetup. Pour commencer dans l’ordre chronologique, parlons de DbUnit, outil qui en a tout de même décoincé plus d’un.

DbUnit permet d’écrire des fixtures SQL sous un format XML qui résout notre premier problème des inserts dont les clés sont séparées des valeurs. De cette manière, notre test s’écrira désormais comme suit :

<dataset>
 <MYTABLE col1="1" col2="1" col3="1" col4="1" col5="1" col6="1" col7="1" col8="1" col9="1" col10="1" col11="1" col12="1" col13="1" col14="1" col15="1"
 col16="1" col17="1" col18="1" col19="1" col20="1" col21="1" col22="1" col23="1" col24="1" col25="1" col26="1" col27="1" col28="1" col29="1" col30="1"
 col31="1" col32="1" col33="1" col34="1" col35="1" col36="1" col37="1" col38="1" col39="1" col40="1"/>
</dataset>

C’est déjà mieux ! Mais si, comme moi, vous êtes trop vieux pour ces conneries (de XML), vous serez heureux d’apprendre qu’une alternative existe, permettant des inserts dans un DSL exprimé directement en Java. Cette alternative s’appelle DbSetup.

L’approche DbSetup

Si vous ne connaissez pas DbSetup, je vous invite à aller regarder à quoi ressemble la description d’une fixture avec cet outil dans le guide utilisateur.

Si vous vous demandez pourquoi bon dieu utiliser un langage impératif comme Java plutôt que notre bon vieux XML, la page Why DbSetup ? vous convaincra. Si vous avez la flemme d’aller regarder, imaginez par exemple la simplicité pour factoriser tout ou partie du code avec des méthodes Java. Ou tout simplement avoir des fixtures différentes dans chaque test.

Voici à quoi pourrait ressembler une fixture avec DbSetup :

 sequenceOf(
  insertInto("VENDOR")
              .columns("ID", "CODE", "NAME", "COUNTRY_ID") // optional
              .row().column("ID", 1L)
                    .column("CODE", "AMA")
                    .column("NAME", "Amazon")
                    .column("COUNTRY_ID", 2)
                    .end()
              .row().column("ID", 2L)
                    .column("CODE", "PMI")
                    .column("NAME", "Price Minister")
                    .column("COUNTRY_ID", 1)
                    .end()
              .build()),
  insertInto("PRODUCT")
                .columns("ID", "NAME", "VENDOR_ID")
                .values(1L, "Kindle", "1L")
                .build(),
        sql("update VENDOR set FEATURED_PRODUCT_ID = 1 where ID = 1")
 );

Et voilà, le tour est joué. Simple non ?

Ok, je suis convaincu. Mais maintenant, comment je fais pour passer mes 30 000 lignes de fixtures SQL vers DbSetup ?

Ça a été un vrai problème sur un ancien projet. Quand on part d’un legacy code et qu’on veut utiliser DbSetup sur nos vieilles fixtures contenues dans des scripts SQL, on ne trouve aucun outil qui permette de faire la transition. J’ai donc entamé un petit bout de code en Java qui vous permettra de transformer vos vieux scripts.

Pour vous en servir, rien de plus facile, il suffit de suivre les indications sur la page du projet Sql2DbSetup.

C’est open-source ; les issues et les pull-requests sont les bienvenues.

Voilà, désormais plus d’excuse pour garder vos fixtures en SQL (clin d'œil).

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *