Cet article est l'article du 14ème jour du Calendrier de l'Avent Python 2015.
Une méthode qui renvoie une valeur aléatoire peut être testée, comme l'échec du test si les résultats s'écartent d'un certain montant du résultat attendu. J'ai écrit un programme en me demandant s'il pouvait être testé statistiquement.
Test unitaire une méthode qui renvoie une valeur aléatoire à l'aide du test du chi carré.
Par exemple, si vous écrivez un programme qui lance un dé et renvoie 1 à 6 au hasard, ce sera comme suit.
dice.py
# -*- coding: utf-8 -*-
import random
class Dice(object):
def throw(self):
return random.randint(1, 6)
Le code pour tester cela ressemble à ceci:
test_dice.py
# -*- coding: utf-8 -*-
import collections
import unittest
import dice
from scipy import stats
class TestDice(unittest.TestCase):
def setUp(self):
self.__target = dice.Dice()
def test_throw(self):
#Exécutez 6000 fois
result = [self.__target.throw() for n in range(0, 6000)]
#Agrégation des résultats d'exécution
counted = collections.Counter(result)
#Vérifiez s'il y a des yeux irréguliers
self.assertItemsEqual([1, 2, 3, 4, 5, 6], counted.keys())
#Effectuer un test du chi carré, niveau de signification 1%Si l'hypothèse nulle selon laquelle il n'y a pas de biais peut être rejetée, le test échoue.
#Environ 1000 yeux devraient apparaître, et s'il y a un écart significatif par rapport à cela, cela échouera.
chi_square_value, p_value = stats.chisquare(
[counted[1], counted[2], counted[3], counted[4], counted[5], counted[6]],
f_exp=[1000, 1000, 1000, 1000, 1000, 1000]
)
self.assertLess(0.01, p_value)
Le module stats
de scipy
est requis, donc s'il n'est pas installé, installez-le avec pip
.
$ pip install numpy
$ pip install scipy
Exécutez-le un nombre spécifique de fois (6000 fois cette fois) et agrégez les résultats de l'exécution. Par exemple, le 1er œil est 1007 fois, le 2ème œil 1050 fois, et ainsi de suite.
Est-il possible de tester la différence entre le nombre total de fois et la valeur théorique, et dans ce cas, 1000 fois pour chaque jet, et de rejeter l'hypothèse nulle que "le nombre de fois que les dés lancent est le même"? Découvrir.
Si l'hypothèse nulle peut être rejetée, cela signifie que le résultat n'est pas celui que vous attendiez et le test échouera. Au contraire, s'il ne peut pas être rejeté, le test est réussi.
Même les tests statistiques échoueront toujours si vous n'êtes pas chanceux, il peut donc être difficile de fonctionner.
Abaisser le niveau de signification réduit le nombre de modèles dans lesquels le test échoue même s'il est en fait correct, mais au contraire, le test n'échoue pas avec un léger écart, de sorte que le nombre de 1 était en fait légèrement plus élevé que les autres. Peut ne pas être détecté.
Inversement, l'augmentation du niveau de signification augmente le modèle d'échecs de test qui sont réellement corrects. Cependant, même de petits écarts peuvent être détectés.
Les tests avec trop d'échecs ne seront pas considérés comme d'habitude, donc je pense qu'il est préférable de le faire avec un niveau de signification faible lors de son fonctionnement.
Recommended Posts