Est-il un dbunit-comme cadre qui ne suce pas pour java/scala?
Je pensais faire un nouveau, de poids léger, de la base de données de la population cadre. J'ai vraiment la haine dbunit. Avant de le faire, je veux savoir si quelqu'un l'a déjà fait.
Choses que je n'aime pas à propos de dbunit:
1) Le plus simple format d'écrire et de commencer est obsolète. Ils veulent que vous utilisez les formats de ballonnement. Certains exigent même des schémas xml. Ouais, c'est ça.
2) Ils peuplent les lignes pas dans l'ordre que vous les écrire, mais dans l'ordre des tableaux sont définis dans le fichier xml. C'est vraiment mauvais parce que vous ne pouvez pas commander vos données d'une façon telle que les contraintes de clé étrangère ne cause pas de problèmes. Cette juste vous oblige à passer par les tracas de les désactiver complètement.
Présente également des pertes de temps et gonfle votre junit classes de base pour inclure le code pour désactiver les contraintes de clé étrangère. Vous aurez probablement à tester pour le type de base de données (hsqldb, etc.) et de les désactiver dans la base de données de manière spécifique. C'est la façon dont mauvais.
Il pourrait être mieux si dbunit aidé dans la désactivation des contraintes de clés étrangères dans le cadre de leur cadre automatiquement, mais ils ne le font pas. Ils n'garder une trace de dialectes... alors pourquoi ne pas les utiliser pour cela? En fin de compte, tout cela n'est de forcer le programmeur à perdre du temps et de ne pas obtenir et de le tester rapidement.
3) XML est une douleur à écrire. Je n'ai pas besoin d'en dire plus à ce sujet. Ils offrent également de nombreuses façons de le faire, que je pense qu'il complique les choses. Juste offrir un vraiment de manière solide et être fait avec elle.
4) Lors de vos données est grande, garder une trace de la carte d'identité et la cohérence de leur/relations correctes est une douleur royale.
Aussi, si vous ne travaillez pas sur un projet pour un mois, comment êtes-vous de se rappeler que user_id 1 a été un admin, user_id 2 a été une entreprise de l'utilisateur, user_id 3 était un ingénieur et user_id 4 a été quelque chose d'autre? Retour à la case c'est perdre plus de temps. Il devrait y avoir un moyen de récupérer, à l'exception d'un nombre arbitraire.
5) C'est lent. J'ai trouvé que moins de hsqldb est utilisé, il est très lent. Il n'a pas à être. Il existe aussi de nombreuses façons de gâcher sa configuration, comme il n'est pas facile à faire "out of the box". Il y a une bosse que vous devez faire pour obtenir le droit de travailler. Cette fonction ne fait qu'encourager les gens à ne pas l'utiliser, ou d'être énervé quand ils commencent à l'utiliser.
6) Certaines valeurs ont tendance à se répéter beaucoup, aime dates. Il serait bien de spécifier les valeurs par défaut, ou même avoir le cadre mis par défaut automatiquement, même sans vous dire de mettre des valeurs par défaut de là. De cette façon, vous pouvez créer des objets avec les valeurs que vous voulez, et de laisser le reste off. Ce que bat la spécification de tous les coins et recoins d'une colonne si elle n'est pas requise.
7), Probablement le plus ennuyeux est que la première entrée doit inclure TOUTES les valeurs null même des espaces réservés ou futures lignes à ne pas choisir les colonnes que vous avez spécifié.
DBunit n'ont pas de valeur par défaut raisonnable pour la traduction [NULL] pour une réelle valeur null soit. Vous devez l'ajouter manuellement. Dites-moi, qui n'a pas fait cela avec dbunit? Tout le monde a des. Il ne devrait pas être comme ça!
Ce que cela signifie est que si vous avez un objet polymorphe, vous devez déclarer toutes les clés étrangères à la jointure de tables de chaque sous-classe dans la première ligne, même si elles sont nulles. Si vous faites un tableau pour toutes les classes de modèle, vous devez toujours spécifier tous les champs sur la première ligne. C'est juste horrible.
Quelque chose pour me satisfaire, ou devrais-je devenir le prochain cadre développeur d'une bien meilleure base de données de test framework?
- Au lieu d'écrire un nouveau tout réparer ce qui est cassé...
- Je pensais le faire simplement en scala, avec rétro-compatibilité à l'esprit, puisque c'est à peu près le chemin de l'avenir de toute façon.
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas au courant de tout véritable alternative à DbUnit et aucun des outils mentionnés par @Joe sont à mes yeux:
Cela étant dit, j'ai personnellement utilisé DbUnit avec succès à plusieurs reprises, sur les petites et les projets d'envergure, et je le trouve assez utile, en particulier lors de l'utilisation de Unitils et ses DbUnit module. Cela ne veut pas dire qu'il est parfait et ne peut pas être améliorée, mais décent avec de l'outillage (soit personnalisé ou quelque chose comme Unitils), son utilisation a été une expérience décent.
Alors permettez-moi de répondre à certaines de vos points:
DbUnit prend en charge à plat ou structurés XML, XLS, CSV. Ce révolutionnaire format souhaitez-vous utiliser? Par ailleurs, une DTD ou un schéma n'est pas obligatoire lors de l'utilisation de XML. Mais il vous donne belles choses comme la validation et l'auto-complétion, comment est-ce mauvais? Et Unitils peut générer facilement pour vous, consultez Générer un fichier XSD ou DTD de la structure de base de données.
Ils sont en attente de votre patch.
Pendant ce temps, Unitils fournit un soutien pour gérer les contraintes de transparence, de voir Désactivation des contraintes et de la mise à jour des séquences.
Je suppose que la douleur est subjective, mais je ne le trouve pas douloureux, en particulier lors de l'utilisation d'un schéma et d'auto-complétion. Qu'est-ce que la balle d'argent que vous êtes suggérant?
Garder leur petit, c'est un savoir les meilleures pratiques. Vous allez avec une meilleure pratique et ensuite se plaindre...
Oui, les tâches de commutation est contre-productif. Mais puisque vous travaillez avec un faible niveau de données, vous devez savoir comment ils sont représentés, il n'y a pas de solution magique, sauf si vous utilisez un niveau plus élevé de l'API de cours (mais ce n'est pas le but de DbUnit).
C'est inhérente à des bases de données et JDBC, pas DbUnit. Utiliser une base de données est rapide comme H2 si vous voulez que les choses soient aussi rapides que possible (si vous avez une meilleure agnostique façon de faire les choses, je serais heureux d'apprendre à ce sujet).
Pas lors de l'utilisation de Unitils comme mentionné dans les présentations comme Unitils - Maison - JavaPolis 2008 ou Tests unitaires: unitils & dbmaintain.
Si vous pensez que vous pouvez améliorer les choses, peut-être contribuer aux solutions existantes. Si ce n'est pas possible, et si vous pensez que vous pouvez créer le tueur de la base de données de test framework, ce que je peux dire, de le faire. Mais n'oubliez pas que les rodomontades est facile, à venir avec des solutions à l'aide de vos propres solutions est moins.
Comme un DbUnit développeur, je suis reconnaissant pour la critique et je doit en partie d'accord avec vous. Nous sommes actuellement en train de commencer la conception de la prochaine DbUnit version majeure, et je tiens à vous inviter à participer à la fois dans la discussion et le développement.
Je ne vais pas répondre à tes points que votre question n'est pas vraiment liée à DbUnit, mais à DbUnit alternatives. De toute façon, je veux juste mettre en évidence votre point 7 est complètement faux: vous n'avez pas besoin de spécifier toutes les colonnes sur la première ligne, la fonction est appelée colonne de détection. Je ne vais pas vous dire pourquoi il n'est pas activé par défaut car vous êtes sûrement assez intelligents pour comprendre par vous-même.
Je vais vous donner scaladbtest un profond examen dans l'espoir d'intégrer leurs idées.
Face à des préoccupations similaires à l'aide de DBUnit, j'ai trouvé ceci : http://dbsetup.ninja-squad.com/index.html qui peut répondre à ses questions. Comme au lieu de représenter des données de test dans des fichiers séparés tous les DB contenu est contenue dans la classe java lui-même.
DbSetup
le plus commode de travailler avec.Si vous utilisez le Framework Spring (ou ne me dérange pas de l'utiliser au moins pour les tests), puis Printemps DBUnit est actuellement le meilleur (maintenu) alternative à la plaine de DBUnit que je connais et à utiliser. Citant leur site web:
Printemps DBUnit semble être le " quelque peu officiel du Printemps des solution pour DB tests unitaires (avec DBUnit); au moins l'auteur/responsable de la bibliothèque, Phil Webb, est de travailler à SpringSource/Pivot.
@DatabaseSetup
ne peut pas être héritées du parent de la classe. Ressemble le projet n'est pas bien entretenu maintenant.- Je utiliser DBUnit, avec un peu de wrappers pour lisser les bords rugueux. Un bon outil qui peut soit compléter ou de chevauchement de la fonctionnalité est Geôlier. Il peut extraire des sous-ensembles de données à partir d'une base de données de référence, et de stocker ce que soit DBUnit compatible fichiers XML, ou comme "topologiquement triés DML fichiers", qui respectent les contraintes de clé étrangère.
Vous avez fait un excellent point.
J'ai travaillé pour un grand nombre de portails web au cours des dernières années, surtout avec PHP, mais aussi certaines Java maintenant et puis.
Et comme vous je ne comprends pas qu'après toutes ces années de cadre et unittesting les développeurs ne semblent pas réaliser à quel point l'entreposage, la manutention a changé dans la dernière décennie.
Il ne suffit pas d'envoyer de création/insertion/tronquer les déclarations de certains de la base de données!
Si vous êtes d'exploitation à grande échelle, vous vous retrouvez en employant toutes sortes de stockage backends, organisé dans les couches pour pousser chaud contenu rapidement. Plus sur la Base de données avant il y a le problème de partitionnement de données. Si vous n'avez pas une bonne clé étrangère de l'abstraction à condition que vous ne sera certainement aller de noix lors de votre espace de stockage changements de configuration. Et pendant que nous y sommes: luminaire de la commande par clé étrangère priorité a beaucoup de pièges et je n'ai pas encore de voir une vraie solution pour que, avec
DBUnit
.De toute façon, le point est d'avoir seulement une base de stockage de base de données en place pour unittesting n'est pas assez complexe pour le stockage de configurations, car souvent ils ne parviennent pas à reproduire les problèmes dans l'environnement direct et sont une douleur dans le cul pour se maintenir.
Sans vouloir sonner comme un fanboy: un endroit où les choses sont d'accord est
ruby on rails
.Qui a une persistante concept de modèle que les gens semblent avoir fait de mettre une certaine pensée dans. Si vous avez affaire à
PHP
,Symfony
est l'endroit où aller. Elle est limitée par la valeur par défaut de l'inclusion deDoctrine
, avec est également très DB-centrique, mais il a de bonnes interfaces et une grande extensibilité et copié les rails luminaire système complètement. Professionnellement, j'ai besoin de bâton pour homebrew solutions pour l'instant, mais ils fonctionnent bien.Je viens de sortir d'une bibliothèque appelée JDBDT (Java Database Delta de Test) que
vous pouvez l'utiliser pour la configuration de base de données et la validation de tests de logiciels.
Ont un coup d'oeil à http://jdbdt.org
Meilleur,
Eduardo
Voici une courte liste de quelques outils dans cette veine (en plus de DBunit) que j'aime particulièrement, ou de trouver d'intéressant. À tout le moins, ils peuvent offrir un peu d'inspiration:
Noter qu'aucune de ces sont vraiment des concurrents à DBunit en termes de portée ou des ensembles de fonctionnalités. Cependant, il y a quelques idées intéressantes là-bas qui pourrait être la peine de prendre un coup d'oeil. Bonne chance!
Nous écrivons Daleq comme un wrapper autour de DbUnit pour remédier à certaines de ces préoccupations. Il permet le remplissage d'une DB seulement au sein de votre unité de test plutôt que de compter sur l'édition des fichiers XML.
J'ai moi aussi eu des problèmes similaires avec DBUnit. En particulier pour l'aide à remplir développement local des données et l'exportation de données à partir d'une base de données réelle. J'ai couru dans plusieurs cas où il serait à l'exportation d'un jeu de données qu'il ne pouvait alors pas d'importation.
Cela m'a inspiré pour écrire une nouvelle bibliothèque pour elle: https://github.com/jeffskj/phonydata
Il utilise un groovy DSL pour définir les ensembles de données qui permet une représentation compacte des données et il est possible de faire des choses intéressantes comme de générer des données aléatoires puisque c'est justement groovy code.
Une alternative à l'aide Printemps configuration et Specs2 les tests peuvent être trouvés ici
Je viens de publier un groovy LIS cadre de appelé à pédale-chargeur disponible via github. Documentation ici.
Il vous permet de travailler avec JPA entité de niveau d'abstraction directement. Depuis, c'est un script groovy, vous pouvez utiliser toutes les groovy constructions.
Pour insérer des lignes dans une table soutenue par une entité JPA appelé Étudiants, avec les champs (pas de colonnes de base de données, mais les champs mappés) appelé id, nom et grade, vous voulez faire quelque chose comme ceci:
Grade est un enum de l'Élève dans la classe qui correspond à la colonne de base de données (peut-être en utilisant JPA 2.1 @Convertir annotation). allStudents est une liste qui contiendra les lignes et les rowOfInterest est une référence à une ligne particulière. Ces propriétés (allStudents et rowOfInterest) sont disponibles pour votre appareil de test.
La situation de DBUnit est en effet parfois frustrant. Une partie du problème sont résolus à partir Marc Philipp avec dbunit-datasetbuilder, spécialement si vous le combinez avec la validateur, qui est à un stade très précoce. Vous pouvez le voir en action à SZE.
Avertissement: Toutes référencées github-les ressources sont maintenues par moi.