7
votes

Écrire un test Junit pour un générateur de nombres aléatoires

J'ai une méthode qui retourne un nombre aléatoire entre 0 et 10.

public int roll(){
    int pinsKnockedDown = (int) (Math.random() * 10);
    return pinsKnockedDown;
}


4 commentaires

Exécutez-le plusieurs fois (des millions), comptez le nombre de searys de chaque numéro et décidez s'il est suffisamment aléatoire pour vous. Voir par exemple: en.wikipedia.org/wiki/statistical_randomness


Vous voulez probablement quelque chose qui approche une distribution uniforme. Ce n'est pas quelque chose que vous pouvez facilement "tester" avec des tests unitaires, plutôt que cela serait probablement plus facile (et sans doute plus utile) de prouver que votre RNG produit une distribution uniforme pour la gamme que vous souhaitez ..


Je ne le ferais pas. C'est un test unitaire devenu fou. La forme du code garantit le résultat. Vous n'avez pas à tester les API de la bibliothèque ou la multiplication de dix.


Dupliqué possible de Test une méthode produisant un résultat aléatoire


3 Réponses :


3
votes

Les tests de randomneur sont potentiellement complexes. par exemple. Dans ce qui précède, vous voulez simplement vous assurer d'obtenir des chiffres compris entre 1 et 10? Voulez-vous assurer une distribution uniforme, etc.? À un moment donné, je suggérerais que vous souhaitiez avoir confiance math.random () et assurez-vous simplement que vous n'avez pas foiré les limites / gammes, ce qui est essentiellement ce que vous faites.


0 commentaires

3
votes

Ma réponse était déjà imparfaite, j'avais besoin de retourner un numéro de 0 à 10 mais mon message d'origine n'a enregistré qu'une gamme de 0 à 9! Voici comment j'ai trouvé cela ...

boucle 100K fois et assurez-vous que la plage est correcte, elle devrait être 0-10 (bien que j'ai défini 10 comme variable de sorte que le code puisse être réutilisé. ).

aussi je stocke les valeurs les plus élevées et les plus basses trouvées lors de la boucle et elles doivent être à l'extrême extrémité de la balance.

si Les valeurs les plus élevées et les plus basses sont identiques alors c'est un indicateur que quelqu'un a simulé un retour aléatoire.

Le seul problème que je vois est qu'il est possible d'avoir un faux négatif de ce test, mais il est peu probable. xxx


1 commentaires

Suite à cela - j'ai fini par changer de code de code complètement et utilisé des données de test pour que mon code soit correct plutôt que de tester contre le générateur aléatoire.



1
votes

Vous voulez tester votre code et non la qualité de la Java fournie math.random (). Supposons que la méthode Java est bonne. Tous les tests sont nécessaires mais pas suffisamment de conditions pour l'exactitude. Alors choisissez des tests qui découvriront des erreurs de programmation probables d'utilisation de la méthode fournie Java.

Vous pouvez tester ce qui suit: finalement, après une succession d'appels, la fonction renvoie chaque chiffre au moins une fois, sans renvoyer aucun chiffre de la plage requise.


0 commentaires