BDD aggiunge un ulteriore livello di astrazione ai test. Il codice di livello superiore (di solito in txt) descrive cosa prova il sistema, il codice di livello inferiore descrive come lo testa. Quindi un framework BDD può utilizzare un framework TDD nel codice di livello inferiore.
Questo aiuta molto rimanendo ASCIUTTO. Con TDD puoi facilmente finire con i test "umidi" che contengono molte duplicazioni di codice, che li rendono facili da rompere rifattorizzando il codice e i test con esso. Con BDD devi modificare solo il livello di astrazione inferiore effettuando il refactoring del codice, quindi se la specifica non cambia, il codice di livello superiore non cambierà.
Btw. questo è semplice codice pulito, in genere è sufficiente leggere l'alto livello di astrazione per capire cosa fa e scavare più a fondo nel codice di test del livello di astrazione inferiore solo se ne hai davvero bisogno. Questo rende il codice (test) più facile da capire in generale.
Un cattivo esempio (perché è troppo semplice):
stile TDD jasmine
calculator.add.specs
describe("Calculator: add", function (){
it("should be able to add 2 numbers together", function (){
var total = add(1, 2);
expect(total).toBe(3);
});
it("should be able to add 3 numbers together", function (){
var total = add(1, 2, 3);
expect(total).toBe(6);
});
});
stile BDD jasmine-cetriolo
calculator.specs
feature('Calculator: add')
.scenario('should be able to add 2 numbers together')
.when('I enter "1"')
.and('I add "2"')
.then('I should get "3"')
.scenario('should be able to add 3 numbers together')
.when('I enter "1"')
.and('I add "2"')
.and('I add "3"')
.then('I should get "6"')
calculator.steps
featureSteps('Calculator:')
.before(function(){
this.values = [];
this.total = null;
})
.when('I enter "(.*)"', function(value){
this.values.push(Number(value));
})
.when('I add "(.*)"', function(value){
this.values.push(Number(value));
})
.then('I should get "(.*)"', function(expectedTotal){
this.total = add.apply(null, this.values);
expect(this.total).toBe(Number(expectedTotal));
});
applicazione
calculator.js
function add(){
var args = Array.prototype.slice.call(arguments);
var total = 0;
for (var i in args)
total += args[i];
return total;
}
Ora se cambio la funzione add()
in sum()
devo cambiare il codice TDD in 2 posizioni, mentre il codice BDD solo in un posto singolo nel file passi . Ofc. aggiungere un altro livello di astrazione richiede più codice ...