gstreamer0.10-ffmpeg
gstreamer0.10-plugins-good
packages.
¡Hola a todos! Bienvenidos a PHPUnit: ¡pruebas con un bocado! El tutorial en el que descubrimos, para nuestro horror, que otro parque temático de dinosaurios ha construido sus sistemas... sin ninguna prueba. No importa si los raptores pueden o no abrir puertas... si las vallas nunca se encienden.
Nuestro parque se llama Dinotopia. Y, para ayudar a manejar a nuestros amigos prehistóricos, hemos escrito una sencilla aplicación que nos muestra qué dinos están donde y... cómo se sienten. Como verás, ¡es genial! Excepto por la falta total de pruebas.
De todos modos, para aprender lo máximo posible sobre las pruebas y garantizar que no se escape nada mortal de tu aplicación, deberías codificar conmigo. Después de hacer clic en "Descargar" en esta página, descomprime el archivo y entra en el directorio start/
para encontrar el código que ves aquí. Echa un vistazo a README.md
para conocer todos los detalles de la configuración.
El último paso será abrir un terminal y ejecutar
symfony serve -d
para iniciar un servidor web local en 127.0.0.1
puerto 8000
.
¡Genial! Ve a tu navegador, abre una pestaña, ve a localhost:8000
... ¡y sí! ¡Nuestra aplicación Dinotopia Status!
Esta sencilla aplicación tiene el nombre de cada dino, el género, el tamaño y el recinto en el que se encuentra actualmente. Aquí abajo, también tenemos un enlace al repositorio súper secreto de GenLab dino-park
en GitHub. OoooO. Aquí es donde los ingenieros publican regularmente actualizaciones para que Bob, nuestro guardabosques residente, sepa qué dinos se sienten bien, necesitan su medicina o se han escapado. Espera, ¿qué? Afortunadamente, GitHub no se desconecta cuando eso ocurre.
¡Y ahí es donde entramos nosotros! Ya hemos construido la primera versión de la aplicación Dinotopia Status. Mirando el código que hay detrás, es bastante sencillo: un controlador
... lines 1 - 2 | |
namespace App\Controller; | |
use App\Entity\Dinosaur; | |
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; | |
use Symfony\Component\HttpFoundation\Response; | |
use Symfony\Component\Routing\Annotation\Route; | |
class MainController extends AbstractController | |
{ | |
path: '/', name: 'main_controller', methods: ['GET']) ( | |
public function index(): Response | |
{ | |
$dinos = [ | |
new Dinosaur('Daisy', 'Velociraptor', 2, 'Paddock A'), | |
new Dinosaur('Maverick','Pterodactyl', 7, 'Aviary 1'), | |
new Dinosaur('Big Eaty', 'Tyrannosaurus', 15, 'Paddock C'), | |
new Dinosaur('Dennis', 'Dilophosaurus', 6, 'Paddock B'), | |
new Dinosaur('Bumpy', 'Triceratops', 10, 'Paddock B'), | |
]; | |
return $this->render('main/index.html.twig', [ | |
'dinos' => $dinos, | |
]); | |
} | |
} |
una clase Dinosaur
...
... lines 1 - 2 | |
namespace App\Entity; | |
class Dinosaur | |
{ | |
private string $name; | |
private string $genus; | |
private int $length; | |
private string $enclosure; | |
public function __construct(string $name, string $genus = 'Unknown', int $length = 0, string $enclosure = 'Unknown') | |
{ | |
$this->name = $name; | |
$this->genus = $genus; | |
$this->length = $length; | |
$this->enclosure = $enclosure; | |
} | |
public function getName(): string | |
{ | |
return $this->name; | |
} | |
public function getGenus(): string | |
{ | |
return $this->genus; | |
} | |
public function getLength(): int | |
{ | |
return $this->length; | |
} | |
public function getEnclosure(): string | |
{ | |
return $this->enclosure; | |
} | |
} |
y exactamente cero pruebas. Nuestro trabajo consiste en arreglar eso. También vamos a añadir una función en la que leamos el estado de cada dino desde GitHub y lo rendericemos. Eso ayudará a Bob a evitar entrar en el recinto de Big Eaty -nuestro T-Rex residente- cuando su estado sea "Hambriento". Esos accidentes implican un montón de papeleo. Y gracias a nuestras pruebas, enviaremos esa función sin errores. ¡De nada, Bob!
Si eres nuevo en esto de las pruebas, puede ser intimidante. Hay pruebas unitarias, pruebas funcionales, pruebas de integración, pruebas de aceptación, pruebas matemáticas La lista es casi interminable. Hablaremos de todas ellas -excepto de las pruebas matemáticas- a lo largo de esta serie. En este tutorial, vamos a centrarnos en las pruebas unitarias: pruebas que cubren una parte específica del código, como una función o un método.
Ah, y por cierto, las pruebas también son súper divertidas. ¡Es la automatización! Así que abróchate el cinturón.
¿Cuál es el primer paso para escribir pruebas? Instalar la herramienta de pruebas estándar de PHP: PHPUnit. Ve a tu terminal y ejecuta:
composer require --dev symfony/test-pack
Este test-pack
es un "paquete" de Symfony que instalará PHPUnit -que es todo lo que necesitamos ahora- así como algunas otras bibliotecas que serán útiles más adelante.
Cuando termine, ejecuta:
git status
¡Genial! Además de instalar los paquetes, parece que algunas recetas de Symfony Flex han modificado y creado algunos otros archivos. Ignóralos por ahora. Hablaremos de cada uno en algún momento de esta serie cuando sean relevantes.
Bien, ¡estamos listos para escribir nuestra primera prueba! Hagámoslo a continuación.
Haha, I wish I could pull off a deep voice like this! We think Jesse sounds a bit like Sam Elliott, which is pretty cool 😎
// composer.json
{
"require": {
"php": ">=8.1.0",
"ext-ctype": "*",
"ext-iconv": "*",
"symfony/asset": "6.1.*", // v6.1.0
"symfony/console": "6.1.*", // v6.1.4
"symfony/dotenv": "6.1.*", // v6.1.0
"symfony/flex": "^2", // v2.2.3
"symfony/framework-bundle": "6.1.*", // v6.1.4
"symfony/http-client": "6.1.*", // v6.1.4
"symfony/runtime": "6.1.*", // v6.1.3
"symfony/twig-bundle": "6.1.*", // v6.1.1
"symfony/yaml": "6.1.*" // v6.1.4
},
"require-dev": {
"phpunit/phpunit": "^9.5", // 9.5.23
"symfony/browser-kit": "6.1.*", // v6.1.3
"symfony/css-selector": "6.1.*", // v6.1.3
"symfony/phpunit-bridge": "^6.1" // v6.1.3
}
}
Nice Desktop! ;o)
Thank you for working on this topic!