Zunächst möchte ich sagen, dass Mathematik dazu beiträgt, unsere Gedanken in Ordnung zu bringen und logisches Denken effektiv zu entwickeln. Dies sind einige der wichtigsten Eigenschaften der Teilnehmer an der Softwareentwicklung. Beim Testen geht es hauptsächlich um das Verhalten des Systems, das orthogonal zur strukturellen Darstellung ist, die Softwareentwicklern gemeinsam ist. Der Unterschied zwischen strukturellen und Verhaltensdarstellungen besteht darin, dass sich die Struktur auf das konzentriert, was die Software ist, und die Verhaltensansicht berücksichtigt, was die Software tut.
Eine der Schwierigkeiten von Testern besteht darin, dass die grundlegende technische Dokumentation oder das Softwareentwicklungshandbuch normalerweise von und für Entwickler geschrieben wird und der Schwerpunkt eher auf strukturellen als auf Verhaltensinformationen liegt. Natürlich sind sowohl strukturelle als auch Verhaltensteile für das Testen sehr wichtig, da in jedem dieser Teile Programmierfehler gefunden werden können. Deshalb werden wir über diskrete mathematische Methoden sprechen, um die Beziehung zwischen der Struktur des Programms und seinem Verhalten zu zeigen.
In ihrer täglichen Arbeit arbeiten Ingenieure für Softwarequalitätssicherung (QS) mit Formeloperationen, Funktionsverhalten und Datenstrukturen. Sie überwachen und verifizieren immer den sich ständig ändernden Zustand von Systemen, daher benötigen sie algorithmisches und mathematisches Denken, um die Logik von Software zu verstehen.
Wenn ein Entwickler in seiner Arbeit einen mathematischen Ansatz verwendet, werden alle logischen Operationen miteinander verbunden, Aktionen folgen einer logischen Kette und jede Funktion wird strukturell betrachtet.
Diskrete Mathematik hilft uns, in verschiedenen Situationen die beste Lösung zu finden. Beispielsweise können Sie die am besten geeigneten Testfälle (Testfälle) finden, ohne alle möglichen Optionen abzudecken. Darüber hinaus hilft uns die diskrete Mathematik, die genaue Software zu visualisieren, die implementiert und in Tests behandelt wurde.
Leider leben wir nicht in einer idealen Welt, und die erwarteten tatsächlichen Ergebnisse der Verwendung der Software und die tatsächlichen Ergebnisse können variieren. Das Hauptziel der Qualitätssicherungsabteilung (QS) ist es daher, so viele Testfälle wie möglich effektiv abzudecken.
Um Ihnen dieses Konzept genauer zu zeigen, haben wir das folgende Venn-Diagramm mit einem Beispiel erstellt, das wir zuvor skizziert haben:

Das obige Venn-Diagramm beschreibt viele Situationen und hilft so, Situationen zu veranschaulichen und zu definieren. Dies kann uns beispielsweise helfen, den Unterschied zwischen Objektgruppen zu erkennen. Diskrete Mathematik hilft bei der Analyse und Optimierung von Aktionssätzen, die sich auf die Entwicklung von Software auswirken können.
Mengenlehre
Unter Verwendung der Prinzipien der Theorie der Grundmengen können wir Pseudocode erstellen, um alle möglichen Fälle für die Anwendung am nächsten Tag zu veranschaulichen (ein Programm, das anhand des eingegebenen Datums berechnet, welcher Tag der nächste sein wird):
M1={month:month has 30 days} M2={month:month has 31 days except December} M3={month:month is February} M4={month:month is December} D1={day:1<=day<=28} D2={day:1<=day<=29} D3={day:1<=day<=30} D4={day:1<=day<=31} Y1={year:year is a leap year} Y2={year:year is not a leap year}
Dieser Pseudocode wurde bereits für die Entwicklung und das Testen der Anwendung vorbereitet, sodass Tester auch alle möglichen Testfälle basierend auf diesen Daten anwenden können. Die Verwendung von Daten in diesem Format erhöht die Entwicklungsgeschwindigkeit und verringert die Fehlerwahrscheinlichkeit.
Graphentheorie
Die diskreteste Mathematik ist die sogenannte "Graphentheorie", die Graphen untersucht. Diagramme werden verwendet, um die Beziehung zwischen einigen Objekten oder Daten darzustellen, und ein Computernetzwerk ist ein geeignetes Beispiel für ein Diagramm.
Grafiken sind auch für den Softwareentwicklungsprozess von grundlegender Bedeutung. Mithilfe eines Diagramms können wir beispielsweise komplexe Funktionen in mehrere kleinere Teile zerlegen, um die Geschäftslogik besser zu verstehen.
Diagramme können gerichtet und ungerichtet sein, was bedeutet, dass wir uns von einem Knoten zu einem Knoten in eine Richtung oder in beide Richtungen bewegen können (im Fall eines gerichteten Graphen), oder wir können uns nicht von einem Knoten zu einem anderen bewegen (wenn der Graph streng in eine Richtung gerichtet ist) Richtung)
Kehren wir also zu den Softwaretests zurück und stellen uns vor, dass wir einen Prozessablauf haben (z. B. das Verschieben einer Aufgabe in eine Art Aufgabenverfolgungssystem). Wir haben eine Bedingung für ein Problem, und wir können es auf eine andere Stufe verschieben (orientiertes Diagramm), oder wir können einen Punkt erreichen, an dem wir nichts mit der Entität tun können (ungerichtetes Diagramm). Mit diesem Ansatz zur Visualisierung können wir auf einfache Weise eine Reihe aller möglichen Aktionen zusammenstellen, die für diese Entität verfügbar sind:

Lassen Sie uns fortfahren und die Adjazenzmatrix betrachten, die auf der Grundlage eines ungerichteten Graphen erstellt werden kann. Im folgenden Beispiel geben Elemente der Adjazenzmatrix an, ob Scheitelpunktpaare benachbart sind oder nicht:

Stellen Sie sich nun vor, dass die Knoten die Bedingungen einiger Entitäten sind. Wenn wir die Adjazenzmatrix für diesen Graphen (eine Reihe von Entitäten) erstellen, sehen wir eine endliche Menge von Aktionen, die wir ausführen können. Beispielsweise ist das Ändern des Status von Knoten "0" in Knoten "1" verfügbar, da sie miteinander in Beziehung stehen. Die Entität "0" kann jedoch nicht in Stufe "2" oder "3" geändert werden, wie wir aus unserer Matrix sehen können - "Null" wird in die Zellen geschrieben. Mit dieser Matrix können wir unnötige Sätze von Entitätsschritten eliminieren und den Satz von Testfällen reduzieren.
Eine andere Matrix, die wir zum Sammeln von Testfällen verwenden können, ist die Inzidenzmatrix, die die Beziehung zwischen zwei Klassen von Objekten zeigt. In der folgenden Abbildung sehen wir einen ungerichteten Graphen und seine Inzidenzmatrix: "1", "2", "3" und "4" sind Knoten (Entitäten), "e1", "e2", "e3", "e4" sind die Kanten des Graphen und die Matrix zeigt die Entitäten und Aktionen, die wir mit ihnen machen können. Mit dem Knoten "1" können wir die Aktionen "e1", "e2" und "e3" ausführen, aber die Aktion "e4" ist für den Knoten "1" nicht verfügbar. Diese Methode ist sehr hilfreich beim Erstellen einer Reihe von Testfällen.

Stellen Sie sich vor, der Tester hat eine Liste von Entitäten und Aktionen erhalten, die mit diesen Entitäten ausgeführt werden können. Mit dieser Matrix kann er die Anzahl der Testfälle reduzieren. Die Reduzierung der Anzahl der Tests ist ein sehr wichtiger Bestandteil des Softwaretestprozesses. Das Testen von Software hängt in hohem Maße von der Reduzierung der Anzahl der Testfälle ab. Mit diesem Ansatz werden die Testabdeckung und die Vermeidung von Redundanz maximiert.
Das Ziel von Software-Testern ist es, das Produkt mithilfe effektiver Testfälle abzudecken, mit denen Sie alle möglichen Kombinationen von Aktionen testen können. Tester können mit minimalem Aufwand mithilfe diskreter mathematischer Ansätze (Algorithmen) erfolgreich sein, um den optimalen Satz von Testfällen zu finden und die Effektivität des Softwaretestprozesses zu maximieren.
Diskrete Mathematik hilft uns auch zu verstehen, wie Software tatsächlich erstellt wird, da jede Software Algorithmen und Methoden der diskreten Mathematik und der mathematischen Logik verwendet. Wenn wir verstehen, wie dies funktioniert, können wir daher Fehler oder Probleme im Programm finden, die vom Benutzer nicht erkannt werden können.
Petri-Netze
Schauen wir uns ein Beispiel an, wie die Anwendung mit Petri-Netzen (dynamischer Graph) auf Mikroservice-Technologie funktioniert:

Hier sehen wir, dass das System einen Anfangszustand hat und ein Signal empfangen sollte, das von einem anderen Dienst gesendet wird (eine Markierung erscheint). Abhängig vom Ergebnis sollte die folgende Aktion ausgeführt werden. Somit zeigt das Petri-Netz die Dynamik des gesamten Systems. Wenn ein Problem vorliegt, können wir den Defekt schneller lokalisieren.
Neuronale Netze
Künstliche neuronale Netze basieren ebenfalls auf Graphprinzipien. Sie ahmen die Verarbeitung von Informationen durch Neuronen des menschlichen Gehirns nach. Jeder Teil des neuronalen Systems basiert auf einem Diagramm, das "Eingabeknoten", eine "verborgene" Schicht und "Ausgabeknoten" enthält.

Einige Daten gehen an die Eingabeschicht, und Algorithmen für versteckte Schichten verarbeiten diese Daten und senden das Ergebnis an die Ausgabestufe. Somit kann ein neuronales Netzwerk Aktionen basierend auf diesen Daten ausführen. Neuronale Netze bestehen auch aus vielen ähnlichen Graphen mit unterschiedlicher Logik, sodass sie Entscheidungen basierend auf Eingabeparametern treffen können.
Millenniumstests
Unser letztes Beispiel für die Verwendung diskreter Mathematik beim Testen besteht darin, einen Softwaretestprozess zu erstellen. Derzeit gibt es viele Methoden und Ansätze, die als „Millenium-Tests“ bezeichnet werden und lange vor ihrer tatsächlichen Verwendung entwickelt wurden, beginnend in den 2000er Jahren, als sich die Softwareentwicklung schnell zu entwickeln begann.
BDD (Behavior Driven Development) ist Teil des sogenannten Millenium Testing. Diese Methode ist eine Erweiterung von TDD (Test Driven Development). Mit BDD können Tester eine engere Beziehung zwischen den Akzeptanzkriterien für eine bestimmte Funktion und den Tests herstellen, die zum Testen dieser Funktionalität verwendet werden. BDD kann strukturierte Anweisungen in einer natürlichen Sprache in ausführbare Tests umwandeln und so der Geschäftsseite und der Entwicklungsseite mehr Klarheit und Verständnis verleihen, da sie eine gemeinsame Sprache sprechen. Die Grundstruktur des BDD-Workflows basiert ebenfalls auf einem dynamischen Diagramm (Petri Net).

Wie aus dieser Struktur ersichtlich ist, wird jeder Prozess von einem anderen Prozess begleitet und kann erst nach Abschluss der vorherigen Stufe zur nächsten Stufe übergehen. Wieder einmal helfen uns die Prinzipien der diskreten Mathematik, den Prozess effizienter zu verstehen.
Abschließend möchte ich noch einmal die Vorteile der Verwendung diskreter Mathematik im Softwareentwicklungsprozess auflisten:
- Unterstützung beim Verständnis der Geschäftslogik der erforderlichen Funktionalität
- Vereinfachen Sie die Möglichkeit, komplexe Aufgaben in einfachere zu unterteilen
- So können Fachleute mit weniger Aufwand effektive Tests durchführen
- Helfen Sie dabei, die Struktur von allem, was wir wollen, zu verstehen und zu visualisieren
Die obigen Beispiele zeigen, wie diskrete Mathematik verwendet werden kann, um die Testleistung effektiv zu steigern. Jeder Aspekt der diskreten Mathematik kann Entwicklern helfen, den allgemeinen Software-Workflow und seine Prinzipien während des gesamten Lebenszyklus der Softwareentwicklung zu verstehen.