Nehmen wir an, ich habe eine Art Unit-Test wie diesen:
let myApi = new Api();
describe('api', () => {
describe('set()', () => {
it('should return true when setting a value', () => {
assert.equal(myApi.set('foo', 'bar'), true);
});
});
describe('get()', () => {
it('should return the value when getting the value', () => {
assert.equal(myApi.get('foo'), 'bar');
});
});
});
So, jetzt habe ich 2 Unit-Tests. Man setzt einen Wert in einer API. Der andere testet, um sicherzustellen, dass der richtige Wert zurückgegeben wird. Der 2. Test ist jedoch vom ersten abhängig. Sollte ich im .set()
2. Test vor dem einen Test hinzufügen get()
, um sicherzustellen, dass der 2. Test von nichts anderem abhängig ist?
Sollte ich in diesem Beispiel auch myApi
für jeden Test instanziieren , anstatt ihn vor den Tests einmal auszuführen?
quelle
myApi
ist beispielsweise ein instanziiertes Objekt. Sollte ichmyApi
bei jedem Komponententest erneut angeben ? Oder kann die Wiederverwendung zwischen den Tests dazu führen, dass der Test falsch positive Ergebnisse liefert usw. Und ja, mein Beispiel ist eine vereinfachte Getter / Setter-Sache, aber in Wirklichkeit wäre es offensichtlich viel komplizierter.Versuchen Sie, für jeden Test der Arrangement-Act-Assert-Struktur zu folgen.
Ihre Tests machen sich nicht die Mühe, zuerst einen bekannten Status zu erstellen, daher sind sie für sich genommen bedeutungslos.
Außerdem testen Unit-Tests nicht unbedingt nur eine einzige Methode - Unit-Tests sollten eine Unit testen. Normalerweise ist diese Einheit eine Klasse. Einige Methoden mögen
get()
nur in Kombination mit anderen Sinn machen.Das Testen von Gettern und Setzern ist sinnvoll, insbesondere in dynamischen Sprachen (nur um sicherzustellen, dass sie tatsächlich vorhanden sind). Um einen Getter zu testen, müssen wir zuerst einen bekannten Wert angeben. Dies kann durch den Konstruktor oder durch einen Setter geschehen. Oder anders gesehen: Das Testen des Getters ist implizit in Tests des Setters und des Konstruktors enthalten. Und der Setter, kehrt er immer zurück
true
oder nur, wenn der Wert geändert wurde? Dies kann zu folgenden Tests führen (Pseudocode):Die Wiederverwendung des Zustands aus einem früheren Test würde unsere Tests ziemlich zerbrechlich machen. Das Neuanordnen der Tests oder das Ändern des genauen Werts in einem Test kann dazu führen, dass anscheinend nicht verwandte Tests fehlschlagen. Die Annahme eines bestimmten Status kann auch Fehler verbergen, wenn Tests bestanden werden, die tatsächlich fehlschlagen sollten. Um dies zu verhindern, haben einige Testläufer die Möglichkeit, die Testfälle in zufälliger Reihenfolge auszuführen.
Es gibt jedoch Fälle, in denen wir den vom vorherigen Test bereitgestellten Status wiederverwenden. Insbesondere wenn das Erstellen eines Testgeräts viel Zeit in Anspruch nimmt, kombinieren wir viele Testfälle zu einer Testsuite. Obwohl diese Tests anfälliger sind, sind sie jetzt möglicherweise noch wertvoller, da sie schneller und häufiger durchgeführt werden können. In der Praxis ist das Kombinieren von Tests immer dann wünschenswert, wenn die Tests eine manuelle Komponente umfassen, wenn eine große Datenbank benötigt wird oder wenn Zustandsmaschinen getestet werden.
quelle