Comprensione dei vincoli di unit test e degli helper di sintassi di NUnit
-
03-07-2019 - |
Domanda
Io e un collega stiamo iniziando un nuovo progetto e stiamo tentando di sfruttare appieno TDD. Stiamo ancora cercando di capire tutti i concetti relativi ai test unitari e finora li basiamo principalmente su altri esempi.
Il mio collega ha recentemente messo in discussione il punto degli aiutanti della sintassi di NUnit e sto lottando per spiegare il loro beneficio (dal momento che non capisco da solo, a parte il mio istinto, dice che sono buoni!). Ecco un esempio di asserzione:
Assert.That(product.IsValid(), Is.False);
Per me questo ha perfettamente senso, stiamo dicendo che prevediamo che il valore di product.IsValid ()
sia false
. D'altro canto, il mio collega preferirebbe che scrivessimo semplicemente:
Assert.That(!product.IsValid());
Gli dice che questo ha più senso e può leggerlo più facilmente.
Finora l'unica cosa su cui possiamo concordare è che è probabile che tu ottenga risultati più utili quando il test fallisce dal primo, ma penso che ci debba essere una spiegazione migliore. Ho cercato alcune informazioni sugli helper di sintassi ( http://nunit.com/blogs/? p = 44 ) e hanno un senso, ma non capisco perfettamente il concetto di vincoli se non quello di "sentirsi" bene.
Mi chiedo se qualcuno potrebbe spiegare perché utilizziamo il concetto di vincoli e perché migliorano gli esempi di test unitari sopra?
Grazie.
Soluzione
Penso che abbia principalmente a che fare con la pura lettura inglese della dichiarazione.
Le prime letture
Asserire che il prodotto è valido è falso
La seconda legge
Asserire che non è un prodotto valido
Trovo personalmente il primo più facile da elaborare. Penso che sia davvero tutto da preferire. Alcuni dei metodi di estensione disponibili sono interessanti, ma ti consentono di fare affermazioni come questa:
product.IsValid().IsFalse();
Altri suggerimenti
Vedo che la tua versione è migliore dei tuoi colleghi. Tuttavia, sarei comunque a mio agio con almeno:
Assert.IsFalse(product.IsValid());
Se riesci a convincermi che la sintassi Assert.That
ha un vantaggio oggettivo rispetto a quanto sopra, sarei molto interessato :) Potrebbe benissimo essere un'abitudine, ma posso facilmente leggi " Che tipo di affermazione stiamo facendo? Ora di cosa stiamo affermando? & Quot; stile.
È tutto zucchero. Internamente vengono convertiti in vincoli.
Da Pragmatic Unit Testing, pg 37:
"NUnit 2.4 ha introdotto un nuovo stile di asserzioni che sono un po 'meno procedurali e consentono un'implementazione sottostante più orientata agli oggetti. ... Ad esempio:
Assert.That(actual, Is.EqualTo(expected));
Converte in:
Assert.That(actual, new EqualConstraint(expected));"
L'uso dei vincoli consente anche di ereditare da Vincolo e creare i propri vincoli personalizzati mantenendo una sintassi coerente.
Non mi piace Assert, questo, in particolare il fatto che il suo scenario più comune (confrontando l'uguaglianza di due oggetti) è decisamente peggiore della sintassi "classica" di Assert.AreEqual ().
D'altra parte, adoro le estensioni di MSpec NUnit. Ti consiglio di dare un'occhiata (o guardare le estensioni SpecUnit, o le estensioni NBehave, o N Comportarsi Spec * Estensioni unità, penso che siano tutte uguali).