Unit Testing, Naturwissenschaften und Mathematik


Vorwort


Unit-Tests werden häufig verwendet. Es scheint, dass niemand ohne ihn auskommen kann, jeder schreibt Tests und ihre Abwesenheit in einem ernsthaften Projekt führt zumindest zu Missverständnissen. Viele empfinden das Testen jedoch als ein Ritual, das durchgeführt wird, um den „Programmiergott“ nicht zu verärgern. Wie, es ist notwendig . Warum? Weil .


Ich werde beängstigende Dinge sagen.


Es spielt keine Rolle, was als Testeinheit verwendet werden soll. Es spielt keine Rolle, wie die Tests gruppiert sind. Es spielt keine Rolle, ob sie vor oder nach dem Code geschrieben werden. TDD oder nicht TDD? Egal. Anteil der Deckung? Mach dir nichts draus. Schließlich gibt es möglicherweise überhaupt keine Tests. All dies ist völlig irrelevant. Es ist wichtig, dass die Softwareanforderungen erfüllt sind.


Unit-Tests sind kein Ritual, sondern ein gutes Arbeitsinstrument, mit dem Sie diesen Anforderungen näher kommen können. Und dieses Tool muss korrekt verwendet werden können.


Warten Sie, wo kommt die Wissenschaft mit Mathematik ins Spiel?


Inhalt



  1. Garantien und Wahrscheinlichkeiten
  2. Programmieren als Theorie
  3. Testen als Beweis für Theoreme
  4. Was ist wichtig und was nicht
  5. Muss ich Tests testen?


Garantien und Wahrscheinlichkeiten


Ich werde zum hundertsten Mal nicht diskutieren, warum Tests erforderlich sind, wie viel sie helfen, dokumentieren, den Entwicklungs- und Refactoring-Prozess vereinfachen, Regressionen schließen usw.


Ich möchte darüber schreiben, wie man in Tests mehr als eine Reihe von Verpflichtungen, technischen Nuancen und Managementanforderungen erkennt. Damit die Tests keine Requisiten sind, die wackelige Strukturen vor sofortiger Zerstörung bewahren, sondern die Grundlage, auf der unsere Programme fest und sicher stehen.


, — . — . — . , , , , .


. . : , , 100%, .


.




"". , , , , . , , . "" "". , . , , "" , , . , "", , , .


, , , . , — , .


, , .




. "", "". "" "" "".


"" , , . "" — , , ( , ).


"" , , , , — . "" "" , , "".


"" , "" "", "" "", .


. , std::vector, clear. , "", .

? , (capacity). , "":
  1. clear() , size() ;
  2. clear() , empty() true;
  3. clear() , capacity() , clear().
  4. clear() , , , .


"" "":
test_case("   `clear()`    ")
{
    std::vector<int> v{1, 2, 3, 4};

    v.clear();

    check(v.size() == 0);
}


, "", ? .

, , . — , "". , "" "" , size(). "".

, "", std::vector<int> v{1, 2, 3, 4}. . , "", ? , , . ? , , ( , ).

"" , , : "", , , . , "".

"", size() , . : , . "", .

"" "".

, "", ( , ) .



,


, , , (, , - — — ). , "" "". — .


, , : , ( TDD ). — "". , , "", TDD, .


, . , , . , , .


, , , .




— , . , , . , . , .


So bewegen sich unsere metaphorische "Wissenschaft", dh Code und "objektive Realität", dh Tests, aufeinander zu, erreichen nie das Ideal, sondern erhöhen die gewünschte Wahrscheinlichkeit.


All Articles