63 votes

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.

Des 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.

Cela a é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 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. 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 framework de test?

102voto

Pascal Thivent Points 295221

Je ne suis pas au courant de tout véritable alternative à DbUnit et aucun des outils mentionnés par @Joe sont à mes yeux:

  • Incanto: pas de DB agnostique
  • SQLUnit: une régression des tests unitaires et de harnais pour la base de données de test des procédures stockées (ce n'est pas ce DbUnit est sur)
  • Cactus: un outil pour le conteneur de test (je ne vois pas où il aide avec les bases de données)
  • Liquibase: une base de données de l'outil de migration (ne prend pas en charge/à vérifier les données)
  • ORMUnit: permet d'initialiser une base de données, mais c'est tout
  • JMock: ne pas rivaliser avec DbUnit à tous

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 à certains de vos points:

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.

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.

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.

Ils sont en attente de votre patch.

Pendant ce temps, Unitils fournit un soutien pour gérer les contraintes de manière transparente, voir Désactivation des contraintes et de la mise à jour des séquences.

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.

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?

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.

Garder les petits, c'est un savoir de meilleures pratiques. Vous allez avec une meilleure pratique et ensuite se plaindre...

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.

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).

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.

C'est inhérent aux bases de données 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).

6), 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é.

Pas lors de l'utilisation de Unitils comme mentionné dans les présentations comme Unitils - Maison - JavaPolis 2008 ou de tests Unitaires: unitils & dbmaintain.

Quelque chose pour me satisfaire, ou devrais-je devenir le prochain cadre développeur d'une bien meilleure base de données framework de test?

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.

29voto

Roberto Lo Giacco Points 343

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.

16voto

blue-sky Points 7469

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.

3voto

retronym Points 35066

J'utilise 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.

1voto

Joseph Weissman Points 2778

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:

Notez 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!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X