6
votes

Quelle est la meilleure pratique lors de l'écriture de tests Perl qui impliquent le caractère aléatoire?

Tout en travaillant sur des mises à jour de mon module Liste :: Gen , i a décidé d'ajouter une méthode -> pick (num) , qui retournera une liste de dimensions num de la taille des éléments aléatoires de sa source. Pour tester cela, j'ai utilisé srand pour semer le générateur de nombres aléatoires et effectué plusieurs tests du formulaire: xxx

et tout fonctionnait bien sur la machine Windows i était à l'époque. Cependant, lorsque j'ai déplacé le projet sur un poste de travail MAC, tous les tests de randomneur ont échoué, car malgré la même graine aléatoire, rand produisait des résultats différents. Je suppose que cela vient de différentes implémentations de C sous-jacents de rand () .

La question est donc la meilleure plate-forme croisée pour tester ces fonctions? Devrais-je surcharger la fonction rand avec le mien? Devrais-je créer des crochets aux fonctions qui utilisent rand pour activer un mode "test" qui produit une sortie prédicable? Y a-t-il d'autres méthodes?

Je préférerais des réponses qui incluent les techniques de base de Perl, car j'essaie de maintenir l'arbre de dépendance du module petit.

test :: aléatoire et Test :: MockRandom semble être des suggestions de CPAN, est-ce que quelqu'un a une expérience avec ces modules?


1 commentaires

Test :: MockRandom vous permet de choisir la séquence de chiffres afin que vous soyez à l'abri des différences système. C'est la façon dont je suis allé la seule fois où j'avais besoin de la production aléatoire et que je voulais le tester.


4 Réponses :


2
votes

Je n'ai utilisé ni un.

On dirait que le test :: aléatoire serait un meilleur choix pour vous puisque vous n'utilisez apparemment que le hasard dans vos tests, pas dans votre code publié. Il devrait être beaucoup plus simple à utiliser.

Le test :: Module Mockrandom oblige la fonction RAND () pour renvoyer une séquence déterministe.


0 commentaires

0
votes

Vous pouvez exécuter quelques choix et vous assurer qu'ils ne renvoient pas tous la même chose. C'est le but de la fonction, après tout.


0 commentaires

0
votes

Je préfère simplement encapsuler la dépendance environnementale et la remplacer à des fins de test, un motif de test appelé Test Stub . Le talon de test couvre également d'autres entrées indirectes telles que le temps système et les poignées de fichier. Celles-ci devraient toutes être interprétées comme différentes formes de même problème, c'est pourquoi je pense que les solutions CPLAN à ce problème moins qu'on-super.

appliqué au domaine de numéro aléatoire, nous avons quelque chose comme: < PRE> XXX

Cela laisse le système sous test inchangé inchangé, à l'exception d'un refactoring, il devrait avoir de toute façon, mais fournit des points de contrôle pour injecter des données prévisibles dans le test. get_random_number ne sera pas couvert par des tests, il est donc essentiel qu'il soit écrit de manière à être correcte sur l'inspection; Un seul appel à la ressource système dépendante concerne tout ce qui devrait être là-bas.

Dans le cas de votre problème spécifique, vous devez facturer la dépendance sur rand out de Pick , puis remplace la méthode extraite dans une version testable de Liste :: Gen . Test :: mockobject :: s'étend est à peu près idéal à ce besoin.


0 commentaires

0
votes

Peut-être que la partie aléatoire n'a pas d'importance pour vos tests?

Les tests de passage peuvent vérifier les éléments suivants:

  1. a fait -> choisir (x) Retour x éléments?
  2. Tous les éléments X font partie de la liste $ SRC?
  3. test pour 0, 1, etc ...
  4. (peut-être?) Testez que deux différentes graines de SRAND renvoient différentes listes

    C'est essentiellement ce que vous faites déjà, puisque vous essayez de prendre Rand () de l'équation. Peut aussi bien aller tout le chemin et tester que votre fonction fait ce qu'elle dit sur l'étain.


0 commentaires