¡Hola a todos!
Continuamos con la mini-serie sobre fixtures en Playwright. En la entrada anterior vimos qué son las fixtures y cómo crear las más básicas: las de Page Objects y las de clases de API. En esta segunda parte subimos un poco el nivel y veremos dos tipos de fixtures más avanzados: las fixtures con ámbito de worker ( worker scope), ideales para operaciones costosas que se pueden reutilizar entre tests, y las fixtures de datos opcionales, que nos permiten definir datos por defecto sobrescribibles en tests concretos. ¡Empezamos!
3. Fixtures con ámbito de worker.
Hasta ahora, todas las fixtures que hemos visto son de ámbito de test ( test scope): se crean antes de cada test y se destruyen después. Esto es perfecto para la mayoría de los casos, pero hay operaciones que son muy costosas de repetir para cada test, como abrir una conexión a base de datos o inicializar un generador de datos.
Para estos casos, Playwright nos ofrece las fixtures con ámbito de worker ( scope: 'worker'). Un worker es el proceso que Playwright usa para ejecutar tests en paralelo. Las fixtures de worker se crean una sola vez por worker y se comparten entre todos los tests que se ejecutan en ese worker, en lugar de crearse y destruirse para cada test individual.
Las ventajas de las fixtures de worker son:
- Eficiencia: las operaciones costosas (conexiones a base de datos, autenticaciones complejas…) se realizan una sola vez por worker.
- Reutilización de recursos: todos los tests del worker comparten la misma instancia.
- Consistencia: todos los tests del worker trabajan con el mismo estado inicial.
- Rendimiento: al reutilizar conexiones y objetos ya inicializados, la suite de tests corre más rápido.
Ejemplo: helper de base de datos.
Imaginemos que necesitamos conectarnos a una base de datos en nuestros tests para verificar que los datos se han guardado correctamente. Abrir y cerrar una conexión para cada test sería muy costoso. Con una fixture de worker, lo hacemos una sola vez:
| |
Ejemplo: generador de datos de prueba.
Otro uso habitual para las fixtures de worker es un generador de datos de prueba. Librerías como Faker nos permiten generar datos realistas y aleatorios para nuestros tests:
| |
Registrando las fixtures de worker.
La diferencia clave con las fixtures de test está en la forma de registrarlas: se envuelven en un array y se añade { scope: 'worker' } como segundo elemento. Además, el tipo de la fixture se declara en el segundo parámetro de tipo de base.extend, no en el primero:
| |
Usando las fixtures de worker en los tests.
Desde el punto de vista del test, no hay ninguna diferencia en el uso: se solicitan como cualquier otra fixture:
| |
Precauciones con las fixtures de worker.
Las fixtures de worker son muy potentes, pero hay que usarlas con cuidado:
- Aislamiento: asegúrate de que los tests no interfieren entre sí modificando el estado compartido. Si un test modifica datos de la base de datos, puede afectar a los tests que se ejecutan después en el mismo worker.
- Fugas de recursos: implementa correctamente la fase de limpieza (el código después de
await use(...)) para evitar que las conexiones y recursos queden abiertos. - Variables de entorno: usa siempre variables de entorno para gestionar cadenas de conexión y credenciales. Nunca las pongas directamente en el código.
4. Fixtures de datos opcionales.
Las fixtures de datos opcionales son otro patrón muy útil: nos permiten definir datos de prueba por defecto que se pueden sobrescribir en tests concretos cuando necesitamos una variación.
La idea es que la mayoría de los tests usen unos datos “estándar” (un usuario genérico, un producto básico…), pero si un test concreto necesita datos diferentes (un usuario administrador, un producto sin stock…), puede indicarlo sin necesidad de configurar todo desde cero.
Definiendo la fixture con datos por defecto.
Usamos { option: true } para marcar la fixture como un option (opción configurable):
| |
Usando la fixture con los datos por defecto.
La mayoría de tests simplemente solicitan testUser y obtienen los datos por defecto:
| |
Sobrescribiendo los datos para un test concreto.
Cuando un test concreto necesita datos diferentes, usamos test.use() para indicarlo. Playwright fusionará los datos que especifiquemos con los valores por defecto:
| |
Buenas prácticas con las fixtures de datos opcionales.
- Mantén los datos por defecto simples y genéricos. Los casos especiales van en los overrides.
- Crea múltiples fixtures de datos para distintas entidades:
testUser,testProduct,testOrder… - Usa interfaces de TypeScript para garantizar que los datos tienen el formato correcto.
- Al sobrescribir, especifica solo las propiedades que necesitas cambiar.
Conclusión.
- Las fixtures de worker (
scope: 'worker') se crean una sola vez por proceso de Playwright y se comparten entre todos los tests del worker. Son ideales para conexiones a base de datos, autenticaciones costosas o generadores de datos. - La limpieza de las fixtures de worker (el código tras
await use(...)) se ejecuta al terminar todos los tests del worker, no tras cada test individual. - Las fixtures de datos opcionales (
option: true) nos permiten definir datos por defecto que se pueden sobrescribir en tests concretos contest.use(). - Ambos patrones ayudan a crear suites de tests más eficientes, organizadas y mantenibles.
Y hasta aquí esta segunda parte sobre fixtures en Playwright. En la siguiente y última entrega de esta mini-serie veremos cómo tipar nuestras fixtures con TypeScript, cómo combinar todos los tipos de fixtures en una arquitectura completa y cómo usar mergeTests para mantener el código organizado. ¡Nos leemos en la siguiente entrada!
