BDD agrega un nivel más de abstracción a las pruebas. El código de nivel superior (generalmente en txt) describe lo que el sistema prueba, el código de nivel inferior describe cómo lo prueba. Por lo tanto, un marco BDD puede usar un marco TDD en el código de nivel inferior.
Esto ayuda mucho manteniéndose SECO. Por TDD, puede terminar fácilmente con las pruebas "húmedas" que contienen una gran cantidad de duplicación de código, lo que facilita su ruptura al refactorizar el código y las pruebas con él. Por BDD, solo tiene que modificar el nivel de abstracción inferior mediante la refactorización del código, por lo que si la especificación no cambia, el código de nivel superior no cambiará.
Por cierto. Este es un Código limpio simple, por lo general, es suficiente leer las cosas de alto nivel de abstracción para comprender lo que hace y profundizar en el código de prueba de nivel de abstracción más bajo solo si realmente lo necesita. Esto hace que el código (de prueba) sea más fácil de entender en general.
Un mal ejemplo (porque es demasiado simple):
estilo TDD de jazmín
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);
});
});
Estilo BDD de jazmín y pepino
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));
});
implementacion
calculator.js
function add(){
var args = Array.prototype.slice.call(arguments);
var total = 0;
for (var i in args)
total += args[i];
return total;
}
Ahora, si cambio el nombre de la función add()
a sum()
, tengo que cambiar el código TDD en 2 lugares, mientras que el código BDD solo aparece en un solo lugar en el archivo steps . De c. agregar un nivel de abstracción más requiere más código ...