Neulich habe ich zum ersten Mal an der Entwicklerveranstaltung von Microsoft de: code2017 teilgenommen. Es war sehr interessant, sich über eine Vielzahl von Themen zu informieren, beispielsweise über das Verwalten und Ändern von Legacy-Entwicklungsstandorten anhand der neuesten technologischen Trends.
Darunter die testgetriebene Entwicklung des ** FizzBuzz-Problems, das Gegenstand der Live-Codierung für die Sitzung war DO03 Testgetriebene Entwicklung in 50 Minuten Die Entwicklung ** war sehr beeindruckend.
Was ist also überhaupt ein Test (Unit Test)? Während ich zurückblickte, versuchte ich es auf meine eigene Weise zu üben.
Da es anscheinend länger dauert, wenn Sie die Übungsinhalte der Reihe nach befolgen, werde ich sie in zwei Teilen veröffentlichen: ** Vorbereitung ** und ** Übung **. Diesmal ist es ** Vorbereitung **.
Ein Komponententest ist ein Test, mit dem überprüft wird, ob ein Programm gemäß den Spezifikationen in kleinen Einheiten wie Klassen und Methoden funktioniert.
Es gibt drei Haupttypen:
Es scheint eine Idee zu geben, dass Unit-Tests nutzlos sind [^ 1], aber ich denke, dass dies in den folgenden Punkten notwendig ist.
Bauen Sie Qualität von Kleinteilen bis Bottom-up auf.
Erleichtert die Funktionsprüfung nach Refactoring- und Spezifikationsänderungen und verbessert die Wartbarkeit des Systems.
Es ist eine Entwicklungsmethode, die die folgenden drei Zyklen für jede Funktion der Spezifikation wiederholt.
Im xUnit-Framework wird dieser Zyklus anhand der Farbe der Balkenanzeige beschrieben, wenn der Test fehlschlägt / erfolgreich ist. ROT </ font> - GRÜN </ font> --REFACTOR Auch genannt.
Die tatsächliche Wahl der testgetriebenen Entwicklung hängt von der Projektsituation ab, aber ich denke, die folgenden Vorteile gelten für jedes Projekt.
Nun machen wir uns bereit für die ** testgetriebene Entwicklung des FizzBuzz-Problems **.
Type | Material | Version |
---|---|---|
Language | Java (JDK) | 1.8.0_111 |
IDE | Spring Tool Suite | 3.8.2 |
Build | Maven | 3.3.9 |
Test | JUnit | 4.12 |
Führen Sie die folgenden Schritte aus, um ein Projekt zu erstellen.
Stellen Sie sicher, dass pom.xml direkt unter dem erstellten Projekt erstellt wird.
Fügen Sie als Nächstes die folgenden Einstellungen zu pom.xml hinzu, um JUnit zu verwenden.
pom.xml
<!--Auszug nur für verwandte Teile-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
Wenn die Version der JRE-Bibliothek nicht 1.8 ist, fügen Sie die Einstellung maven-compiler-plugin zu pom.xml hinzu.
pom.xml
<!--Auszug nur für verwandte Teile-->
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
Nachdem die Umgebung eingerichtet ist, müssen die zu implementierenden Anforderungen definiert werden.
Schreiben Sie ein Programm, das Zahlen von 1 bis 100 druckt. Wenn es sich jedoch um ein Vielfaches von 3 handelt, drucken Sie "Fizz" anstelle einer Zahl. Wenn es sich um ein Vielfaches von 5 handelt, drucken Sie "Buzz". Wenn es sich um ein Vielfaches von 3 und 5 handelt, drucken Sie "Fizz Buzz".
Es scheint, dass es ursprünglich ein englischsprachiges Sprachspiel war.
Aus dem obigen Problem werden wir die Schlüsselwörter extrahieren, die Anforderungen aufteilen und den Implementierungsteil definieren.
Extrahieren Sie den Teil, der dem Befehl oder der Bedingung entspricht, als Schlüsselwort.
Definieren Sie aus den Schlüsselwörtern den Teil, der in der zu testenden Klasse implementiert werden soll. Hier bleibt die Druckfunktion dem Aufrufer der FizzBuzz-Klasse überlassen, und die FizzBuzz-Klasse hat die Funktion, die Zeichenfolge zurückzugeben, die der Aufrufer drucken möchte.
Mit welcher der oben genannten Funktionen möchten Sie beginnen, auch wenn Sie den Klassenein- und -ausgang "Nehmen Sie eine Zahl" und "Geben Sie eine Zeichenfolge zurück" ausschließen? Ich denke, die Frage bleibt. Ich denke, es hängt von der Zeit und dem Fall ab, aber ich habe die Reihenfolge aus den folgenden Funktionen festgelegt. [^ 2]
Daher werden wir die FizzBuzz-Klasse testen und entwickeln, die eine Zahl als Argument verwendet und eine Zeichenfolge in der folgenden Reihenfolge zurückgibt.
Zunächst möchte ich Testcode schreiben ... aber vorher muss ich bestätigen, dass JUnit korrekt installiert ist.
Bereiten Sie insbesondere die Testklasse FizzBuzzTest.java vor, schreiben Sie ein leeres Testprogramm und führen Sie den Test aus.
Bereiten Sie zunächst die Testklasse wie folgt vor.
Die Projektstruktur nach dem Erstellen von FizzBuzzTest.java lautet wie folgt.
Implementieren Sie als Nächstes eine leere Testmethode, die in der erstellten Datei FizzBuzzTest.java nichts bewirkt.
FizzBuzzTest.java
import org.junit.Test;
public class FizzBuzzTest {
@Test
public void JUnit-Betriebstest() {
}
}
Platzieren Sie den Cursor auf der JUnit-Operationstestmethode der von Ihnen erstellten FizzBuzzTest-Klasse und klicken Sie mit der rechten Maustaste auf> Ausführen als-> JUnit-Test, um den Test auszuführen.
Dann sehen Sie einen grünen Balken, der anzeigt, dass der Test erfolgreich war, wie in der folgenden Abbildung gezeigt.
Dies zeigt, dass JUnit standardmäßig arbeitet und JUnit verwenden kann. Wenn der Test hingegen fehlschlägt, können Sie Fehler in der Testumgebung feststellen. Beispielsweise war die Maven-Installation nicht erfolgreich.
Nachdem Sie bestätigt haben, dass JUnit einwandfrei funktioniert, ist die ** Vorbereitung ** beendet.
Hier werde ich die endgültige Projektstruktur und den Programminhalt mit den Worten "Fazit kommt zuerst" veröffentlichen. [^ 3]
FizzBuzzTest.java
package com.example;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.junit.experimental.runners.Enclosed;
import org.junit.runner.RunWith;
@RunWith(Enclosed.class)
public class FizzBuzzTest {
public static class Argument ist kein Vielfaches von 3 und 5{
FizzBuzz fizzbuzz = new FizzBuzz();
@Test
public void Gibt 1 zurück, wenn 1 als Argument angegeben wird() {
assertEquals("1", fizzbuzz.response(1));
}
}
öffentliche statische Klasse Ein Vielfaches von 3 mit nur 3 Argumenten{
FizzBuzz fizzbuzz = new FizzBuzz();
@Test
public void Gibt Fizz mit 3 Argumenten zurück() {
assertEquals("Fizz", fizzbuzz.response(3));
}
}
öffentliche statische Klasse Ein Vielfaches von 5 mit nur 5 Argumenten{
FizzBuzz fizzbuzz = new FizzBuzz();
@Test
public void Gibt Buzz mit 5 Argumenten zurück() {
assertEquals("Buzz", fizzbuzz.response(5));
}
}
öffentliche statische Klasse Argumente sind Vielfache von 3 und 5{
FizzBuzz fizzbuzz = new FizzBuzz();
@Test
public void Gibt FizzBuzz mit 15 Argumenten zurück() {
assertEquals("FizzBuzz", fizzbuzz.response(15));
}
}
Das öffentliche statische Klassenargument ist ein gültiger Grenzwert{
FizzBuzz fizzbuzz = new FizzBuzz();
@Test
public void Gibt 1 zurück, wenn Argument 1 angegeben ist() {
assertEquals("1", fizzbuzz.response(1));
}
@Test
public void Gibt Buzz mit 100 Argumenten zurück() {
assertEquals("Buzz", fizzbuzz.response(100));
}
}
Das öffentliche statische Klassenargument ist ein ungültiger Grenzwert{
FizzBuzz fizzbuzz = new FizzBuzz();
@Test(expected = IndexOutOfBoundsException.class)
public void Ein Fehler tritt auf, wenn das Argument 0 angegeben wird.() {
fizzbuzz.response(0);
}
@Test(expected = IndexOutOfBoundsException.class)
Ein öffentlicher void-Fehler tritt auf, wenn das Argument 101 angegeben wird() {
fizzbuzz.response(101);
}
}
}
FizzBuzz.java
public class FizzBuzz {
public String response(int num) {
StringBuilder result = new StringBuilder();
if(num < 1 || num > 100) {
throw new IndexOutOfBoundsException();
}
if(num % 3 == 0) {
result.append("Fizz");
}
if(num % 5 == 0) {
result.append("Buzz");
}
if(result.length() == 0) {
result.append(String.valueOf(num));
}
return result.toString();
}
}
Das nächste Mal möchte ich als ** Übung ** veröffentlichen, wie ich mit der Implementierung der folgenden Testklasse (FizzBuzzTest.java) und der Testzielklasse (FizzBuzz.java) fortgefahren bin.
[Amazon \ .co \ .jp: [Verständnis in diesem einen Buch] Softwaretest Lehrbuch-Grundlagen und Praxis des Testprozesses, der die Qualität bestimmt eBook: Kazuhiro Ishihara, Hidekazu Tanaka, Masashi Tanaka: Kindle Store](https :: //www.amazon.co.jp/%E3%80%90%E3%81%93%E3%81%AE1%E5%86%8A%E3%81%A7%E3%82%88%E3%81 % 8F% E3% 82% 8F% E3% 81% 8B% E3% 82% 8B% E3% 80% 91% E3% 82% BD% E3% 83% 95% E3% 83% 88% E3% 82% A6 % E3% 82% A7% E3% 82% A2% E3% 83% 86% E3% 82% B9% E3% 83% 88% E3% 81% AE% E6% 95% 99% E7% A7% 91% E6 % 9B% B8_% E5% 93% 81% E8% B3% AA% E3% 82% 92% E6% B1% BA% E5% AE% 9A% E3% 81% A5% E3% 81% 91% E3% 82 % 8B% E3% 83% 86% E3% 82% B9% E3% 83% 88% E5% B7% A5% E7% A8% 8B% E3% 81% AE% E5% 9F% BA% E6% 9C% AC % E3% 81% A8% E5% AE% 9F% E8% B7% B5-% E7% 9F% B3% E5% 8E% 9F-% E4% B8% 80% E5% AE% 8F-ebook / dp / B00U17809A / ref = sr_1_1? ie = UTF8 & qid = 1496770784 & sr = 8-1 & keywords =% E3% 82% BD% E3% 83% 95% E3% 83% 88% E3% 82% A6% E3% 82% A7% E3% 82% A2% E3% 83% 86% E3% 82% B9% E3% 83% 88% E3% 81% AE% E6% 95% 99% E7% A7% 91% E6% 9B% B8)
Lesen Sie "Warum die meisten Unit-Tests nicht helfen"|Entwicklungsmethode / Projektmanagement| POSTD
Testgetriebene Entwicklung in 50 Minuten / TDD Live in 50 Minuten // Speaker Deck
[^ 1]: Ich habe nur die Zusammenfassung gelesen, aber die ursprüngliche Geschichte lautet [Warum \ -Most \ -Unit \ -Testing \ -is \ -Waste \ .pdf](http://rbcs-us.com/ Dokumente / Warum-die-meisten-Unit-Tests-sind-Abfall.pdf) Es ist geschrieben in.
[^ 2]: Wenn beispielsweise in einem Filmreservierungssystem mit mehreren Rabattoptionen gemäß den Benutzereigenschaften die letzte Anforderung "die Option anwenden, die den Rabattsatz erhöht" lautet, wird aus der Bedingung der Benutzereigenschaften heraus, dass der Rabattsatz hoch ist Ich werde es testen.
[^ 3]: Es gibt einige Unterschiede zur Live-Codierung in de: code, auf die ich mich bezog, da dies das Ergebnis meiner eigenen Praxis war und einige Teile aus zeitlichen Gründen in de: code weggelassen wurden.
Recommended Posts