Entropy est une bibliothèque fournissant des outils permettant de travailler avec des tests aléatoires dans PHPUnit ainsi que de tester des systèmes utilisant les fonctions aléatoires de PHP telles que rand
et shuffle
.
Parfois, les tests unitaires nécessitent des modifications de l'état global ou couvrent des fonctionnalités qui modifient cet état. Bien que ce ne soit jamais une situation idéale, cela peut souvent entraîner la création de dépendances involontaires sur d'autres tests.
L'activation de la fonctionnalité de brassage des tests d'Entropy rend aléatoire l'ordre de vos tests, aidant ainsi à mettre en évidence ces dépendances.
Le brassage des tests d'Entropy évite également de modifier l'ordre des tests à l'aide de la fonctionnalité @depends
de PHPUnit ; les travaux futurs veilleront à garantir que le brassage peut toujours avoir lieu pour ces tests, le cas échéant.
Parfois, vous pouvez vous retrouver dans une situation où la gamme d’entrées pour une fonction est si large que prendre un échantillon représentatif de ces entrées constitue une utilisation plus efficace de vos ressources. Mais que se passe-t-il si cette section comporte des trous où vos tests pourraient échouer ?
Une façon de contourner ce problème consiste à utiliser des entrées aléatoires, où les entrées sont générées de manière à obtenir une section transversale aléatoire des plages. En d’autres termes, en utilisant rand
ou une autre approche non déterministe de ce type.
Une extension de ce test, basé sur les propriétés, consiste à appliquer une entrée aléatoire à votre application ou fonction et à observer que la sortie adhère à certaines règles ou possède certaines propriétés par rapport à l'entrée, plutôt que de tester précisément l'égalité par rapport à un résultat connu. ensemble.
En gérant la graine aléatoire de vos tests, Entropy permet non seulement d'utiliser ces approches, mais également de les rendre reproductibles, soit en acceptant une graine fixe, soit en la récupérant de la dernière exécution échouée jusqu'à ce que votre suite de tests réussisse.
Vous pouvez ajouter cette bibliothèque à votre projet à l'aide de Composer :
$ composer require datto/phpunit-entropy
Une fois configuré, vous pouvez exécuter votre suite de tests normalement ; l'auditeur prendra soin de lui-même. En cas d'erreur ou d'échec du test, la graine utilisée sera stockée dans un fichier temporaire, de sorte qu'à la prochaine exécution, elle sera réutilisée, plutôt qu'une nouvelle graine générée.
La graine du générateur de nombres aléatoires est fournie à partir de quatre emplacements maximum, présentés ici par ordre de priorité.
Si elle est définie, la variable d'environnement SEED
sera utilisée pour remplacer tout autre paramètre. Il peut être défini via export
, mais il est recommandé de le définir uniquement pour l'exécution en cours :
SEED=123456 phpunit -c phpunit.xml tests
La graine peut être corrigée par configuration ; voir la section Configuration ci-dessous.
Si un test échoue, la graine utilisée est stockée dans un fichier temporaire. Celui-ci est ensuite chargé lors d'un test ultérieur et persistera jusqu'à ce que la suite réussisse à nouveau.
Si aucune graine n'est définie via les méthodes ci-dessus, la méthode finale consiste à utiliser la fonction rand
de PHP.
Une fois installé via composer, la configuration de l'écouteur de test consiste simplement à modifier votre fichier de configuration PHPUnit (souvent phpunit.xml
) :
< phpunit xmlns : xsi = " http://www.w3.org/2001/XMLSchema-instance "
xsi : noNamespaceSchemaLocation = " http://schema.phpunit.de/4.1/phpunit.xsd "
backupGlobals = " false "
colors = " true "
bootstrap = " bootstrap.php "
>
< listeners >
< listener class = " DattoPHPUnitEntropyListener " >
< arguments >
< array >
< element key = " seeding " >
< array >
< element key = " enabled " >
< boolean >true</ boolean >
</ element >
< element key = " seed " >
< integer >1234567</ integer >
</ element >
< element key = " file " >
< string >/tmp/phpentropy-seed</ string >
</ element >
</ array >
</ element >
< element key = " shuffle " >
< boolean >true</ boolean >
</ element >
</ array >
</ arguments >
</ listener >
</ listeners >
</ phpunit >
S'il est défini sur true, le générateur de nombres aléatoires sera généré par l'auditeur.
Si vous définissez la graine via cet argument, seule cette valeur sera utilisée pour amorcer le générateur de nombres aléatoires. Voir la section sur la priorité des semences ci-dessous.
S'il est défini, ce fichier sera utilisé pour stocker la dernière graine aléatoire ayant échoué ; la valeur par défaut est [TMPDIR LOCATION]/phpunit-entropy-seed
.
S'il est défini sur true, l'ordre dans lequel les tests unitaires sont exécutés sera aléatoire (sauf pour les suites où @depends
est utilisé). Ceci est utile pour déterminer et identifier les dépendances inter-tests.
Christophe Hoult <[email protected]>