Una kata (型) es una palabra de origen japones que se traduce como forma. El concepto es utilizado en todo tipo de artes tradicionales incluyendo el teatro kabuki, la ceremonia del té (chadó) y por supuesto las artes marciales.
Dentro del mundo de la programación también se utiliza el concepto de Code Kata. Con el se hace referencia a un ejercicio de programación en el cual se resuelve un problema mas o menos complejo donde el único objetivo es mejorar la técnica mediante el ejercicio y la repetición.
Dentro de la comunidad ágil, ha aparecido la iniciativa 12meses12katas, donde cada mes se propone una nueva kata. Abierta a todo el mundo y a todos los lenguajes, parece una plataforma excelente para poder practicar y aprender. Sin duda alguna mi “kung fu” no está para tirar cohetes, pero voy a intentar sacar tiempo para poder realizar lo ejercicios y poder comentar lo que he aprendido.
Para Enero el ejercicio era el String Calculator, si queréis ver el código de todo el mundo podéis visitar el github del proyecto. Mi código está almacenado dentro de la carpeta agileando.
Alguna de las cosas que he aprendido, sobre todo viendo el código del resto de la gente, han tenido que ver en como definir las pruebas unitarias. En mi primera versión del código cada una de las pruebas las tenias definidas en una función independiente.
public function testSumaUnSoloNumero() {
$this->assertEquals($this->sc->add('1'), 1);
$this->assertEquals($this->sc->add('332'), 332);
}
Conocía la posibilidad de utilizar la anotación @dataProvider, pero la forma en la cual se proporciona añadiendo una etiqueta a los datos, hace que mejore mucho la legibilidad y limpieza de la clase de test.
public function dataProvider() {
return array(
"sumaVaciaDevuelveCero" => array(0, ""),
"sumaUnSoloNumero1" => array(1, "1"),
"sumaUnSoloNumero2" => array(332, "332"),
"sumaDosNumeros1" => array(2, "1,1"),
"sumaDosNumeros2" => array(22, "10,12"),
"sumaVariosNumeros1" => array(6, "1,2,3"),
"sumaVariosNumeros2" => array(60, "10,20,30"),
"sumaVariosNumerosMasDeMil" => array(460, "10,20,30,400,1000"),
"sumaConRetornosYComas1" => array(6, "1\n2,3"),
"sumaConRetornosYComas2" => array(3, "1\n2"),
"sumaConfigurandoDelimitador1" => array(3, "//;\n1;2"),
"sumaConfigurandoDelimitador2" => array(7, "//;\n1;2;3\n1"),
"sumaConfigurandoDelimitadoLargo1" => array(6, "//[***]\n1***2***3"),
"sumaConfigurandoDelimitadoLargo2" => array(6, "//[+*+]\n1+*+2+*+3"),
"sumaConfigurandoDelimitadorMultiple" => array(3, "//;\n1;2"),
);
}
Además con el tema de la prueba unitaria de excepciones siempre me pasaba igual. Siempre me complicaba muchísimo con estas pruebas, metiendo try y catch para validar que el resultado era correcto.
public function testExpcepcionNegativa()
try {
$this->sc->add('1,-2,3');
} catch (Exception $exception) {
$this->assertTrue(true);
}
}
}
De nuevo haciendo uso de una anotación @expectedException se mejora muchísimo la legibilidad de las pruebas.
/**
* @expectedException InvalidArgumentException
*/
public function testExpcepcionNegativa() {
$this->sc->add('1,-2,3');
}
De momento me doy por satisfecho con la solución que he propuesto, he aprendido bastante de otros desarrolladores. Sobre todo me gusta la solución que hay en PHP usando inyección de dependencia y que incluso lleva un autoloader (MarioTux). En cuanto pasen unos días voy a intentar realizar la kata de nuevo a ver si la hago en menos tiempo y mejor.