Wird es als "schlechte Praxis" angesehen, den Inhalt / die Kodierung von Dateien in Komponententests zu überprüfen?

84

Ein bisschen Kontext: Früher musste ich heute einen SQL-Code aktualisieren, den ein anderer Kollege von mir bereitgestellt hatte, und da es ein ziemlich großes Skript ist, wird es als separate Datei gespeichert (die dann zur Laufzeit gelesen und ausgeführt wird). Dabei habe ich versehentlich zwei Bugs wieder eingeführt, die wir vor ein paar Monaten hatten, nämlich:

  • Aus welchem ​​Grund auch immer, die ASCII-Datei wurde in UTF-16 verschlüsselt (der Kollege hat mir die Datei per E-Mail geschickt, was sie möglicherweise verursacht hat).
  • In dem Skript fehlten die ersten SETAnweisungen (erforderlich aufgrund einiger Treiberprobleme in der Produktion, jedoch nicht bei einer lokalen Neuinstallation).

Nachdem ich dies ungefähr eine Stunde lang (erneut) debuggt hatte, habe ich mich dazu entschlossen, einige Komponententests zu schreiben, um sicherzustellen, dass dies nie wieder vorkommt (und eine schnelle Möglichkeit, dies zu beheben, in die Bestätigungsnachricht aufzunehmen, um zukünftigen Entwicklern eine einfache Lösung zu bieten).

Als ich diesen Code drückte, kam ein anderer Kollege (der auch unser Teamleiter ist) auf mich zu und sagte mir, ich solle diese Dinge nicht noch einmal machen, weil:

"Diese Dinge gehören nicht in Unit-Tests"

"Unit-Tests sollten nur verwendet werden, um den Fluss Ihres Codes zu überprüfen"

Ich bin jetzt ziemlich konfliktreich, da ich immer noch der Meinung bin, dass das, was ich tue, nicht falsch ist, da dieser Bug in Zukunft nicht wieder eingeführt werden würde. Allerdings arbeitet dieser Kollege als Senior und kann am Ende des Tages entscheiden, was Wir verbringen unsere Zeit auf. Was soll ich machen? Liege ich falsch, wenn ich das so mache? Gilt es als schlechte Praxis?

Paradoxis
quelle
35
" Unit-Tests sollten nur verwendet werden, um den Fluss Ihres Codes zu überprüfen ", würde ich sagen, das ist Schwachsinn. Traditionell sollten sie alle erforderlichen Tests enthalten, um sicherzustellen, dass die "Einheit", die isoliert betrachtet wird, korrekt ist. Wenn Sie nur die Komponententests schreiben, die nützlich sind, um "den Fluss zu überprüfen", hoffe ich, dass Sie auch separate umfangreiche Testsuiten haben (geschrieben von der QS-Abteilung?).
31.
8
Das Problem Ihres Kollegen ist wahrscheinlich, wo Sie diese Tests ablegen. Ich würde mich darauf konzentrieren und Konfessionsdiskussionen / heilige Kriege beiseite lassen. Es ist möglich, dass diese Tests für die Suite, zu der Sie sie hinzugefügt haben, zu langsam sind, aber es ist auch durchaus möglich, dass Ihr Kollege nur auf seine Idee von Komponententests fixiert ist und aus einem nicht vorhandenen Problem ein Problem macht. Daher ist es besser, zunächst zu klären, wo das eigentliche Problem liegt.
31.
2
Übrigens sehen diese Tests so aus, als würden Sie sie jedes Mal ausführen, wenn Sie diese SQL-Datei ändern. Das Hauptproblem könnten hier die Testtools sein, die einen Betriebsmodus "nur bei Änderung ausführen" möglicherweise nicht unterstützen. Wenn dies zu echten, konkreten Problemen führt, kann es sich lohnen, die "nur wenn geändert" -Funktionalität manuell mit einigem Aufwand nur für diese spezifischen Tests aufzunehmen.
31.
5
Anstatt zu testen, ob die Datei den richtigen Inhalt und die richtige Kodierung hat, testen Sie, ob sie funktioniert .
immibis

Antworten:

156

Höchstwahrscheinlich sind die von Ihnen geschriebenen Tests näher an Integrations- oder Regressionstests als an Komponententests. Während die Zeile sehr unscharf sein kann und sich manchmal in Pedanterie über das, was ein Komponententest ist oder nicht, entwickelt, gehe ich zu Ihrem Kollegen zurück und frage, wo die von Ihnen geschriebenen Tests liegen sollten, da sie einen Mehrwert bieten und die Richtigkeit des Codes sicherstellen.

Ich würde mich nicht zu sehr auf das konzentrieren, was ein Komponententest ist oder nicht, und mir ist klar, dass der Test auch dann noch einen Wert haben kann, wenn es sich um einen Integrationstest handelt.

RubberChickenLeader
quelle
Kommentare sind nicht für eine längere Diskussion gedacht. Diese Unterhaltung wurde in den Chat verschoben .
Thomas Owens
36

Technisch gesehen handelt es sich nicht um einen Komponententest, sondern eher um einen Validierungsschritt. Der richtige Ansatz hängt wirklich davon ab, wie Ihr Workflow aussehen muss. Ihr Teamleiter ist in Bezug auf den Zweck von Komponententests korrekt. Mein Gefühl ist, dass dies der Fall ist, wenn für eine noch zu erledigende Aufgabe das falsche Werkzeug verwendet wird. Also fang damit an:

Was ist das Problem, das ich zu lösen versuche?

Anhand der Beschreibung müssen Sie überprüfen, ob alle Datenbankskripts bestimmten Standards entsprechen.

Welche Tools / Prozesse stehen zur Verfügung, um das Problem zu lösen?

Die Qualität des Quellcodes wird normalerweise mit statischen Analysewerkzeugen überprüft . Wenn Sie kein statisches Analysetool zur Validierung Ihres SQL haben, können Sie ein schnelles und unsauberes Tool erstellen, das die Überprüfung aller an dieses Tool übergebenen SQL-Dateien durchführt. Es tut nicht weh, zu überprüfen, ob es statische Analysetools gibt, die die von Ihnen angesprochenen Probleme lösen können.

Wenn Sie diesen Teil Ihrer Build-Infrastruktur hinzufügen, z. B. in Jenkins oder ähnliches, kann er auf alle SQL-Dateien in Ihrem Projekt angewendet werden.

Die Unit-Tests lösen nur das Problem für Ihre aktuelle Datei.

Wie kommuniziere ich den Bedarf an dem Tool?

Das ist ziemlich einfach, Sie sprechen mit Ihrem Teamleiter. Er kann mit dem Produktbesitzer und Ihnen zusammenarbeiten, um das Risiko und den Nutzen einer Investition in das Werkzeug zu bestimmen. Wenn dies wahrscheinlich ein einmaliges Problem ist, wäre das Werkzeug wahrscheinlich zu viel des Guten. Wenn das Werkzeug zum Auffinden der größten Probleme einfach ist, lohnt es sich möglicherweise nur für die Plausibilitätsprüfung.

Ihr Teamleiter hat möglicherweise einige Ideen, die Sie (oder ich) nicht berücksichtigt haben, um das Problem besser anzugehen.

Berin Loritsch
quelle
21
Bei der Diskussion von Kosten und Risiko sollte beachtet werden, dass es bereits zu Zeitverlusten gekommen ist, da zuvor behobene Fehler wieder aufgetreten sind. Dies allein ist ein starkes Argument, um die Überprüfung zu automatisieren. +1
jpmc26
1
@ jpmc26, da stimme ich voll zu. Die Diskussion sollte mit der Tatsache beginnen, dass Sie so viele Stunden verloren haben, um herauszufinden, was falsch war, und dass Ihre Unit-Tests Ihr erster Versuch waren, den Rest des Teams daran zu hindern, die gleiche Zeit zu verlieren. Die Zusammenarbeit mit dem Teamleiter, der sich gegenüber dem Management und den Stakeholdern verantworten muss, wird in der Regel sehr geschätzt. Als Teamleiter möchte ich in der Lage sein, die von uns verwalteten Tools / Praktiken / Codes zu verteidigen. Wenn ich Unit-Tests sehen würde, die sich nicht auf die tatsächlichen Anforderungen zurückführen lassen, wäre ich ebenfalls besorgt.
Berin Loritsch
1
@BerinLoritsch Technisch ist es kein Komponententest. Ich würde wirklich gerne wissen, auf welche "Technik" Sie diese Behauptung stützen. Soweit ich das beurteilen kann, gibt es keine einheitliche maßgebliche Definition von Komponententests, und jeder hat seine eigene Vorstellung davon, was " sie " sind.
31.
2
@gbr Zwischen den Entwicklern besteht eine informelle Vereinbarung, dass Komponententests Tests sind, die isoliert von externen Systemen ausgeführt werden. Sie testen nur den Code selbst, nicht die Interaktion mit Dateien, Datenbanken oder anderen externen Diensten. Wikipedia dokumentiert dieses Verständnis: en.wikipedia.org/wiki/Unit_testing#External_work .
jpmc26
1
@BerinLoritsch Es ist auch möglich, dass wir die Frage alle anders interpretieren, jedenfalls war sie nicht sehr detailliert und der Autor ist noch zu niemandem zurückgekehrt. Ich bin sowieso nicht sehr daran interessiert, weiter über die Klassifizierung dieser Tests zu diskutieren. Wichtig ist, ob sie vorhanden sind (ich bin mir ziemlich sicher, dass sie vorhanden sind) und wie oft sie ausgeführt werden sollen (bei jeder Änderung in der IDE, bei jeder Änderung) lokales Commit, bei jedem Push an das zentrale Repository, zu jedem Zeitpunkt ...).
2.
19

Es ist keine gute Praxis, Tests, die auf Dateien zugreifen, "Unit-Tests" zu nennen.

Er: "Diese Dinge gehören nicht in Unit-Tests"

Sie: "Macht Sinn, aber ich konnte keinen besseren Ort finden, um sie unterzubringen. Wo gehören sie hin?"

Leider ist es völlig unternehmensspezifisch, welche Arten von Tests es gibt und wie sie organisiert sind. Sie müssen also herausfinden, wie Ihr Unternehmen mit diesen Tests umgeht.

Wenn Sie noch keine andere Möglichkeit haben, automatisierte Tests als Komponententests durchzuführen, besteht der pragmatische Ansatz darin, die Komponententests, die eigentlich keine Komponententests sind, mit einem Präfix zu kennzeichnen, bis Sie genug davon haben, um herauszufinden, was für eine Art von Tests, die Sie tatsächlich haben / brauchen. Danach können Sie mit der Organisation beginnen.

Peter
quelle
2
Es ist keine gute Praxis, Tests, die auf Dateien zugreifen, "Unit-Tests" zu nennen. Hier ist die Datei, auf die zugegriffen wird, die Quelldatei . Es wird genauso oft darauf zugegriffen wie auf eine Quelldatei (um sie zu analysieren). Die Tatsache, dass der Test wahrscheinlich nicht in der gleichen Sprache wie die zu prüfende "Einheit" (SQL) durchgeführt wird, macht ihn unorthodox, sollte jedoch keinen Einfluss auf seine Einstufung als Einheitentest haben. geht weiter ...
gbr 31.10.17
1
... Tatsächlich ist die korrekte Codierung einer Datei ein "Test", den jeder Compiler jedes Mal durchführt, wenn er eine Quelldatei liest. Hier besteht das Problem darin, dass die "Compilertests" als externe Datei, die zur Laufzeit interpretiert wird, nicht automatisch ausgeführt werden. Daher ist es durchaus angebracht, sie explizit hinzuzufügen, und ich denke, dass dies zu Recht als "Komponententest" betrachtet werden kann SQL-Snippet. Und es erscheint vernünftig, es in die (potenzielle) Testsuite aufzunehmen, die bei jeder Änderung der Datei ausgeführt wird.
31.
3
Im Übrigen wird generell davon abgeraten, auf externe Dateien zuzugreifen, wenn dies durch einen Schein oder etwas Ähnliches ersetzt werden kann. Und von den meisten Definitionen Unit - Tests können externe Dateien zugreifen oder was auch immer, es ist nur dringend empfohlen , vor, da es eine Menge Dinge verlangsamen. Ein Geschäft kann frei vorschreiben, dass Sie der am häufigsten ausgeführten Testsuite keine Tests hinzufügen können, die auf Dateien zugreifen, diese Tests jedoch nicht der Bezeichnung "Komponententest" unwürdig machen, sondern nur "nicht" um in die am häufigsten ausgeführten Testsuiten dieses Projekts aufgenommen zu werden ".
31.
2
@Warbo Es ist eine schlechte Praxis, auf Dateien zuzugreifen (im Allgemeinen), und der (wichtigste) Grund ist, dass sie nicht langsam sind, wenn es sich um "GBs handelt, die über einen flockigen NFS-Link gelesen werden", sondern langsam, wenn z. B. Michael Feathers zitiert wird Sie brauchen eine Zehntelsekunde. Das liegt daran, dass Sie Ihre Tests so häufig wie möglich ausführen möchten, idealerweise bei jeder Änderung, die Sie an der IDE vornehmen, und wenn Sie viele davon haben (wie Sie sollten), summieren sich sogar Zehntelsekunden zu Stunden. (Fortsetzung ...)
2.
1
@Warbo .. Das heißt, was zählt, ist die Gesamtzeit, die sie benötigen. Wenn Sie also ein sehr kleines Projekt haben, von dem Sie sicher sind, dass es klein bleibt, können Sie die Geschwindigkeit der einzelnen Tests viel nachsichtiger beurteilen. Und wenn Sie sie wirklich nicht häufig ausführen möchten, können Sie sie sogar einen OPMROC-Mitarbeiter anrufen lassen, um ihnen eine Datei aus einem Schrank zu schnappen und zu faxen. Sie können sich auch dafür entscheiden, lockerer zu sein, während Sie noch wenige Tests haben, und diese beschleunigen, wenn sie zu viel kosten. Sie müssen jedoch berücksichtigen, dass dies eine Schuld ist, die Sie akkumulieren.
2.
14

Michael Feathers sagt dies in seinem Buch Effective Working With Legacy Code:

In der Industrie wird oft hin- und hergegangen, ob es sich bei bestimmten Tests um Komponententests handelt. [...] Ich gehe auf die beiden Eigenschaften zurück: Läuft der Test schnell? Kann es uns helfen, Fehler schnell zu lokalisieren?

Hilft Ihr Test, Fehler schnell zu lokalisieren und schnell auszuführen? Wenn ja, dann mach es! Wenn nein, dann nicht! So einfach ist das!

Davon abgesehen arbeiten Sie in einem Umfeld mit anderen Menschen und müssen mit ihnen auskommen. Möglicherweise müssen Sie es auf seine Weise tun, auch wenn Sie privat nicht damit einverstanden sind.

CJ Dennis
quelle
Es ist eine gute Faustregel, aber er hätte Verwirrung gescheut, wenn er geschrieben hätte, " ob der am häufigsten ausgeführten Testsuite bestimmte Tests hinzugefügt werden sollen ", anstatt mit dem Begriff "Komponententest" herumzuspielen.
31.
1
@gbr Wenn die Testergebnisse korrekt sind, ist es nur wichtig, wie schnell der Test ausgeführt wird. Wenn ich 100 Tests habe, die jeweils unter 0,1 s laufen, laufen sie insgesamt in weniger als 10 s. Ich bin glücklich, sie häufig laufen zu lassen. Wenn ich 1000 Tests habe, werden sie bis zu 1m40s dauern. Das ist zu lang, ich werde sie nicht häufig ausführen, aber ich werde sie ausführen, sobald ich die Änderungen mit der kleineren Gruppe von 100 Tests vorgenommen habe. Es ist mir egal, ob es technisch ein Abnahmetest oder etwas anderes ist. Wenn es mir hilft, Fehler früher zu finden, mache ich das unabhängig von der Semantik. Ein Test liefert nur dann einen Wert, wenn er ausgeführt wird.
CJ Dennis
Ich stimme größtenteils zu (Unabhängigkeit ist eine andere sehr wichtige Sache, zB), aber es wäre trotzdem besser gewesen, wenn Michael Feathers die Verwirrung darüber, was "Einheitentest" bedeutet, nicht verstärkt hätte. Nicht, dass er besonders für diese Verwirrung verantwortlich ist (und sein Buch ist in den Teilen, die ich bisher überflogen habe, ausgezeichnet). Ich machte jedenfalls einen eher kleinen Punkt.
1.
@gbr Er definiert Unit-Tests nicht neu, er sagt, dass dies nicht Ihr Einschlusskriterium sein sollte. Ihr Kriterium sollte Nützlichkeit sein, und das definiert er.
CJ Dennis
Ich habe diesen Abschnitt noch einmal gelesen. Ich bin mir nicht sicher, es ist mir unklar, ob das eine (Art) Definition oder nur ein Kriterium sein soll. Aber tatsächlich könnte " Kann es uns helfen, Fehler schnell zu lokalisieren " die Dinge implizieren, die er vorher gesagt hat, über Isolation usw. Also hätte ich vielleicht ein wenig Aufhebens um nichts gemacht (obwohl deine Antwort allein immer noch falsch interpretiert werden könnte)
gbr
10

Ich habe gelegentlich ähnliche Tests für Quellcodedateien, Konfigurationsdateien usw. geschrieben. Ich würde sie nicht Unit-Tests nennen, weil (a) sie auf das Dateisystem zugreifen und möglicherweise nicht ultraschnell sind CI-Server).

Sie könnten sie Integrationstests nennen; Mit Sicherheit sind sie dieser Perspektive näher als Unit-Tests.

Meine eigene Bezeichnung für sie ist Ressourcentests . IMHO, sie sind absolut gerechtfertigt, wenn sie jede Nacht auf einem CI-Server ausgeführt werden: Es gibt nur minimale Kosten und bei vernünftiger Verwendung wird ein klarer Mehrwert erzielt. Eine Definition von vernünftigerweise : Wenn der Test ein Problem überprüft, das ein Problem verursacht hat (z. B. die von Ihnen erwähnte Codierung).

Michael Easter
quelle
4

Bei einem Unit-Test geht es darum, eine Methode oder 'Unit'-Code zu testen. Sie testen die kleinste Gruppe von Logik und Code in Ihrer Software.

Wenn Sie dies später mit anderen Einheiten verbinden, führen Sie Integrationstests durch.

Ich hoffe, Ihr Teamleiter hat Ihre Initiative gefördert und hätte alternative Vorschläge unterbreiten sollen. Sie haben definitiv die richtige Idee.

Ihr SQL ist Code wie jede Sprache niedrigerer Generation wie C # oder Java und sollte als solcher getestet werden. Verifikation und Validierung gehören zu allen Teststufen. Daher werden Codierungs- und SET-Anweisungen eingeschlossen, aber nicht unbedingt exklusiv getestet. Allgemeine Dinge wie Zeilenenden oder das Einschließen können Sie normalerweise nur mit einem SCM-Hook oder einer SCM-Funktion erledigen.

Es wird empfohlen, Regressionstests durchzuführen, um sicherzustellen, dass frühere Bugs nicht erneut auftreten. Im Allgemeinen werden Tests zusammen mit jeder Fehlerbehebung erstellt. Wenn diese Fehler nicht durch Regressionstests auf Einheiten- / Integrations- oder Systemebene abgedeckt und dann wieder eingeführt werden, handelt es sich um ein Teamproblem, ein Prozessproblem, kein individuelles Problem.

Die Sache ist ... Syntaxfehler, fehlende Anweisungen oder Logikblöcke in einer 'Einheit' werden normalerweise nicht getestet. Sie testen die Ein- und Ausgänge des Geräts in verschiedenen Kombinationen und testen die vielen Möglichkeiten, die generiert werden können.

Zurück zu den fehlenden SET-Anweisungen - Sie informieren über die zahlreichen Ein- und Ausgabemöglichkeiten, auf die getestet werden muss. Welchen Test würden Sie schreiben, der fehlschlagen würde, wenn Sie ein ausgewähltes SET verpassen würden?

Ross
quelle
Das Testen von Codeeinheiten ist ein Ansatz für das Testen von Einheiten. Nach meiner Erfahrung führt dies zu fragilen Tests und massivem Aufblähen (z. B. übermäßiges Verspotten). Ein alternativer und meiner Meinung nach besserer Ansatz zum Testen von Einheiten ist "Einheit der Funktionalität". Es spielt keine Rolle, ob für einige Funktionen (z. B. "Setzen eines Cookies beim Anmelden") eine Methode oder ein Dutzend miteinander kommunizierende Prozesse erforderlich sind, es handelt sich immer noch um eine Einheit.
Warbo
@ Warbo - Ich würde das näher an (aber nicht) Integrationstests nennen. Unit-Tests erfordern keine übermäßigen oder massiven Maßnahmen. Unit-Tests sollten klein und schnell sein. Tatsächlich führt das Testen nach Funktionalität zu dem, was Sie beschreiben. Fragile Tests sind solche, die 1. größer sind oder mehr leisten, als sie sollten. 2. hoch gekoppelt 3. haben keine einzige Verantwortung.
Ross
3

Wenn Sie Dateien haben, die Teil Ihres Produkts werden, muss deren Inhalt korrekt sein. Kein Grund, warum Sie dies nicht bestätigen würden. Wenn Sie beispielsweise in einem Ordner sechs 1024x1024-Bilder benötigen, schreiben Sie auf jeden Fall einen Komponententest, der überprüft, ob Sie genau das haben.

Aber Sie haben wahrscheinlich nicht nur die Dateien, sondern auch Code, der die Dateien liest. Sie könnten einen Komponententest für diesen Code schreiben. Im obigen Beispiel gibt die Funktion zum Lesen eines der sechs Bilder ein 1024 x 1024-Bild im Speicher zurück (oder was auch immer es erzeugen sollte).

Wie auch immer, es ist vielleicht kein Komponententest, aber es ist ein nützlicher Test. Und wenn Sie ein Unit-Test-Framework verwenden, mit dem Sie einen nützlichen Test durchführen können (das ist kein Unit-Test), warum nicht das Unit-Test-Framework verwenden?

gnasher729
quelle
2

Vielleicht verstehe ich Ihr Problem falsch, aber für mich klingt dies nach einem Problem, das nicht durch einen speziellen Test erfasst werden muss, sondern nur durch das Versionskontrollsystem . Jede Änderung an einer Codebasis sollte vor dem Festschreiben Patch für Patch überprüft werden. Eine einfache Möglichkeit, dies in git zu tun, besteht darin, die Änderungen mit hinzuzufügen

git add -p

Dabei werden Sie bei jeder Änderung in einer Textdatei vom Arbeitsverzeichnis gefragt, ob Sie diese wirklich behalten möchten. Auf diese Weise können Sie beispielsweise die Löschung dieser „ursprünglichen SETAussagen“ sehen.

Falls sich die Codierung einer gesamten Datei ändert, würde jedoch etwas anderes passieren: Der Algorithmus würde alte und neue Datei nicht unterscheiden und daher git add -püberhaupt nichts hinzufügen. Dies würde dann in dem anderen Befehl sichtbar sein, den ich vor einem Commit ausführen würde, nämlich

git status

Hier würden Sie die Datei in rot markiert sehen, was darauf hinweist , dass es sind Änderungen. Die Untersuchung, warum dies nicht gelang, git add -pwürde das Problem schnell offensichtlich machen.

links herum
quelle
bitte sag, wie hilft das einem zukünftigen Entwickler, genau dasselbe Problem zu vermeiden? ... Die Sache mit automatisierten Tests (die auch für Behauptungen und Design-by-Contract gelten) ist, dass sie gut, ähm, automatisiert sind .
Vaxquis
@vaxquis verhindert genau dasselbe Problem - wenn auch eher zufällig, als Nebeneffekt eines Workflows, der aus verschiedenen Gründen eine gute Idee ist. Mein Punkt ist, dass dieses Problem bei allen Shows auftreten kann, bei denen das OP-Team sein VCS nicht sehr gut ausgenutzt hat. - Nichts gegen automatisierte Tests, aber ihr Wert besteht darin, semantische Eigenschaften zu testen, die durch harmlose Änderungen an der Programmlogik zerstört werden könnten. Es geht nicht darum, jede mögliche dumme Art und Weise zu überprüfen, in der sich der Quellcode ändern könnte.
links um den
Ihrer Logik nach brauchen wir keine Sicherheitsgurte. wir müssen nur vorsichtiger fahren und weniger Unfälle verursachen ... Sie haben den Hauptpunkt des OP verpasst - den eines menschlichen Fehlers . Keine Menge an VCS kann Sie davor schützen . FWIW: Wenn ein Test automatisiert werden kann, sollte er automatisiert werden. Menschen sind immer die schwächsten Glieder in technischen Prozessen. gitist das beste Beispiel dafür - ein großartiges Werkzeug, das jedoch für Sterbliche kaum unbrauchbar ist .
Vaxquis
@vaxquis Nein, nein! Sicherheitsgurte sind analog zu den Tests, die Sinn machen: Sie erfassen eine Vielzahl von Situationen, die wahrscheinlich zufällig auftreten. Ein Test zur Dateicodierung wäre analog zu einem Roboter, der Ihnen folgt und Sie daran hindert, sich selbst zu ersticken, indem Sie Bohnen in die Nase stopfen.
linksum den
Nach dem OP, Dateien im falschen Format geschehen zweimal schon, so offensichtlich sie sind wahrscheinlich zufällig auftreten.
gnasher729
1

Ein weiterer zu berücksichtigender Aspekt: ​​Da diese beiden Bedingungen für die Ausführung Ihres Programms erforderlich sind, sollten Sie die Logik nicht in die Nähe der Ausführungslogik einbetten. Ich meine: Sie testen das Vorhandensein einer Datei, bevor Sie sie lesen und / oder ihren Inhalt überprüfen, oder? Wie ist das anders? Ich denke, da dies eine Code-externe Ressource ist, sollte sie zur Laufzeit überprüft werden, bevor sie tatsächlich verwendet wird. Ergebnis: Stärkere App, keine zusätzlichen Tests erforderlich.

Dr. Gianluigi Zane Zanettini
quelle
1
Wie macht ein Ausfall nur zur Laufzeit eine stärkere App aus? Sicher, es kann angebracht sein, auch Laufzeitprüfungen in der Nähe der Ursache des Problems durchzuführen, aber wenn Sie Fehler erkennen können, bevor sie zu Laufzeitproblemen führen, ist dies doch viel besser, oder? Sind Sie sicher, dass Sie mit automatischen Tests vertraut sind?
31.
1
"Wie macht es ein Fehler, der nur zur Laufzeit auftritt, zu einer stärkeren App?" Eine Ausnahme auslösen, wenn die Prüfung fehlschlägt. Überprüfen Sie in Ihrem Test lediglich, ob der zu testende Codeabschnitt das erwartete Ergebnis liefert. Auf diese Weise müssen Sie keinen weiteren Grund für den Fehler mehr prüfen .
Dr. Gianluigi Zane Zanettini
1
Ihre Strategie hat (fast) nichts mit Unit-Tests und automatisierten Tests im Allgemeinen zu tun. Es ist eine andere Sache mit unterschiedlichen Verwendungszwecken.
1.
1
Ich würde das vorschlagen. Der Fehler ist ein Implementierungsdetail. Ich stelle mir vor, die Antworten wären sehr unterschiedlich, wenn die zweifelhafte Codierung in einem privaten Bereich statt in einer eigenständigen Datei wäre! Es hört sich so an, als hätte OP zwei Probleme: Ressourcendateien sind möglicherweise falsch codiert, und die Produktion verhält sich anders als bei dev. Indem wir die Datei zur Laufzeit überprüfen, kurz bevor sie verwendet wird, lösen wir das zweite Problem: dev und prod lösen den gleichen Fehler aus. Unit-Tests können sich dann eher auf die tatsächliche Funktionalität als auf die Implementierungsdetails konzentrieren. Diese "internen" Prüfungen werden wie private Methoden durchgeführt.
Warbo
1
@ Dr.GianluigiZaneZanettini Bah ... Ich gebe auf ... Wie ich sehe, war Ihre Antwort nach Ihren "Klarstellungen" in den Kommentaren bestenfalls nicht zum Thema (keine Antwort auf die Frage), sondern in Wirklichkeit. so wie es ist, ist es einfach falsch! keine Notwendigkeit, zusätzliche Tests zu schreiben ??? Ich habe nicht genug Reputation, um es abzulehnen, aber überlege, als ob ich es getan hätte. Und ich glaube nicht, dass es viel wert ist, dieses Gespräch fortzusetzen.
2.
1

Tests sind derselbe Code wie alle anderen und, wenn sie komplex genug sind, profitieren Sie auch von ... Unit-Tests. Scheint am einfachsten, solche Voraussetzungsprüfungen direkt in den Test aufzunehmen.

Die meisten Tests sind einfach genug, um dies nicht zu erfordern, aber wenn einige komplex genug sind, sehe ich bei diesen Voraussetzungsprüfungen nichts grundsätzlich Falsches. Natürlich sollte der Test auch ohne sie fehlschlagen, aber ein guter Unit-Test zeigt auch an, welche Unit ausfällt .

Ein Skript, das als Teil des Tests verwendet wird und bestimmte Inhalte und Codierungen haben muss, ist wahrscheinlich eine Einheit. Es enthält möglicherweise viel mehr Code und Logik als der Rest des Tests. Ein Test mit einem solchen Skript ist nicht das beste Design aller Zeiten und sollte nach Möglichkeit direkter überarbeitet werden (es sei denn, es handelt sich um einen Integrationstest).

h22
quelle
1
Der Autor sagt nirgendwo, dass dieses SQL-Skript Teil eines Tests ist. Sie haben die Frage anscheinend falsch verstanden
gbr
Es ist schwer zu verstehen, ich gehe davon aus, dass das SQL-Skript Teil des Tests ist.
22.
Ihr Kommentar "Es ist schwer zu verstehen" ...
gbr
Schwierig zu verstehen. Die Frage ablehnen.
h22
1

Erstens - einer der Testzwecke besteht darin, zu verhindern, dass sich Probleme in Ihrem Code wiederholen - sollten Sie unbedingt weiterhin Tests dieser Art schreiben.

Zweitens ist die Benennung schwierig. Ja, dies sind eindeutig keine "Komponententests", aber sie können wünschenswerte und notwendige Teile des Erstellungsprozesses sein, weil sie Sie vor offensichtlichen Fehlern schützen und Sie früher über Fehler informieren (insbesondere, wenn Sie die nicht sehen) Folgen für eine Dev-Box).

Die Frage ist (sollte in Ihrem Kontext stehen), wann und wie diese Tests durchgeführt werden.

Ich habe diese Art von Test in der Vergangenheit ausgiebig genutzt - sie haben uns ein gutes Stück Schmerz erspart.

Murph
quelle
Und wenn jemand die Ablehnung erklären möchte, wäre ich dankbar
Murph
1

Bei Komponententests wird eine Codeeinheit isoliert ausgeführt, um zu bestätigen, dass sie das richtige Ergebnis für die richtige Eingabe liefert. Die Isolierung sollte sowohl den Prüfling als auch den Test selbst wiederholbar machen, dh nicht von Nebenwirkungen abhängen oder diese hervorrufen.

SQL ist nicht genau etwas, das isoliert getestet werden kann. Daher ist jeder SQL-Test nicht genau ein Komponententest und hat mit Ausnahme von SELECT-Anweisungen mit ziemlicher Sicherheit Nebenwirkungen. Wir können es eher einen Integrationstest als einen Komponententest nennen.

Es ist immer ratsam, sicherzustellen, dass ein eventuell auftretender Fehler so früh wie möglich im Entwicklungszyklus erkannt werden kann, und dies auf eine Weise, die es einfach macht, die Fehlerquelle zu identifizieren, damit er schnell gefunden werden kann korrigiert.

Die fraglichen Tests können geeigneterweise aus dem Hauptteil der "Einheitentests" ausgelagert und an einer anderen Stelle platziert werden, sollten jedoch nicht vollständig entfernt werden, wenn sie etwas Nützliches tun, wie das Schützen vor der möglichen Einführung eines Fehlers, dessen Verfolgung Stunden dauern kann Nieder.

Zenilogix
quelle