[JAVA] J'ai vérifié la bibliothèque "junit-quickcheck" qui peut effectuer des tests basés sur les propriétés avec JUnit.

supposition

Il est écrit sur la base de la version stable junit-quickcheck v0.7 du 17 février 2018.

Aperçu

«Propriétés» est une caractéristique du code qui renvoie une sortie spécifique lorsqu'une entrée spécifique est donnée. Par exemple, en supposant un code qui se décompose en facteurs premiers, il existe une caractéristique = "propriété" qu'un nombre égal ou supérieur à 2 et une liste de tous les nombres décomposés en facteurs premiers correspondent. (Exemple) Lorsque n = 36, le résultat de la factorisation des nombres premiers est 2, 2, 3, 3, et une fois multiplié, il devient 2 x 2 x 3 x 3 = 36, ce qui correspond au n d'origine.

Pour les tests utilisant cette propriété, il n'est pas réaliste de tester toutes les valeurs d'entrée n, donc junit-quickcheck peut générer aléatoirement des valeurs d'entrée n et effectuer le test.

Il semble qu'il ait été inspiré par Quickcheck de Haskell.

Exemple de code de factorisation prime

PrimeFactorsProperties.java


@RunWith(JUnitQuickcheck.class)
public class PrimeFactorsProperties {
	// 2 - Integer.MAX_Générer la valeur d'entrée n dans la plage jusqu'à VALUE (par défaut 100)
	@Property
	public void factorsMultiplyToOriginal(@InRange(min = "2", max = "2147483647") BigInteger n) {
		//La valeur d'entrée n est supérieure à 1
		assumeThat(n, greaterThan(BigInteger.valueOf(1)));

		//Multipliez les résultats de la factorisation prime
		BigInteger product = ONE;
		for (BigInteger each : PrimeFactors.of(n))
			product = product.multiply(each);

		//Le n original multiplié par le résultat des correspondances de factorisation prime
		System.out.println("n = " + n);
		assertEquals(n, product);
	}
}

production

n = 529647233
n = 1429992675
n = 1879932678
n = 1507927300
n = 1812653008
n = 393176714
n = 368739357
n = 1728382176
n = 607948744
n = 601709453
n = 1993428603

une fonction

Types pris en charge

Dans l'exemple ci-dessus, la valeur d'entrée est automatiquement générée pour le type BigInteger. La date, l'énumération, la chaîne, etc. sont également prises en charge. En définissant un générateur, vous pouvez également utiliser vos propres classes.

Personnalisez les valeurs générées automatiquement

Dans l'exemple ci-dessus, la plage de valeurs générées par @InRange est définie.

@When(satisfies = "#_ >= 0 && #_ <= 9") int digit) {

Il est également possible de définir avec OGNL comme.

Nombre de valeurs générées automatiquement

Par défaut, 100 valeurs sont générées, mais vous pouvez les modifier en définissant l'attribut trial.

@Property(trials = 250) public void northernHemisphere(

Graine auto-générée

Par défaut, différentes données d'entrée sont générées chaque fois que le test JUnit est exécuté, mais en donnant une valeur de départ, les mêmes données d'entrée seront générées quel que soit le nombre d'exécutions.

@Property public void holds(@When(seed = -1L) int i) {

Conclusion

Je pense que les tests basés sur les propriétés sont un complément aux tests traditionnels. En ce sens, il peut être utilisé comme un moyen d'améliorer la qualité.

Matériel de référence

Recommended Posts

J'ai vérifié la bibliothèque "junit-quickcheck" qui peut effectuer des tests basés sur les propriétés avec JUnit.
J'ai vérifié le nombre de taxis avec Ruby
Pourquoi puis-je utiliser la commande rails installée avec gem? ??
Quatre rangées avec gravité pouvant être jouées sur la console
J'ai essayé d'utiliser la bibliothèque CameraX avec Android Java Fragment
Puis-je essayer toutes les combinaisons avec une application comportant 20 cases à cocher?
J'ai vérifié car la réponse était étrange lors du débogage avec Tomcat 8
[Java] Je veux effectuer distinctement avec la clé dans l'objet