2010-02-15 14 views
5

Je veux commencer strictement à faire du Test-Driven-Development. Cependant, je me demandais combien je devrais tester les méthodes générées par Moose et MooseX :: FollowPBP. Par exemple, j'ai la classe suivante:De combien ai-je besoin pour tester les méthodes Moose et MooseX :: FollowPBP?

package Neu::Series; 
use Moose; 
use MooseX::FollowPBP; 

use File::Find::Wanted; 

has 'file_regex' => (
    isa=>'RegexpRef', 
    is=>'rw', 
    default => sub{ 
       qr{ 
        [A-Z]  #Uppercase letter 
        [a-zA-Z]* #any letter, any number of times 
        [-]   #dash 
        (   #open capturing parenthesis 
        [0-9] 
        [0-9] 
        [0-9] 
        [0-9] 
        [a-zA-Z]? #any letter, optional 
        )   #close capturing parenthesis 
       }xms; 
      }, 
); 


has 'top_dir' => (
    isa=>'Str', 
    is=>'rw', 
); 


has 'access' =>(
    isa=>'Neu::Access', 
    is=>'ro', 
    required=>1, 

); 

1; 

Mon script de test en cours est:

use strict; 
use warnings; 
use Test::More tests => 8; 
use Neu::Access; 

BEGIN{ use_ok('Neu::Series'); } 

can_ok('Neu::Series', 'new'); 
can_ok('Neu::Series', 'set_file_regex'); 
can_ok('Neu::Series', 'get_file_regex'); 
can_ok('Neu::Series', 'set_top_dir'); 
can_ok('Neu::Series', 'get_top_dir'); 
can_ok('Neu::Series', 'get_access'); 

my $access = Neu::Access->new(dsn => 'test'); 
my $series_worker = Neu::Series->new(access => $access); 

isa_ok($series_worker, 'Neu::Series'); 

Est-ce assez ou trop beaucoup d'essais? (Autrement dit, en plus des tests manquant pour la regex).

Je pensais avoir vu une page Web ou un autre article à ce sujet quelque part, mais je n'ai pas réussi à le trouver aujourd'hui.

Répondre

1

Je me concentrerais sur tester ma spécification. Ai-je dit à Moose ce que je voulais qu'il fasse correctement?

À cette fin, je commencerai par les tests suivants:

  • Vérifiez que lecture/écriture attributs ont à la fois un accesseur et un mutator.
  • Vérifiez que les attributs en lecture seule ont un accesseur et pas de mutateur.
  • Tester toutes les contraintes et coercitions de type. Vérifiez que seules les valeurs acceptables peuvent être définies. Si un attribut sIf vous attendez VII à être considéré comme Str et forcé dans un Int comme 7, vérifiez qu'il le fait.
+0

Merci pour votre réponse. Tu as raison de devoir tester * tout * que je pourrais me tromper moi-même. –

2

Vérifier que tous les accesseurs ont été correctement générés est correct ... mais il y a d'autres choses que vous pourriez tester à un niveau légèrement supérieur, par ex. pourquoi ne pas tester que les attributs ont été générés correctement?

use Test::Deep; 
my @attrs = Neu::Series->meta->get_all_attributes; 
cmp_deeply([ map { $_->name } @attrs ], superbagof(qw(file_regex top_dir access))); 
+1

Merci de m'avoir présenté 'Test :: Deep'! Après avoir lu votre réponse, je suis allé voir la documentation et je suis vraiment impressionné. J'ai également été impressionné que 'Test :: Deep :: NoTest' vous permettra de faire toutes les mêmes comparaisons dans une situation sans test. –

+1

J'aime votre idée d'interroger la méta-classe à des fins de test. Cela me donne une pause quand je considère que cela rend les tests eux-mêmes dépendants de Moose, que se passe-t-il si je choisis d'abandonner Moose pour mon projet (grosse chance de ça)? Est-il préférable d'avoir des tests de boîte noire qui vérifient qu'une méthode particulière est présente et se comporte correctement (au prix de tests plus complexes), ou est-il préférable d'utiliser des informations de classe méta pour introspecter la classe et vérifier la spécification directement? – daotoad

+1

@daotoad: Je suppose que c'est une question de savoir si vous pensez que vous pourriez vous éloigner de Moose, et dans quelle mesure vous faites confiance à chaque version de Moose pour qu'elle soit testée minutieusement. Il est assez commun pour divers refactorings de nécessiter de changer les tests unitaires, et puisque le processus d'installation de Moose est assez solide, à mon humble avis je voudrais juste tester l'existence des attributs et ensuite tester l'implémentation réelle de votre classe cela n'implique pas Moose). J'utilise des tests méta-spécifiques dans mon travail lorsque je teste une composition de rôle compliquée, où il est tout à fait possible qu'un attribut soit manquant. – Ether

5

Il est vraiment inutile de tester que les accesseurs ont été générés correctement. S'ils sont et non, vous le découvrirez très rapidement, car tout test réel que vous écrivez échouera. Moose lui-même teste que les accesseurs sont correctement générés, que les classes utilisatrices de Moose ont un constructeur et ainsi de suite. L'un des points d'utilisation des dépendances est que vous pouvez vous concentrer sur l'écriture et le test de votre application, et non sur le code d'assistance.

Je suis d'accord avec daotoad, ça vaut probablement la peine de tester les contraintes et coercitions que vous écrivez vous-même.

+0

C'est merveilleux! Merci à vous et au reste de l'équipe de Moose. –

+0

Je suis d'accord qu'il ne sert à rien d'écrire des tests qui récapitulent l'ensemble de tests exhaustifs de Moose, mais je maintiens ma suggestion de vérifier les accesseurs et les mutateurs. Je fais confiance à Moose pour faire ce que je lui dis de faire - Moose a toujours fait exactement ce que j'ai écrit. Cependant, je ne me fais pas confiance pour dire à Moose ce que je veux qu'il fasse. Il est assez facile de mettre 'rw' dans un attribut quand vous voulez vraiment' ro'. Ces tests devraient être aussi simples que possible - ils testent la spécification, pas la fonctionnalité. – daotoad

+2

J'ai écrit une [entrée de blog] (http://blog.urth.org/2010/02/the-purpose-of-automated-tests.html) sur ce sujet. –

1

Merci Dave, lecteur, Ether, Elliot et brian. En lisant vos réponses, commentaires et blogs, il semble y avoir deux points saillants:

(1) Aucun test n'est nécessaire pour s'assurer que Moose fait ce qu'il est censé faire. Je pense que tout le monde est d'accord sur ce point. (2) Tester des méthodes générées par Moose est approprié pour établir, tester et maintenir votre interface. La plupart sont d'accord sur ce point.

Encore une fois, merci à tous pour votre contribution.

EDIT:

Ceci est juste un résumé wiki communautaire. S'il vous plaît lire les réponses individuelles et les commentaires.