Ich wollte JUnit schon immer für die Ausbildung von Neulingen vorstellen, aber dies ist ein enttäuschender Artikel, den ich aufgegeben habe, weil er beim Schreiben eines Entwurfs ein wenig umfangreicher wurde. Es ist eine Verschwendung, es so wegzuwerfen, wie es ist, also ist das Unternehmen auch in den Sommerferien und für Neuankömmlinge.
JUnit ist ein Tool, das häufig für Unit-Tests verwendet wird. JUnit ist eine Software, mit der Sie die Methode jederzeit ausführen können, indem Sie eine Klasse mit einer Methode erstellen, die beschreibt, wie sie verwendet und überprüft wird. Schreiben Sie beim Ausführen von JUnit Klassen und Methoden gemäß dem JUnit-Stil.
Der Grundfluss von JUnit ist
Wird sein.
Angenommen, Sie haben eine Warenkorbklasse ("Warenkorb"). Angenommen, Sie haben eine Methode namens "getSum ()", die den Gesamtpreis ermittelt, der den Preis und die Menge aller Artikel in Ihrem Warenkorb widerspiegelt. Die Verwendung ist wie folgt.
Cart cart = new Cart();
cart.add(Produkt,Menge);
int result = cart.getSum(); //Sie können den aktuellen Gesamtbetrag im Warenkorb abrufen
assertEquals(Betrag, der hätte sein sollen, result); //Überprüfen Sie, ob der erworbene Betrag dem erwarteten Betrag entspricht
** assertEquals
ist Teil der Validierung. ** ** **
** Wenn die Argumente hier unterschiedlich sind, endet der Testprozess dort. ** ** **
** Der Test wird ebenfalls "fehlgeschlagen". Wenn Sie assertEquals
bestehen und bis zum Ende gehen, ist der Test erfolgreich
. ** ** **
Sie können mehr als ein assertEquals
schreiben. Wenn Sie beispielsweise mehrere Parameter im Konstruktortest festlegen und prüfen möchten, ob sie richtig eingestellt sind, sieht dies wie folgt aus.
Product apple = new Product("Apfel", 400); // appleという変数にApfelという商品名と400円を設定している
assertEquals("Apfel", apple.getName()); //Überprüfen Sie, ob der Name richtig eingestellt wurde
assertEquals(400, apple.getPrice()); //Überprüfen Sie, ob der Preis richtig eingestellt wurde
Es ist wie es ist. Der Test ist erfolgreich, wenn Sie die beiden "assertEquals" bestehen.
Die folgenden ** Klassen sind die zu testenden Klassen **.
Product.java
public class Product {
private String productId; //Artikelnummer
private String productName; //Produktname
private Integer price; //Preis
// getter
public String getProductId() { return productId; }
public String getProductName() { return productName; }
public Integer getPrice() { return price; }
//Konstrukteur
public Product(String Artikelnummer,Zeichenfolge Produktname,Ganzzahliger Preis) { /*Legen Sie die obigen Eigenschaften fest*/ }
}
Cart.Java
public class Cart {
//Eigentum
private List<Product> list; //Produkte enthalten und ihre Anzahl
//Methode
/**
*Führen Sie den Vorgang zum Hinzufügen eines Produkts durch
*/
public void add(Produkt Produkt) { /*Abkürzung*/ }
/**
*Verarbeitung zur Rücksendung der enthaltenen Produkte und deren Menge
*/
public List<Product> getList() { /*Abkürzung*/ }
/**
*Verarbeitung zur Rückgabe der Gesamtsumme der enthaltenen Produkte
*/
public int getSum() { /*Abkürzung*/ }
}
Product.java
public class Product {
private String productId; //Artikelnummer
private String productName; //Produktname
private Integer price; //Preis
public Product(String productId, String productName, Integer price) {
this.productId = productId;
this.productName = productName;
this.price = price;
}
public String getProductId() {
return productId;
}
public String getProductName() {
return productName;
}
public Integer getPrice() {
return price;
}
}
Cart.java
import java.util.List;
import java.util.ArrayList;
public class Cart {
//Eigentum
private List<Product> list; //Produkte enthalten und ihre Anzahl
public Cart() {
this.list = new ArrayList<Product>();
}
//Methode
/**
*Führen Sie den Vorgang zum Hinzufügen eines Produkts durch
*/
public void add(Product product) {
this.list.add(product);
}
/**
*Verarbeitung zur Rücksendung der enthaltenen Produkte und deren Menge
*/
public List<Product> getList() {
return this.list;
}
/**
*Verarbeitung zur Rückgabe der Gesamtsumme der enthaltenen Produkte
*/
public int getSum() {
int sum = 0;
for (Product p: this.list) {
sum += p.getPrice();
}
return sum;
}
}
Hier möchte ich testen hinzufügen. In diesem Fall dachte ich über den folgenden Ablauf nach
Wie benutzt man 0. Erstellen Sie ein Produkt, das Sie dem Warenkorb hinzufügen möchten
Um zu überprüfen, ob das Hinzufügen mit der obigen Verwendung korrekt ist, habe ich Folgendes gedacht (** Hinweis: Dies ist ein Beispiel. Es ist nicht immer erforderlich, den folgenden Test mit einem ähnlichen Test durchzuführen **). 0. Entfernen Sie die Liste aus dem Warenkorb (dies ist ein vorbereitender Schritt und führt nicht zum Test)
Der obige Testcode würde so aussehen
// 0.Erstellen Sie ein Produkt, das Sie dem Warenkorb hinzufügen möchten
Product apple = new Product("A001", "Apfel", 158);
Product orange = new Product("A002", "Orange", 258);
// 1.Erstellen Sie einen Warenkorb
Cart cart = new Cart();
//Artikel im Warenkorb(Apfel und Orange)Hinzufügen
cart.add(apple);
cart.add(orange);
//Überprüfen Sie von hier aus
// 0.Entfernen Sie die Liste aus dem Warenkorb
List<Product> list = cart.getList(); //Holen Sie sich die Liste in den Warenkorb
// 1.Die Anzahl der Artikel in der Liste, die dem Warenkorb hinzugefügt wurden(2 Stücke)Überprüfen Sie, ob es dasselbe ist wie
assertEquals(2, list.size());
// 2.Überprüfen Sie in der Reihenfolge, ob die Artikel im Warenkorb korrekt sind
Product item;
// 2.1 Überprüfen Sie, ob das erste Produkt mit dem von Apple definierten übereinstimmt
item= list.get(0); //Nehmen Sie den ersten Artikel in den Warenkorb
assertEquals("A001", item.getProductId()); //Überprüfung der Produkt-ID des extrahierten Produkts
assertEquals("Apfel", item.getProductName()); //Überprüfung des Produktnamens des extrahierten Produkts
assertEquals((Integer)158, item.getPrice()); //Überprüfung des Produktnamens des extrahierten Produkts
// 2.1 Überprüfen Sie, ob das zweite Produkt mit dem in Orange definierten übereinstimmt
item = list.get(1); //Nehmen Sie den zweiten Artikel in den Warenkorb und beginnen Sie mit der Überprüfung
assertEquals("A002", item.getProductId()); //Überprüfung der Produkt-ID des extrahierten Produkts
assertEquals("Orange", item.getProductName()); //Überprüfung des Produktnamens des extrahierten Produkts
assertEquals((Integer)258, item.getPrice()); //Überprüfung des Produktnamens des extrahierten Produkts
Übrigens kann der mit "A001" usw. geschriebene Teil als "apple.getProductName ()" verwendet werden.
Wie ich am Anfang schrieb, ist der Fluss von JUnit
Ist das Grundlegende. Die Validierung wird mit einer Methode validiert, die mit "assert" beginnt, z. B. "assertEquals". Und ** assertEquals schlägt fehl **, wenn beide Argumente nicht identisch sind und keine weitere Verarbeitung erfolgt **.
Zum Beispiel
assertEquals (" apple ", item.getProductName ());
Wenn "Apfel" zu "Apfel" wird, ist dies ein Fehler, und danach
assertEquals((Integer)158, item.getPrice());
Usw. wird nicht implementiert.
Und wenn alle Assert Equals bestanden sind und der Prozess bis zum Ende fortschreitet, wird es ein Erfolg.
Schreiben Sie außerdem * assertXXX (erwarten, tatsächlich)
in der Reihenfolge des korrekten Werts und Testwerts *.
Obwohl es für Eclipse bearbeitet wurde, ist das Original pleiades. Übrigens war ich allein damit erschöpft ... Wenn Sie die Energie haben, werde ich eines Tages VS-Code usw. hinzufügen. Gehen Sie beim Ausführen von JUnit in Eclipse wie folgt vor:
Wählen Sie Menü Datei → Neu → Quellordner.
Geben Sie im nächsten Bildschirm unter "Ordnername:" "test" ein und klicken Sie auf "Fertig stellen".
Klicken Sie mit der rechten Maustaste auf den Testordner, den Sie gerade überprüft oder erstellt haben, und wählen Sie Neu> Andere.
Ein neuer Bildschirm wird angezeigt. Wählen Sie "Java" -> "JUnit" -> "JUnit Test Case" und dann "Next". Alternativ können Sie "junit" in das Assistentenfeld oben auf dem neuen Bildschirm eingeben. Wählen Sie "JUnit Test Case" aus den verbleibenden und dann "Next".
Der nächste hängt von JUnit 3, 4 oder 5 ab. Verwenden Sie 4 oder 5, wenn Sie keine Bedenken hinsichtlich der Ausbildung von Neulingen haben. Wählen Sie 3, wenn Sie sich in einer enttäuschenden Situation befinden, in der Sie 3 zugewiesen sind. Leider werden 5 in 4 enthalten sein. Ich hatte nicht genug Zeit ...
Es gibt zunächst keine Bibliothek für JUnit3, daher werden Sie gefragt, ob Sie sie hinzufügen möchten. Wählen Sie "Nächste Aktion ausführen", wählen Sie "JUnit 3-Bibliothek zum Erstellen eines Pfads hinzufügen" und drücken Sie OK.
CartTest.java
package myStore;
import junit.framework.TestCase;
import java.util.List;
public class CartTest extends TestCase {
public void test Überprüfen Sie, ob es dem Warenkorb hinzugefügt wurde() {
//Stellen Sie zuerst die Produkte her, die für den Test eingeführt werden sollen
Product apple = new Product("A001", "Apfel", 158);
Product orange = new Product("A002", "Orange", 258);
//Warenkorb erstellen
Cart cart = new Cart();
//Fügen Sie Äpfel und Orangen hinzu
cart.add(apple);
cart.add(orange);
//Überprüfen Sie von hier aus
List<Product> list = cart.getList(); //Holen Sie sich die Liste in den Warenkorb
//Überprüfen Sie, ob der Einkaufswagen zwei enthält
assertEquals(2, list.size());
//Überprüfen Sie, ob der Inhalt des Warenkorbs korrekt ist
Product item;
item= list.get(0); //Nehmen Sie den ersten Artikel in den Warenkorb und beginnen Sie mit der Überprüfung
assertEquals("Überprüfung, ob die erste Produkt-ID im Warenkorb A001 lautet", "A001", item.getProductId());
assertEquals("Überprüfung, ob der erste Produktname im Warenkorb Apfel ist", "Apfel", item.getProductName());
assertEquals("Überprüfung, ob der erste Preis des Wagens 158 beträgt", (Integer)158, item.getPrice());
item = list.get(1); //Nehmen Sie den zweiten Artikel in den Warenkorb und beginnen Sie mit der Überprüfung
assertEquals("Überprüfung, ob die erste Produkt-ID im Warenkorb A002 lautet", "A002", item.getProductId());
assertEquals("Überprüfen Sie, ob der erste Produktname im Warenkorb orange ist", "Orange", item.getProductName());
assertEquals("Überprüfung, dass der erste Preis des Wagens 258 beträgt", (Integer)258, item.getPrice());
}
}
Die Versprechen von JUnit 3 lauten wie folgt.
--Schreibe import junit.framework.TestCase;
Erstellen Sie nach den oben genannten Regeln. Sie können so viele Testmethoden erstellen, wie Sie möchten, indem Sie mit "Test" beginnen. Erstellen Sie daher bitte Tests mit verschiedenen Mustern. Außerdem enthält der Methodenname Japanisch, was für Java kein Problem darstellt (kein Problem in Bezug auf die Spezifikationen). In JUnit wird häufig Japanisch verwendet, um zu verstehen, welcher Test durchgeführt wird [^ 1]. Ist das nicht einfacher zu verstehen als "testNo1" zu schreiben?
Möglicherweise stellen Sie auch fest, dass das erste Argument von assertEquals eine Zeichenfolge enthält, stellen Sie sich dies jedoch als Kommentar vor. Wenn Sie dies verlassen, wird dieses erste Argument beim Testen mit JUnit als Meldung angezeigt und Sie können sehen, was der beabsichtigte Test fehlgeschlagen ist.
[^ 1]: Wenn jedoch ein Raum mit halber Breite vorhanden ist, tritt ein Fehler auf. Wählen Sie daher ein Wort aus, das den Test in einem Wort ausdrücken kann.
Es gibt zunächst keine Bibliothek für JUnit 4, daher werden Sie gefragt, ob Sie sie hinzufügen möchten. Wählen Sie "Nächste Aktion ausführen", wählen Sie "JUnit 4-Bibliothek zum Erstellen eines Pfads hinzufügen" und drücken Sie OK.
CartTest2.java
package myStore;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import java.util.List;
import org.junit.Test;
public class CartTest {
@Test
public void Überprüfen Sie, ob es dem Warenkorb hinzugefügt wurde() {
//Stellen Sie zuerst die Produkte her, die für den Test eingeführt werden sollen
Product apple = new Product("A001", "Apfel", 158);
Product orange = new Product("A002", "Orange", 258);
//Warenkorb erstellen
Cart cart = new Cart();
//Fügen Sie Äpfel und Orangen hinzu
cart.add(apple);
cart.add(orange);
//Überprüfen Sie von hier aus
List<Product> list = cart.getList(); //Holen Sie sich die Liste in den Warenkorb
//Überprüfen Sie, ob der Einkaufswagen zwei enthält
assertEquals(2, list.size());
//Überprüfen Sie, ob der Inhalt des Warenkorbs korrekt ist
Product item;
item= list.get(0); //Nehmen Sie den ersten Artikel in den Warenkorb
assertThat(item.getProductId(), is("A001")); //Überprüfung der Produkt-ID des extrahierten Produkts
assertThat(item.getProductName(), is("Apfel")); //Überprüfung des Produktnamens des extrahierten Produkts
assertThat(item.getPrice(), is(158)); //Überprüfung des Produktnamens des extrahierten Produkts
item = list.get(1); //Nehmen Sie den zweiten Artikel in den Warenkorb und beginnen Sie mit der Überprüfung
assertThat(item.getProductId(), is("A002")); //Überprüfung der Produkt-ID des extrahierten Produkts
assertThat(item.getProductName(), is("Orange")); //Überprüfung des Produktnamens des extrahierten Produkts
assertThat(item.getPrice(), is(258)); //Überprüfung des Produktnamens des extrahierten Produkts
}
}
Die Versprechen von JUnit 4 lauten wie folgt.
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import org.junit.Test;
Erstellen Sie nach den oben genannten Regeln. Sie können beliebig viele Testmethoden erstellen, indem Sie "@ Test" hinzufügen. Erstellen Sie daher Tests mit verschiedenen Mustern. Außerdem enthält der Methodenname Japanisch, was für Java kein Problem darstellt (kein Problem in Bezug auf die Spezifikationen). In JUnit wird häufig Japanisch verwendet, um zu verstehen, welcher Test durchgeführt wird [^ 1]. Ist das nicht einfacher zu verstehen als "testNo1" zu schreiben?
Möglicherweise stellen Sie auch fest, dass das erste Argument von assertEquals eine Zeichenfolge enthält, stellen Sie sich dies jedoch als Kommentar vor. Wenn Sie dies verlassen, wird dieses erste Argument beim Testen mit JUnit als Meldung angezeigt und Sie können sehen, was der beabsichtigte Test fehlgeschlagen ist.
CartTest.java
package myStore;
import static org.junit.Assert.*;
import org.junit.Test;
import java.util.List;
public class CartTest {
@Test
public void Überprüfen Sie, ob es dem Warenkorb hinzugefügt wurde() {
//Stellen Sie zuerst die Produkte her, die für den Test eingeführt werden sollen
Product apple = new Product("A001", "Apfel", 158);
Product orange = new Product("A002", "Orange", 258);
//Warenkorb erstellen
Cart cart = new Cart();
//Fügen Sie Äpfel und Orangen hinzu
cart.add(apple);
cart.add(orange);
//Überprüfen Sie von hier aus
List<Product> list = cart.getList(); //Holen Sie sich die Liste in den Warenkorb
//Überprüfen Sie, ob der Einkaufswagen zwei enthält
assertEquals(2, list.size());
//Überprüfen Sie, ob der Inhalt des Warenkorbs korrekt ist
Product item;
item= list.get(0); //Nehmen Sie den ersten Artikel in den Warenkorb und beginnen Sie mit der Überprüfung
assertEquals("Überprüfung, ob die erste Produkt-ID im Warenkorb A001 lautet", "A001", item.getProductId());
assertEquals("Überprüfung, ob der erste Produktname im Warenkorb Apfel ist", "Apfel", item.getProductName());
assertEquals("Überprüfung, ob der erste Preis des Wagens 158 beträgt", (Integer)158, item.getPrice());
item = list.get(1); //Nehmen Sie den zweiten Artikel in den Warenkorb und beginnen Sie mit der Überprüfung
assertEquals("Überprüfung, ob die zweite Produkt-ID im Warenkorb A002 lautet", "A002", item.getProductId());
assertEquals("Überprüfen Sie, ob der zweite Produktname des Warenkorbs orange ist", "Orange", item.getProductName());
assertEquals("Überprüfung, dass der zweite Preis des Wagens 258 beträgt", (Integer)258, item.getPrice());
}
}
Ich habe in den frühen Stadien assertEquals
verwendet, daher hier ein zusätzlicher Kurs.
In JUnit 4 können Sie wie folgt schreiben. Von nun an wird dies die Hauptsache sein.
assertThat( target, is("target") );
Es ist fast dasselbe wie "assertEquals", aber es hat den großen Vorteil, von links nach rechts lesen zu können. Es ist wie zu behaupten, dass das Ziel "Ziel" ist (stellen Sie sicher, dass das Ziel "Ziel" ist).
Sie können auch so schreiben. is
und not
heißen Matcher.
assertThat( target, is( not( "not target") ) )
Referenz: Java Master - Einführung in die grundlegende Verwendung von JUnit Verwendung von JUnit (Anfänger)
Führen Sie den erstellten Testfall aus. Wählen Sie Menü Ausführen → Ausführen → Einheitentest.
Dann erscheint irgendwo auf dem Bildschirm der folgende Bildschirm.
Klicken Sie nun auf das Dreieck links von myStore.CartTest. Sie können unten sehen, welchen Test Sie durchgeführt haben. Erfolgreiche Tests werden grün und fehlgeschlagene Tests rot angezeigt.
Übrigens, ändern wir "A001" in der 28. Zeile des Testprogramms in "A003" und versuchen es erneut. Sie können mit der rechten Maustaste klicken, um es auf die gleiche Weise wie zuvor auszuführen. Wenn Sie jedoch eine JUnit-Ansicht haben, können Sie es erneut ausführen, indem Sie auf "Test erneut ausführen" (rote Linie) klicken.
Da die Datei durch Ändern von "A001" in "A003" geändert wurde, wird ein Dialogfeld angezeigt, in dem Sie gefragt werden, ob Sie sie speichern möchten. Wenn kein Problem vorliegt, drücken Sie "OK". Wenn Sie das Kontrollkästchen neben dem Dateinamen deaktivieren, wird das Programm ausgeführt, bevor die Datei gespeichert wird.
Anschließend wird links unten im Symbol ein Ultramarin-Kreuz angebracht. Dies ist ein Zeichen des Scheiterns. Klicken Sie dann auf den fehlgeschlagenen Test, um zu sehen, wo er im Testfall fehlgeschlagen ist. Doppelklicken Sie darauf, um die betreffende Zeile anzuzeigen.
Wenn Sie hinter das "junit.framework.ComparisonFailure:" der Fehlerverfolgung schauen, sehen Sie in den Details des Fehlers die Beschreibung "Es gibt eine Bestätigung, dass die erste Produkt-ID des Warenkorbs A001 lautet". .. Außerdem wird der korrekte Wert in "Erwartet: ist" und der tatsächliche Wert (Ausführungsergebnis) in "aber: war" angezeigt.
Nun, es ist eine lange Geschichte, aber das war's.
JUnit schrieb, dass Ausführung und Überprüfung zwei wichtige Dinge sind. Von diesen möchte ich auf die Überprüfung eingehen. Hier ist es super kompliziert, also kannst du es überspringen. Bei der Validierung wird überprüft, ob der Wert des Ergebnisses des Laufs mit dem erwarteten Ergebnis übereinstimmt. Es gibt jedoch Kontroversen darüber, was validiert werden soll. Es mag eine eindeutige richtige Antwort geben, aber ich weiß es nicht (ich kenne @ t_wada-san ...).
Angenommen, Sie haben die folgende Klasse.
SomeClass.java
class SomeClass {
private String somethingvalue = "";
public void setSomethingValue(String somethingvalue) {
this.somethingvalue = somethingvalue;
}
}
Diese Klasse kann nur Daten für zukünftige Erweiterungen speichern. Es gibt einen "setSomethingValue", der die Daten "etwas Wert" festlegt, der beibehalten werden soll. Es gibt jedoch kein "getSomethingValue", um den Wert von "value" abzurufen. Was soll ich mit diesem setSomethingValue
Test machen?
Meine persönliche Antwort lautet "basierend auf Projektrichtlinien und -spezifikationen".
Selbst wenn es sich um eine private Variable (Eigenschaft) handelt, kann der Wert des Werts mithilfe der Funktion Reflection in Java ermittelt werden. [^ 2]
Darüber hinaus über Projekte und Spezifikationen
――Wenn das Projekt oder die Spezifikation "auf Wert setzen" lautet, ist es sehr wahrscheinlich, dass es getestet wird. --Wenn die Richtlinie "Private Variablen nicht prüfen" oder "Mit von der Klasse veröffentlichten Eigenschaften und Methoden prüfen" lautet, wird sie nicht getestet (da es keinen anderen Weg gibt, auf Werte zuzugreifen als Reflektion).
Ich würde gerne die letztere Perspektive einnehmen, aber in diesem Fall gibt es ein etwas nerviges Problem. Wenn Sie eine Methode hinzufügen, die die folgenden Werte für die angegebene Anzahl von Malen wiederholt anzeigt
public String repeatSpeak(int times) {
String result = "";
for (int i=0; i < times; i++) {
result += this.value;
}
return result;
}
Dieser repeatSpeak
ist eine öffentliche Methode (= wird von jemandem verwendet) und wird daher getestet. Zu diesem Zeitpunkt ändert sich der Wert abhängig von "Wert". Sie würden also auch einen Test schreiben, der "setValue" verwendet, um "value" zu ändern.
Ich denke, es ist möglich, indirekt und nicht direkt so zu testen.
Für die Teamentwicklung ist es erforderlich, eine ** einheitliche Perspektive ** im Projekt zu haben, die auf Perspektiven wie "Was", "Wie" und "Wer" basiert, also wie dies am Einsatzort usw. zu tun ist. Fragen Sie, ob Sie testen möchten. Wenn Sie sich nicht entschieden haben, lassen Sie die Mitglieder des Teams zu Beginn der Entwicklung eine einheitliche Perspektive teilen.
[^ 2]: Siehe Reflexion: Samurai-Blog- [Einführung in Java] Ausführen von Methoden und Ändern von Feldern mit Reflexion, Hishidama Seitenreflexion des technischen Memos,
Recommended Posts