[JAVA] Ich habe die Bibliothek "junit-quickcheck" überprüft, die eigenschaftsbasierte Tests mit JUnit durchführen kann.

Annahme

Es basiert auf der stabilen Version junit-quickcheck v0.7 vom 17. Februar 2018.

Überblick

"Eigenschaften" ist ein Merkmal des Codes, der eine bestimmte Ausgabe zurückgibt, wenn eine bestimmte Eingabe gegeben wird. Unter der Annahme eines Codes, der in Primfaktoren zerlegt wird, gibt es beispielsweise ein Merkmal = "Eigenschaft", dass eine Zahl von 2 oder mehr und eine Liste aller Zahlen, die in Primfaktoren zerlegt wurden, übereinstimmen. (Beispiel) Wenn n = 36 ist, ist das Ergebnis der Primfaktorisierung 2, 2, 3, 3, und wenn es multipliziert wird, wird es 2 x 2 x 3 x 3 = 36, was dem ursprünglichen n entspricht.

Bei Tests mit dieser Eigenschaft ist es nicht realistisch, alle Eingabewerte n zu testen, sodass junit-quickcheck zufällig Eingabewerte n generieren und den Test durchführen kann.

Es scheint, dass es von Haskells Quickcheck inspiriert wurde.

Codebeispiel für die Primfaktorisierung

PrimeFactorsProperties.java


@RunWith(JUnitQuickcheck.class)
public class PrimeFactorsProperties {
	// 2 - Integer.MAX_Generieren Sie den Eingabewert n im Bereich bis VALUE (Standard 100).
	@Property
	public void factorsMultiplyToOriginal(@InRange(min = "2", max = "2147483647") BigInteger n) {
		//Der Eingabewert n ist größer als 1
		assumeThat(n, greaterThan(BigInteger.valueOf(1)));

		//Multiplizieren Sie die Ergebnisse der Primfaktorisierung
		BigInteger product = ONE;
		for (BigInteger each : PrimeFactors.of(n))
			product = product.multiply(each);

		//Das ursprüngliche n multipliziert mit dem Ergebnis der Primfaktorisierungsübereinstimmungen
		System.out.println("n = " + n);
		assertEquals(n, product);
	}
}

Ausgabe

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

Funktion

Unterstützte Typen

Im obigen Beispiel wird der Eingabewert automatisch für den BigInteger-Typ generiert. Datum, Aufzählung, Zeichenfolge usw. werden ebenfalls unterstützt. Durch Definieren eines Generators können Sie auch Ihre eigenen Klassen verwenden.

Passen Sie automatisch generierte Werte an

Im obigen Beispiel wird der von @InRange generierte Wertebereich festgelegt.

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

Es ist auch möglich, mit OGNL wie einzustellen.

Anzahl der automatisch generierten Werte

Standardmäßig werden 100 Werte generiert. Sie können diese jedoch ändern, indem Sie das Testattribut festlegen.

@Property(trials = 250) public void northernHemisphere(

Automatisch generierter Startwert

Standardmäßig werden bei jeder Ausführung des JUnit-Tests unterschiedliche Eingabedaten generiert. Durch Angabe eines Startwerts werden jedoch dieselben Eingabedaten generiert, unabhängig davon, wie oft sie ausgeführt werden.

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

Fazit

Ich denke, dass eigenschaftsbasierte Tests eine Ergänzung zu herkömmlichen Tests sind. In diesem Sinne kann es als Mittel zur Qualitätsverbesserung eingesetzt werden.

Referenzmaterial

Recommended Posts

Ich habe die Bibliothek "junit-quickcheck" überprüft, die eigenschaftsbasierte Tests mit JUnit durchführen kann.
Ich habe die Anzahl der Taxis mit Ruby überprüft
Warum kann ich den mit gem installierten Befehl Rails verwenden? ??
Vier Reihen mit Schwerkraft, die auf der Konsole gespielt werden können
Ich habe versucht, die CameraX-Bibliothek mit Android Java Fragment zu verwenden
Kann ich alle Kombinationen mit einer App mit 20 Kontrollkästchen ausprobieren?
Ich habe nachgesehen, weil die Antwort beim Debuggen mit Tomcat 8 seltsam war
[Java] Ich möchte mit dem Schlüssel im Objekt eindeutig arbeiten