Luis Abdel Rangel Castro
Esto no me lo enseñaron en la universidad. Esta genial!!!
Félix Andersson
Yo ni voy a la universidad :(
Mateo Nieto Hoyos
real, yo ni sabia del gesto de paquetes, solo me ensañaban xampp y hacer consultas, super esta clase
¿Qué es el Test Driven Development (TDD)?
El Test Driven Development, conocido como TDD, es una metodología de desarrollo de software que invita a replantear nuestro enfoque tradicional. ¿Imaginas escribir primero las pruebas para luego desarrollar el código? Así es como TDD opera. Lo esencial del TDD es que primero se definen los tests antes de programar la funcionalidad que se va a implementar. Esto no sólo cambia el modo de pensar, sino que también asegura que el software cumple con los requisitos desde el inicio.
Al adoptar TDD, el proceso se centra en tres pasos:
Este ciclo se repite para cada funcionalidad nueva.
¿Cómo aplicar TDD con PHP?
En el contexto de PHP, el uso de TDD comienza desde una estructura básica de proyecto. Al inicio se tienen dos carpetas esenciales: una para los tests y otra para las librerías necesarias.
¿Cómo crear pruebas en PHP?
Para comenzar a trabajar con pruebas en PHP, se recomienda crear un archivo de tests. Aquí se puede ejemplificar con una calculadora que realiza operaciones básicas como sumar, restar, multiplicar y dividir. Paso a paso se puede construir el siguiente entorno:
CalculadoraTest.php.<?php use PHPUnit\Framework\TestCase; class CalculadoraTest extends TestCase { public function testSumaDeParametros() { $calc = new Calculadora(); $this->assertEquals(8, $calc->sumar(5, 3)); } }
¿Cómo ejecutar los tests?
Para ejecutar los tests se utiliza el siguiente comando en terminal, apuntando al archivo que contiene la prueba:
vendor/bin/phpunit tests/CalculadoraTest.php
Este comando correrá la prueba y señalará si pasa o falla. En caso de fallo, se debe refinar hasta que el test pase.
¿Qué pasa si el test falla?
Si el test falla, esto indica que el código implementado no cumple con la funcionalidad esperada. Por ejemplo, un error común sería no haber definido la clase o el método correspondiente. Simplemente se debe crear el mínimo código necesario para asegurarse de que el test pase exitosamente, como por ejemplo, definir métodos que realicen las operaciones.
Ejemplo de implementación de un método de suma:
<?php class Calculadora { public function sumar($a, $b) { return $a + $b; } }
Con esto y tras ejecutar nuevamente el test, se espera pasar, asegurando que la funcionalidad de suma es efectiva. Asimismo, se pueden crear nuevos tests para otras operaciones como resta, multiplicación y división.
¿Cuáles son los beneficios de TDD?
En resumen, el TDD no solo cambia cómo desarrollamos software, sino que refuerza una cultura de calidad y mejora continua. Cada nuevo reto es una oportunidad de aprender más y mejorar nuestras habilidades. ¡Anímate a adentrarte en TDD y explorar su potencial en tus proyectos!
Luis Abdel Rangel Castro
Esto no me lo enseñaron en la universidad. Esta genial!!!
Félix Andersson
Yo ni voy a la universidad :(
Mateo Nieto Hoyos
real, yo ni sabia del gesto de paquetes, solo me ensañaban xampp y hacer consultas, super esta clase
Eduer Pallares Jiménez
Con un alias es más cómodo ejecutar las pruebas:
Luis Eduardo Rodríguez Ramírez
Justo acabo de ver eso en el curso de Git y GitHub!
Rolando Mamani Salas
Muchas Gracias
Test Driven Development
Este consiste en primeros las pruebas y luego el software. Etapas:
Escribir el siguiente comando para que nos de los resultados del test mas el nombre del test.
php vendor/phpunit/phpunit/phpunit --testdox tests/CalculatorTest.php
Leonardo Hernández
Creo que debería haber un curso completo de TDD en PHP utilizando PHPUnit, porque ya lo he visto en 3 cursos y sólo están abarcando la parte básica. ¿Hay planes de un curso así?
Erik Elyager
No hay planes pero tampoco se descarta. Cuéntanos ¿qué te gustaría ver en un curso de TDD?
Juan Camilo García Ardila
Estoy de acuerdo contigo.Curso de PHPUnit como funciona el framework y como abordar a fondo las rpruebas
Marines Millan
La clase esta adelanta, vean primero las dos proximas, esta es la ultima de este modulo
Félix Andersson
Sí también lo noté
Bernardo Aguayo Ortega
gracias por el aviso, justo a tiempo
Carlos Eduardo Gomez García
Si están en linux y creo que igual en cualquier consola bash de Windows, pueden crear un alias para no escribir tantos phpunit:
alias maketests="vendor/phpunit/phpunit/phpunit"
Y simplemente hacen sus pruebas ejecutando "maketests", como disclaimer, los alias son temporales, cuando apagues tu PC se borrará, pero es útil durante la sesión de trabajo:D!
Bernardino Villagra Baez
TDD: Test Driven Development
Metodología que propone escribir primero la prueba y luego la funcionalidad.
Rolando Mamani Salas
Exacto
Allan Rai Yunyor Acan Sacarias
Cuando ejecuto me sale que no encuentra la clase Calculator.php pero si la tengo definida
Sin embargo obtengo este error
Pero investigue en internet y con el codigo "require ('Calculator.php');" Si me funciona perfectamente Talvez a alguien le interese
Marcos Abraham Medina
Me paso lo mismo, pero el problema era que había ubicado calculator en la carpeta test y no en la raíz del proyecto
German David Lievano Suarez
require es una técnica que se usa en el archivo index principal, lo correcto es hacer uso de las herramientas de phpunit que es el programa de prueba, el error esta en configurar el archivo xml con el nombre de la carpeta tests en la etiqueta directory con esto y ejecutando composer dump se genera el archivo de autoload estaría solucionado, lo vi en la clase de composer con el profesor Italo...
https://platzi.com/clases/2032-datos-php/32094-iniciando-nuestro-proyecto/
Miguel Angel Muñoz Pozos
GARCIA CAMARENA EZEQUIEL
Resumen Clase: TDD, desarrollo guiado por las pruebas, es decir escribir primero el código de las pruebas y después desarrollar el código del sistema por medio de las pruebas escritas. Primero Escribimos los test para que falle y después escribimos las funciones con lo mínimo de código para que el código sea un existo, es decir pasar de rojo a verde, después refactorizamos las funciones y volvemos a correr las pruebas para que pasen de nuevo con éxito todas, realizamos esto con todas las funcionalidades de nuestro sistema. Por ultimo podemos decir que el TDD nos obliga a escribir el mínimo de código en nuestras funciones.
Bernardo Aguayo Ortega
Gracias Ezequiel, se aprecia mucho!!
José Gregorio Block
Company_admin#Gracias
Luis Eduardo Rodríguez Ramírez
Ayuda!! Todo me ha salido bien hasta ejecutar el comando
vendor/phpunit/phpunit/phpunit tests/CalculatorTest.php
Porque no me reconoce el archivo Calculator.php :c Siempre me sale el error: Class "Calculator" not found
Jhonathan Alfonso
Hola elluiso, asegurate que el archivo se llame de esta manera y este en la ubicación de la carpeta a la que mencionas.
Walter Omar Barrios Vazquez
Hola, agregá el namespace en el archivo de test y en el de la clase:
<?php namespace App;
Daniel Martín
¿Cómo se automatiza el testing de múltiples clases? Quiero decir, si es necesario ejecutar a través de la terminal cada test de manera individual se pierde la ventaja de la automatización, así que me imagino que debe existir alguna manera de automatizar esto.
Mauricio Galvez
Normalmente se suelen testear solo ciertas partes especificas del sistema, como una clase, porque los test pueden llegar a tardar 10, 20, 30... minutos. Esto es ineficiente, entonces existen dos tipos de test: unitarios y de integración.
Si, se puede testear mas de una clase al mismo tiempo. En estos cursos se habla mas a profundidad del testing en php:
Básicamente tienes que configurar el archivo phpunit.xml indicándole donde están los test y por defecto ejecutara todos los que encuentre.
Kenneth Angulo L
Jhon Alexander Romero Gonzaga
Henry Villavicencio
TDD me parece genial 🙂, sin embargo, me han surgido estas dudas ?
Santiago Puerta
Hola, la verdad lo de las pruebas depende mucho de otras cosas, por ejemplo que metodología o marco de desarrollo usa el equipo esta SCRUM, y están otras; pero, para no hacerlo muy complejo, si, las pruebas generalmente las hace el mismo desarrollador u otro, o por ejemplo en el caso de Google ellos ya tienen unas pruebas estandarizadas las cuales los desarrolladores ejecutan con un comando. También últimamente en la industria se usa una metodología de desarrollo que lo plantea es que antes de desarrollar pienses en que es lo que puede tumbar tu desarrollo, ósea, antes de desarrollar pienses en las pruebas y en las posibles fallas que hay en el código.
Sergio Iván Buitrago Merchán
Las pruebas las deberia hacer el mismo desarrollador. La razón principal es porque se busca crear código funcional a partir de la generación del escenario de prueba. Si ahondas en el tema del TDD verás que vas escribiendo dicho código buscando añadir uno por uno los requisitos para que pase la prueba. Te pongo un ejemplo:
Supongamos que quieres hacer un código que retorne la suma 4 + 5 = 9. Según TDD el primer paso que tienes que hacer es crear un método que se encargue de recibir dos numeros y retorne un 9. Asi tal cual. Luego cómo quieres es probar sumás no un valor estático cambiar el retorno del número '9' por la suma a + b. De modo que es el mismo desarrollador quien escribe la prueba. Recuerda que estas pruebas no las revisa nadie más en el equipo (a excepción de que sea para verificar buenas prácticas) sino que son ejecutadas en los diferentes despliegues (CI/CD).
Ahora finalmente, las pruebas unitarias así mismo tienen buenas prácticas. En esto aplica el principio de Single Responsability, es decir deberías asegurarte que la prueba cubra una cosa y una sola cosa dentro de un método. (Con una cosa me refiero a solo una entrada y una salida específica, si quieres probar todo el caso de uso las pruebas son diferentes)
Luis Kennedy Saavedra Fuentes
Malas práctica para escritura del código declarando variables $a y $b , Según lo aprendido en clase deben declararse descriptivas por ejemplo $numero1 y $numero2 ;)!!
Félix Andersson
Como haces para que se detecten los namespaces sin cargar la clase autoload.php????
Leonardo Hernández
Excelente Profe! Solo que creo que debería haber un curso completo de TDD en PHP utilizando PHPUnit, porque ya lo he visto en 3 cursos y sólo están abarcando la parte básica. ¿Hay planes de un curso así?
Fabiola Dayana Acarapi Alvarez
Este curso profundiza el tema Curso de Fundamentos de Pruebas de Software
Rolando Mamani Salas
Muchas Gracias por el aporte
Miguel Angel Paz Gonzalez
En python se tienen paquetes para probar las aplicaciones desarrolladas en Python.
Miguel Angel Soler
En las primeras clases el mentor dice que no es buena practica clean code, iniciar un bloque de código en otra linea:
function test() { echo “Esto no es buena practica”; }
debería ser así:
function test(){ echo “Esto si”; } ¿Esto es porque en TDD cambia esta "convención"?
<?php use PHPUnit\Framework\TestCase; class CalculatorTest extends TestCase { public function testAddWillReturnTheSumOfItsParameters() { $sut = new Calculator(); $this->assertEquals(8, $sut->add(5,3)); $this->assertEquals(5, $sut->add(5,0)); } public function testAddWillReturnTheSubtractOfItsParameters() { $sut = new Calculator(); $this->assertEquals(5, $sut->subtract(8,3)); $this->assertEquals(8, $sut->subtract(10,2)); $this->assertEquals(2, $sut->subtract(4,2)); } public function testAddWillReturnTheMultiplyOfItsParameters() { $sut = new Calculator(); $this->assertEquals(24, $sut->multiply(8,3)); $this->assertEquals(20, $sut->multiply(10,2)); $this->assertEquals(8, $sut->multiply(4,2)); } public function testAddWillReturnTheDivideOfItsParameters() { $sut = new Calculator(); $this->assertEquals(5, $sut->divide(10,2)); $this->assertEquals(20, $sut->divide(40,2)); $this->assertEquals(4, $sut->divide(8,2)); } } <?php class Calculator { public function add(int $a, int $b): int { return $a + $b; } public function subtract(int $a, int $b): int { return $a - $b; } public function multiply(int $a, int $b): int { return $a * $b; } public function divide(int $a, int $b): float { if ($b ===0) { throw new InvalidArgumentException('No se puede dividir entre 0'); } return $a / $b; } } Resultados de pruebas: root@debian:/var/www/html/platzi/platzi-tdd# vendor/phpunit/phpunit/phpunit --testdox tests/CalculatorTest.php PHPUnit 8.2.2 by Sebastian Bergmann and contributors. Calculator ✔ Add will return the sum of its parameters ✔ Add will return the subtract of its parameters ✔ Add will return the multiply of its parameters ✔ Add will return the divide of its parameters Time: 52 ms, Memory: 4.00 MB OK (4 tests, 11 assertions)```
Hola En el archivo de configuracion phpunit.xml, dentro de la etiqueta <phpunit></phpunit> escribes esto:
<testsuite name="Test Directory"> <directory>tests</directory> </testsuite>
Dentro de la estructura de tu proyecto crea la carpeta llamada tests
Guarda alli todas las pruebas que hagas:
CalculatorTest.php CommentTest.php MyClaseTest.php
Cuando escribas en la terminal
php vendor/phpunit/phpunit/phpunit
Se ejecutaran alli todas las pruebas que hallas generado (cada prueba corresponde a una clase especifica)
CalculatorTest.php
<?php use PHPUnit\Framework\TestCase; class CalculatorTest extends TestCase { public function testAddWillReturnTheSumOfItsParameter() { $sut = new Calculator(); $this->assertEquals(8, $sut->add(5, 3)); $this->assertEquals(5, $sut->add(5,0)); } public function testAddWillReturnTheSubtractItsParameter() { $sut = new Calculator(); $this->assertEquals(0, $sut->subtract(3, 3)); $this->assertEquals(8, $sut->subtract(3, -5)); } public function testAddWillReturnTheMultiplyItsParameter() { $sut = new Calculator(); $this->assertEquals(9, $sut->multiply(3, 3)); $this->assertEquals(20, $sut->multiply(5, 4)); } public function testAddWillReturnTheDivideItsParameter() { $sut = new Calculator(); $this->assertEquals(4, $sut->divide(20, 5)); $this->assertEquals(2.5, $sut->divide(10, 4)); } }
Calculator.php
<?php class Calculator { public function add(int $num1, int $num2) { return $num1 + $num2; } public function subtract(int $num1, int $num2) { return $num1 - $num2; } public function multiply(int $num1, int $num2) { return $num1 * $num2; } public function divide(int $num1, int $num2) { if(! $num2 == 0) { return $num1 / $num2; } else { throw new InvalidArgumentException("The number is not divide by zero"); } } }