Ho sentito che è ideale avere un assert
(o expect
o should
, ecc.) per aspetto del comportamento di un componente che stai provando a testare. è così che funziona? Una funzione addOne
verrebbe testata in questo modo, suppongo (l'esempio è scritto in javascript sintassi):
it("returns one plus its input", function() {
assert(addOne(5) == 6);
});
E suppongo che sarebbe l'estensione completa dei test per la funzione addOne
, poiché ogni singolo assert
dovrebbe essere ortogonale.
Come si fa a testare qualcosa di più complesso, ma che ha ancora solo un comportamento definitivo?
Diciamo per esempio che abbiamo una classe OO per la memorizzazione di una scacchiera, e ad ogni piastrella della scheda è assegnato un numero ID compreso tra 0 e 63. Quindi diciamo che c'è un metodo getNeighbors
che prende un numero intero da 0 a 63 e restituisce un elenco intero ordinato / matrice / set contenente gli ID di tutte le tessere adiacenti. Ad esempio, se i numeri fossero disposti partendo da 0 in alto a sinistra e incrementando su tutte le righe, allora getNeighbors(0)
restituirebbe [1, 8, 9]
suppongo.
Quanti casi di test verrebbero scritti per questo? Vedo due opzioni principali:
Prova l'intero comportamento una volta
it("throws an error when called with a number below 0", ...);
it("throws an error when called with a number above 63", ...);
it("returns a list of the IDs of the neighboring tiles", function() {
assert(getNeighbors(0) == [1, 8, 9]);
});
Questo sembra troppo debole per un test.
Verifica ogni caso del comportamento una volta
it("throws an error when called with a number below 0", ...);
it("throws an error when called with a number above 63", ...);
it("returns [1, 8, 9] when called on 0", function() {
assert(getNeighbors(0) == [1, 8, 9]);
});
it("returns [0, 2, 8, 9, 10] when called on 1", function() {
assert(getNeighbors(1) == [0, 2, 8, 9, 10]);
});
... // and so on, for 62 more test cases
Questo sembra esagerato.