[PYTHON] Die Idee des korrekten Testens für Projekte, bei denen das Testen nicht funktioniert

Wer ist das Ziel dieses Artikels?

Einführung

Ich hatte viel Wissen über Testdesignmethoden und -implementierung, aber was ich nicht wusste, war die Idee des Testens.

Kobito.Rq2LN5.png

Ich denke, viele Leute wissen, dass das Testen wichtig zu sein scheint. Ich denke jedoch, dass es einige Leute gibt, die die Vorteile nicht wirklich erkannt haben. In der Tat gibt es diejenigen, die sagen, dass *** Testen wichtig ist *** und diejenigen, die wissen, dass *** Testen wichtig zu sein scheint ***. Die letztere Person kann vorerst einen Test schreiben. Ich habe jedoch das Gefühl, dass ich mich trotz Zeitaufwand beim Testen oft darauf verlasse, am Ende Fehler beim manuellen Testen zu finden.

Es ist natürlich, einen Test in der Welt zu schreiben, und der Test ist wichtig! Warum können wir nicht erkennen, dass das Testen wichtig ist, obwohl es ein Trend ist? ?? Wie können wir ein Projekt erstellen, das Tests effektiv nutzt?

Wie denken Sie in diesem Artikel über solche Probleme in der Praxis und nicht auf knifflige Weise? Ich möchte den Gedankenkreis erklären.

Betrachten Sie beispielsweise den folgenden Fall.

Fallstudie

class SampleController
  def index
    # do something
  end
end

In dieser Aktion werden 10 Methoden A, B, C, D, E, F, G, H, I, J aufgerufen, die jeweils (0, 1) zurückgeben, und es gibt 1024 verschiedene Verhaltensweisen. Machen.

Hier gibt es einen Bericht, dass es sich in den folgenden Situationen nicht normal verhält.

Bericht 1

A -> 0 
B -> 1 
C -> null
D -> 1 
E -> 1 
F -> 1 
G -> 0 
H -> 0 
I -> 0 
J -> - 2

Bericht 2

A -> 0 
B -> 1 
C -> 0 
D -> 1 
E -> 1 
F -> 1 
G -> 0 
H -> 0 
I -> 0 
J -> 1

Welche Tests hätte ich durchführen sollen, um zu verhindern, dass der Fehler erneut auftritt? ??

In einem Projekt, in dem nur Komponententests geschrieben werden, kann der Fehler in Bericht 1 möglicherweise verhindert werden, es kann jedoch schwierig sein, den Fehler in Bericht 2 zu verhindern. Welche Art von Testfall sollte ich basierend auf diesem Fall schreiben? Das möchte ich erklären.

Annahme

Was ist der Zweck des Tests überhaupt, anstatt plötzlich in die Methodik einzutreten? Was ist der ideale Test? Was sind die Probleme mit dem idealen Test? Ich möchte die Auslegung in dieser Hinsicht vereinheitlichen.

Zweck des Tests

Der Zweck des Tests ist

  1. Einen Fehler finden
  2. Qualität garantieren
  3. Verbesserung der Qualität

Es wurde gesagt, dass. Der wichtigste Zweck hierfür ist *** 1. Auffinden von Fehlern ***. Um es auf den Punkt zu bringen: Eine fehlerfreie Anwendung ist ideal, und das Testen ist eine der besten Möglichkeiten, um diesem Ideal näher zu kommen.

Was soll ich tun, um Fehler zu vermeiden?

Ich denke, es kann in drei Bereiche unterteilt werden: Spezifikationen, Programmdesign und Testen. Wenn die Spezifikationen und das Programmdesign schlecht sind, ist der Test schwierig. Überarbeiten Sie also Ihren Spaghetti-Code, bevor Sie ihn testen. Aber diesmal geht es ums Testen.

Kobito.V11The.png

Was ist der ideale Test?

Was ist der ideale Test? Es ist ein Test, der beweist, dass *** alle Anwendungsfälle ordnungsgemäß funktionieren ***.

Mit anderen Worten, wenn Sie 100 verschiedene Verwendungszwecke haben, können Sie den Fehler perfekt finden, indem Sie testen, ob die 100 Antworten korrekt sind. Ich werde anhand des vorherigen Falls erklären.

Fallstudie

class SampleController
  def index
    # do something
  end
end

Innerhalb dieser Aktion werden 10 Methoden A, B, C, D, E, F, G, H, I, J aufgerufen und es gibt 1024 Anwendungsfälle. Nehmen Sie außerdem an, dass jede Methode (0, 1) zurückgibt.

Hier habe ich einen Bericht erhalten, dass in den folgenden Situationen ein Fehler aufgetreten ist.

A -> 0 
B -> 1 
C -> 0 
D -> 1 
E -> 1 
F -> 1 
G -> 0 
H -> 0 
I -> 0 
J -> 1

Antwort (ideale Position)

Zunächst weiß ich nicht, ob die Kombination den Fehler verursacht oder ob die einzelne Methode den Fehler verursacht. Dieses Mal werde ich jedoch eine solche Situation ignorieren und den Testfall von einer idealen Position aus betrachten.

Testen Sie in einer idealen Position, ob alle Kombinationen normal sind. Mit anderen Worten, 2 ^ 10 = 1024 Tests helfen Ihnen, den Fehler perfekt zu finden.

Probleme in einer idealen Position

Eine Funktion mit 1024 Anwendungsfällen ist ein Monster, aber in Wirklichkeit ist es unmöglich, Hunderte von Funktionen für eine Aktion (Funktion) einer normalen Anwendung zu testen. Wenn mehrere Aktionen (Funktionen) kombiniert werden, ist eine unendliche Anzahl von Testfällen erforderlich. Das Problem hierbei ist, dass es arbeitsintensiv ist, alle Anwendungsfälle zu testen. (Natürlich)

Praktische Testdesignmethode

Je mehr Sie auf den idealen Test abzielen, desto mehr Arbeit werden Sie exponentiell erledigen. Also in der Welt des Softwaretests *** Wie können Sie einen kostengünstigen Test schreiben? *** *** Das wird ein Satz.

Wie schreibt man einen kostengünstigen Test? Es ist ***, solide Tests für fehlerhaften Code zu schreiben ***. Um es anders herum auszudrücken: *** Verdünnen Sie weniger wichtige Bedingungen aus dem idealen Test ***. Jetzt werde ich drei Möglichkeiten erklären, um vom idealen Testfall auf ein realistisches Niveau zu kommen.

Methode 1: Unabhängige Elemente ausdünnen

Diese Technik ist die grundlegendste Idee, die das Testen realistisch macht.

Fallstudie

class SampleController
  def index
    # do something
  end
end

Innerhalb dieser Aktion werden 10 Methoden A, B, C, D, E, F, G, H, I, J aufgerufen und es gibt 1024 Anwendungsfälle. Nehmen Sie außerdem an, dass jede Methode (0, 1) zurückgibt.

Satz 1:Wenn "1024 Anwendungsfälle alle normal sind", dann sind "10 Methoden alle normal"
Satz 2:Wenn "10 Methoden alle normal sind", dann sind "1024 Anwendungsfälle alle normal".

Sind Satz 1 und Satz 2 wahr oder falsch?

Antworten

Satz 1 ist "wahr" und Satz 2 ist "falsch". (Es scheint, dass Sie ein Programm schreiben können, das auch in letzterem wahr ist, indem Sie eine funktionale Sprache verwenden.)

Ersteres erfordert 2 ^ 10 = 1024 Tests, Letzteres erfordert 2 * 10 = 20 Tests.

Diese Aussagen beweisen, dass *** Unit-Tests allein nicht ausreichen, um einen Fehler zu finden ***. In der Realität kann eine Ausdünnung jedoch ausreichend sein.

Wenn beispielsweise die D- und H-Methoden von den 10 Methoden völlig unabhängig sind (andere Methoden nicht beeinflussen), kann sogar nachgewiesen werden, dass D und H 0 oder 1 zurückgeben. Es gibt kein Problem, wenn Sie dies tun. Darüber hinaus haben E und F auch enge Einflussbereiche, und es kann beurteilt werden, dass sie für Kombinationstests nicht erforderlich sind.

Das heißt, der Anwendungsfallindex wird von 10 auf 6 reduziert und der Komponententest um 4 erhöht. 2 ^ 6 + 2 * 4 = 70 Wege

Auf diese Weise werden wir die unabhängigen Kombinationen ausdünnen.

Punkt

Für unabhängige Methoden ist ein Unit-Test ausreichend und wird vom kombinierten Index abgezogen.

Methode 2: Testen Sie keine weniger wichtigen Muster

Dies kann theoretisch nicht bestimmt werden. Von Fall zu Fall liegt der Fehler in einem akzeptablen Bereich, wenn Sie nur die Idee kennen.

Fallstudie

class SampleController
  def index
    # do something
  end
end

Innerhalb dieser Aktion werden 10 Methoden A, B, C, D, E, F, G, H, I, J aufgerufen und es gibt 1024 Anwendungsfälle.

Die Methode A ist auch die von der Bibliothek bereitgestellte Authentifizierungsfunktion. 1 für die Authentifizierung Gibt 0 für die Nichtauthentifizierung zurück. Die Methode F gibt die Werte 'rot', 'grün' zurück und ändert die Farbe der Schaltfläche. Die Methode H gibt Plan A-Objekt und Plan B-Objekt aus den vom Benutzer eingegebenen Informationen zurück.

Es sollte eine Hierarchie von Fällen geben, die getestet werden sollten, und von Fällen, die ohne Test zulässig sind. Wie sollten Sie Ihre Tests priorisieren? ??

Antworten

Die Beurteilung basiert auf der Matrix von (Wichtigkeit) x (Risiko einer Insektenkontamination).

Die Bedeutung hat Faktoren wie die Wichtigkeit für den Benutzer und ein breites Spektrum an Einflussmöglichkeiten. Das Risiko von Fehlern ist konstruktionsbedingt an Stellen höher, an denen der Quellcode komplexer ist. (Orte mit einem hohen Bindungsgrad) Das Risiko einer Insektenkontamination kann bis zu einem gewissen Grad durch eine metrische Analyse quantitativ bestimmt werden. (Ich werde später über die Metrikanalyse sprechen)

In diesem Fall wird A von einer vertrauenswürdigen Bibliothek bereitgestellt, und das Risiko von Fehlern ist gering. F Der Einflussbereich ist eng und für Benutzer nicht so wichtig. H ist der Wert der Anwendung selbst und die Logik ist kompliziert. Mit anderen Worten

Kobito.DXuYmk.png

Mit einer solchen Matrix kann festgestellt werden, dass A nicht einheitlich getestet werden muss und F nicht im Kombinationsmuster enthalten sein muss.

Punkt

Unter Berücksichtigung von (Wichtigkeit) x (Risiko einer Fehlerkontamination) verdünnen Sie die Teile, die nicht in den Code und das Kombinationsmuster aufgenommen werden müssen, für die kein Komponententest erforderlich ist.

Methode 3: Eingrenzen von Kombinationen basierend auf statistischen Informationen

Welche Art von Testfällen sollte bisher ausgedünnt werden? Ich habe die Grundidee gelernt. Mit menschlicher Kraft sind jedoch selbst Dutzende von Testfällen für eine Funktion streng. Wann können Testingenieure Fehler bekommen? Ich habe das zu statistischen Informationen gemacht. Dann machen Probleme, die zwischen *** 2 Parametern auftreten, 70 bis 90% aus. Das statistische Ergebnis von *** erschien. Eine auf diesen Daten basierende Testentwurfsmethode wird als *** paarweise Methode *** bezeichnet.

Fallstudie

class SampleController
  def index
    # do something
  end
end

Innerhalb dieser Aktion werden drei Methoden A, B, C und D aufgerufen, und es gibt acht Anwendungsfälle.

Die paarweise Methode ist wie folgt.

Bei der All-Pair-Methode (paarweise), bei der es sich um eine der Kombinationstesttechniken handelt, wird ein Testmuster erstellt, sodass mindestens die Wertekombination zwischen zwei Parametern für alle Parameter abgedeckt wird.

Alle paarweise (paarweise) Methode

Ist geschrieben.

Mit anderen Worten, es ist in Ordnung, wenn alle Kombinationen der beiden Methoden abgedeckt sind. Wenn Sie beispielsweise einen Testfall mit der paarweisen Methode für die Methoden A, B, C und D betrachten, sieht dieser wie folgt aus.

A       B       C       D
1       0       0       0
1       1       1       1
0       1       0       1
0       0       1       1
0       1       1       0

Es scheint, dass es ein Werkzeug gibt, das paarweise erstellt werden kann. Sie können es also versuchen.

Tool zur Erstellung von Kombinationstestfällen "PictMaster" und das Thema Softwaretests

Zusammenfassung

Methode 1, finden Sie ein unabhängiges Muster. Methode 2: Überlegen Sie in der Matrix, ob Sie wirklich testen sollten. Methode 3: Reduzieren Sie die Anzahl der Kombinationen auf der Grundlage statistischer Informationen mit Bedacht.

Ich denke, das wäre eine realistische Kombination.

Gute Kenntnisse beim Schreiben von Tests in der Praxis

Mit dem oben Gesagten konnte ich die Grundidee erwerben. Bisher handelt es sich jedoch um Fallstudien, die auf einem teilweise idealisierten Modell basieren. In früheren Fällen war die Kombination sehr klar. Im Feldcode variiert die Anzahl der Kombinationen jedoch von Person zu Person. Welche Art von Code lauert bei manchen Menschen? Es wird Variationen in der Interpretation geben.

Bei der Entwicklung in einem Projekt möchten wir jedoch so viel wie möglich ein gemeinsames Verständnis haben. Daher möchte ich das Wissen über die folgenden Punkte erläutern. (Überspringen Sie die Gegenstände, die Sie kennen.)

Die Abdeckungsrate ist eine Methode zum Zählen von Routenkombinationen. Gleiche Aufteilung und Randwertanalyse sind Methoden zum Extrahieren von Wertemustern. Die Metrikanalyse ist eine Methode zur quantitativen Messung, welche Art von Code einen Fehler aufweist.

Wenn Sie diese kennen, wird es einige Unterschiede in der Auswahl und Priorität der Kombination zwischen den Projekten geben.

Wie hoch ist die Deckungsrate?

Ein Index, der angibt, wie stark die Zweige im Programm abgedeckt sind. Es gibt C0-, C1- und C2-Abdeckungsstufen.

Nehmen wir ein Beispiel für diesen Code.

def my_method
  if type1 == "A"
    print("Prozess 1")
  else
    print("Prozess 2")
  end

  if type == "B"
    print("Prozess 3")
  end
end

C0: Anweisungsabdeckung

Auf der C0-Ebene wird bestimmt, ob die Anweisungen abgedeckt sind. Mit anderen Worten, es ist in Ordnung, wenn Sie Prozess 1 einmal an Prozess 3 übergeben.

def my_method
  if type1 == "A"
    print("Prozess 1")
  else
    print("Prozess 2")
  end

  if type == "B"
    print("Prozess 3")
  end
end

Die folgenden beiden Testfälle weisen eine C0-Abdeckungsrate von 100% auf.

type == "A" TRUE,  type == "B" TRUE
type == "A" FALSE, type == "B" TRUE

C1: Zweigabdeckung

Stellen Sie auf der Ebene C1 fest, ob der Zweig vollständig ist. Mit anderen Worten, es ist in Ordnung, alle Zweige einmal durchzugehen.

def my_method
  if type1 == "A"
    print("Prozess 1")
  else
    print("Prozess 2")
  end

  if type == "B"
    print("Prozess 3")
  end
end

Die folgenden vier Testfälle weisen eine C1-Abdeckungsrate von 100% auf. 2 + 2 = 4 Wege

type == "A" TRUE,  type == "B" TRUE
type == "A" FALSE, type == "B" TRUE
type == "A" TRUE,  type == "B" FALSE
type == "A" FALSE, type == "B" FALSE

C2: Abdeckung der Bedingungen

Stellen Sie auf der Ebene C2 fest, ob alle Zweigkombinationen abgedeckt sind. Das ist schwierig, weil es dem idealen Test ziemlich nahe kommt.

def my_method
  if type1 == "A"
    print("Prozess 1")
  else
    print("Prozess 2")
  end

  if type == "B"
    print("Prozess 3")
  end
end

Es gibt unten vier Testfälle, aber in Wirklichkeit steigt die Anzahl der Testfälle mit zunehmenden Bedingungen exponentiell weiter an. 2 * 2 = 4 Wege

type == "A" TRUE  && type == "B" TRUE
type == "A" FALSE && type == "B" TRUE
type == "A" TRUE  && type == "B" FALSE
type == "A" FALSE && type == "B" FALSE

Gleiche Split- und Randwertanalyse

Wir haben übrigens festgestellt, dass die Kombinationen nach der Anzahl der bedingten Verzweigungen gezählt werden. Es gibt jedoch noch eine andere Kombination von Variablen. Das ist der Wertebereich, der genommen werden kann. (Wertebereich)

Fallstudie

Betrachten Sie die folgende Codeteststrategie.


#Mögliche Werte für var sind String, Int,Einer von Null
def my_method(var)
  var.your_method
end

Für die Berichterstattung reicht ein Mal aus. Es reicht jedoch nicht aus, nur die Abdeckungsrate zu berücksichtigen. In diesem Fall sollten Sie mindestens die Fälle String, Int und nill testen.

*** Wenn es sich bei der Abdeckung um eine Routenabdeckung handelt, handelt es sich diesmal um eine Wertabdeckung. *** *** Die Abdeckung der Werte ist jedoch endlos. (Natürliche Zahlen allein) Wie decken Sie es ab? ??

Gleiche Aufteilung

Wie üblich überlasse ich die Erklärung anderen leicht verständlichen Artikeln.

Was ist Gleichheitsspaltung?

Grenzwertanalyse

Wie der Name schon sagt, geht es darum, Grenzwerte zu testen.

Was ist Metrikanalyse?

Es analysiert die Software statisch und bewertet die Qualität aus verschiedenen Perspektiven quantitativ. Wenn Sie diese Idee kennen, *** Welche Art von Quellcode hat viele Fehler? Sie können das *** bis zu einem gewissen Grad sehen. Ich werde unten einen Referenzlink für eine detaillierte Erklärung einfügen, aber ich werde nur den Index erklären, der als zirkuläre Komplexität bezeichnet wird.

Was ist zirkuläre Komplexität?

Eine Möglichkeit, die Komplexität durch Zählen der Anzahl der Pfade im Quellcode zu demonstrieren. Dieser Artikel ist jedoch überwiegend leicht zu verstehen. Schauen Sie also bitte vorbei.

\ Es ist ein Fehler! / Was ist der Komfort und die zyklomatische Komplexität aus der Sicht von Mr. Bug, der im System nistet? Es ist ein Fehler! /

Referenzlink

Was ist Metrikanalyse? Ruby on Rails | Metrikanalyse mit metric_fu Was ist das statische Code-Analyse-Tool MetricFu?

Metrikanalyse-Tool für jede Sprache Erste Softwaremetriken (Teil 1): Quantifizieren und Bestätigen der Softwarequalität

Lesen Sie, wann Sie eine Methode zur Auswahl von Testfällen auswählen möchten.

[Lesen Sie "Von Null-Wissen gelernte Softwaretests" [Von White-Box-Tests zu Erkundungstests]](http://qiita.com/shinofumijp@github/items/6121105c608fc0cf11d4#%E5%90%8C%E5%80 % A4% E5% 88% 86% E5% 89% B2% E6% B3% 95% E3% 81% A8% E5% A2% 83% E7% 95% 8C% E5% 88% 86% E6% 9E% 90 % E6% B3% 95)

Q&A

Ich habe viel geschrieben. Es ist jedoch für alle Projektmitglieder schwierig, die Qualität des Tests aufrechtzuerhalten. Daher möchte ich die bisher aufgetretenen Probleme in einem Q & A-Format schreiben.

Frage 1: Wie soll ich den Unit-Test und den E2E-Test richtig verwenden?

Ideal ist es, das Verhalten aller Funktionen und Methoden zu testen. Alle Kombinationen davon sind mit dem E2E-Test zu prüfen. Aber in Wirklichkeit ist es schwierig. Daher werden Funktionen und Methoden mit geringer Komplexität nicht einheitlich getestet. Unabhängige Kombinationen werden aus dem Testfall ausgedünnt. Testdesign basierend auf der Idee.

Von Zeit zu Zeit aktualisiert

Recommended Posts

Die Idee des korrekten Testens für Projekte, bei denen das Testen nicht funktioniert
Wie nutzt man maschinelles Lernen für die Arbeit? 01_ Den Zweck des maschinellen Lernens verstehen
Ich habe versucht, die logische Denkweise über Objektorientierung zusammenzufassen.
Ich habe versucht, die Gesichtsverdeckungsarbeit des Koordinationsbildes für das Tragen zu automatisieren
Der schnellste Weg für Anfänger, um Python zu beherrschen
Excel X Python Die schnellste Arbeitstechnik
Einfache Möglichkeit, die Quelle der Python-Module zu überprüfen
Bis zu dem Punkt, an dem Pythons Sellerie und RabbitMQ (Docker) funktionieren