Écrire un test Unitaire pour un générateur de nombre aléatoire
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;
}
Comment pourrais-je écrire un test Unitaire pour cela? Pour l'instant j'ai mis l'appel en boucle de sorte qu'il s'exécute 1000 fois et échoue le test si
- le nombre est inférieur à 0
- le nombre est de plus de 10
Comment puis-je vérifier que tous les numéros ne sont pas les mêmes, c'est à dire
Exécuter plusieurs fois (en millions de dollars), compter le nombre d'occurences de chaque numéro et de décider si elle est suffisamment aléatoire pour vous. Voir par exemple: en.wikipedia.org/wiki/Statistical_randomness
Vous voulez probablement quelque chose qui se rapproche d'une distribution uniforme. Ce n'est pas quelque chose que vous pouvez facilement "test" avec des tests unitaires, plutôt que qu'il serait probablement plus facile (et sans doute le plus utile), pour prouver que votre RNG produit une distribution uniforme de la plage que vous voulez..
Je ne le ferais pas. C'est le test unitaire devenu fou. La forme du code garantit le résultat. Vous n'avez pas à tester bibliothèque d'Api, ou de multiplication par dix.
Double Possible de le Test d'une méthode produisant un résultat aléatoire
Vous voulez probablement quelque chose qui se rapproche d'une distribution uniforme. Ce n'est pas quelque chose que vous pouvez facilement "test" avec des tests unitaires, plutôt que qu'il serait probablement plus facile (et sans doute le plus utile), pour prouver que votre RNG produit une distribution uniforme de la plage que vous voulez..
Je ne le ferais pas. C'est le test unitaire devenu fou. La forme du code garantit le résultat. Vous n'avez pas à tester bibliothèque d'Api, ou de multiplication par dix.
Double Possible de le Test d'une méthode produisant un résultat aléatoire
OriginalL'auteur Carrie Hall | 2013-02-11
Vous devez vous connecter pour publier un commentaire.
Le caractère aléatoire des tests sont potentiellement complexes. par exemple, dans le ci-dessus ne vous voulez simplement vous assurer d'obtenir un nombre entre 1 et 10 ? Voulez-vous assurer une distribution uniforme etc.? À un certain stade, je voudrais suggérer que vous voulez faire confiance
Math.random()
et simplement vous assurer que vous n'avez pas foiré les limites/plage, qui est essentiellement ce que vous faites.OriginalL'auteur Brian Agnew
Ma réponse était déjà faussée, j'avais besoin de retourner un nombre de 0 à 10, mais mon post n'a retourné une gamme de 0 à 9! Voici comment je l'ai trouvé...
Boucle 100 fois et assurez-vous que la plage est correcte, il devrait être de 0 à 10 (même si j'ai mis 10 en tant que variable de sorte que le code peut être réutilisé).
Aussi j'magasin le plus élevé et le plus faible des valeurs qui ont été trouvés au cours de la boucle, et ils devrait être aux deux extrémités de l'échelle.
Si les plus hautes et les plus faibles valeurs sont les mêmes, alors que c'est un indicateur que quelqu'un a truqué un nombre aléatoire de retour.
Le seul problème que je vois est qu'il est possible d'avoir un faux négatif à partir de ce test, mais il est peu probable.
OriginalL'auteur Carrie Hall
Vous voulez tester votre code, pas la qualité de la Java fourni de Mathématiques.random(). Assumer la Java de la méthode est bonne. Tous les tests sont des conditions nécessaires mais pas suffisantes pour l'exactitude. Afin de choisir quelques tests qui permettront de découvrir probablement des erreurs de programmation dans l'utilisation de Java fourni méthode.
Vous pouvez faire le test suivant: Finalement, après une succession d'appels, la fonction renvoie la chacun des chiffres au moins une fois, sans retour à tous les numéros de la plage requise.
OriginalL'auteur Raedwald