Cómo utilizar GitHub Copilot para la generación de casos de prueba

GitHub Copilot puede generar cientos de casos de prueba en cuestión de minutos (con experimentos controlados que demuestran que los desarrolladores terminan un 35 % más rápido ), pero hay una pega: esas pruebas generadas por IA solo son útiles si eres capaz de hacer un seguimiento de ellas, organizarlas y conectarlas con el resto de tu flujo de trabajo de desarrollo.

Esta guía le muestra cómo utilizar GitHub Copilot para crear rápidamente casos de prueba y, a continuación, le enseña a gestionarlos de forma eficaz para que no se conviertan en otra pila de archivos de código huérfanos.

Por qué las pruebas unitarias son importantes para la calidad del software

Escribir pruebas unitarias suele considerarse una tarea tediosa, pero omitirlas conduce a un código frágil.

Cuando no se dispone de una red de seguridad de pruebas, una pequeña refactorización puede introducir errores de regresión, es decir, incidencias que rompen las funciones existentes y erosionan la confianza de los usuarios. Según una investigación de IBM, las incidencias descubiertas después del lanzamiento cuestan 15 veces más de corregir.

Esto crea un ciclo en el que los desarrolladores evitan mejorar el código por miedo a que algo falle, lo que conduce a una deuda técnica cada vez mayor.

La generación de pruebas asistida por IA ayuda a romper este ciclo, y el 89 % de las organizaciones ya están probando o implementando flujos de trabajo de IA generativa en ingeniería de calidad y pruebas. Al utilizar una herramienta como GitHub Copilot para crear casos de prueba, puedes centrarte en lo que realmente importa: diseñar pruebas significativas y perfeccionar la cobertura de casos extremos.

He aquí por qué merece la pena realizar pruebas unitarias de forma sistemática:

  • Prevención de regresiones: las buenas pruebas actúan como barrera de protección, garantizando que las nuevas funciones o correcciones de errores no provoquen involuntariamente otros problemas.
  • Documentación viva: a diferencia de la documentación estática, que puede quedar obsoleta, las pruebas unitarias sirven como ejemplos ejecutables de cómo se supone que debe comportarse tu código.
  • Confianza en la refactorización: cuando se dispone de una cobertura de pruebas completa, se puede refactorizar y mejorar el código base con la confianza de que se sabrá inmediatamente si un cambio tiene consecuencias no deseadas.

Para comprender mejor cómo los agentes de IA están transformando el panorama de la codificación más allá de la simple generación de pruebas, vea esta panorámica de los asistentes de codificación basados en IA y sus capacidades:

Cómo configurar GitHub Copilot para la generación de casos de prueba

Antes de empezar a generar pruebas, debes instalar y configurar GitHub Copilot en tu entorno de desarrollo integrado (IDE). El proceso de configuración es sencillo y solo lleva unos minutos, pero hacerlo correctamente garantiza que Copilot tenga el contexto necesario para ofrecer sugerencias relevantes.

Antes de empezar, necesitarás algunas cosas:

  • Una suscripción activa a GitHub Copilot (Individual, Business o Enterprise).
  • Un IDE con compatibilidad, como VS Code, un IDE de JetBrains (como IntelliJ o PyCharm) o Neovim.
  • Un marco de pruebas como pytest, Jest o JUnit ya instalado en tu proyecto.
Interfaz IDE de Visual Studio Code que ilustra el entorno del editor donde se puede instalar y utilizar GitHub Copilot.

Instala la extensión GitHub Copilot.

En primer lugar, debe instalar la extensión Copilot en su IDE. Este proceso es similar en la mayoría de los editores con compatibilidad.

  1. Abre el mercado de extensiones de tu IDE. En VS Code, es el icono Extensiones de la barra lateral; en los IDE de JetBrains, lo encontrarás en Ajustes → Complementos.
  2. Busca «GitHub Copilot».
  3. Instala tanto la extensión principal de GitHub Copilot como la extensión GitHub Copilot Chat para disfrutar de una experiencia completa.
  4. Se le indicará que reinicie su IDE para completar la instalación.

Después de reiniciar, se le pedirá que inicie sesión con su cuenta de GitHub. Este paso realiza la autenticación de su suscripción. Una vez que haya iniciado sesión, debería ver un pequeño icono de Copilot en la barra de estado de su IDE, lo que confirma que está activo y listo para funcionar.

Configura tu marco de pruebas.

GitHub Copilot genera pruebas más relevantes cuando comprende la configuración específica de las pruebas de tu proyecto. Para ello, analiza tus archivos de prueba y tu configuración existentes para aprender y adaptarse a los patrones de tu equipo.

  • Para proyectos Python que utilizan pytest: asegúrate de tener instalado pytest (pip install pytest). Si tienes un archivo conftest.py o cualquier archivo de prueba existente (aunque sea uno solo), Copilot los utilizará como referencia para generar nuevas pruebas.
  • Para proyectos JavaScript/TypeScript que utilizan Jest: Copilot buscará un archivo jest. config. js y su dependencia Jest en su paquete. json para comprender su configuración.
  • Para proyectos Java que utilizan JUnit: asegúrate de que tus dependencias de JUnit estén correctamente definidas en tu archivo pom.xml (para Maven) o build.gradle (para Gradle).

Tener al menos un archivo de prueba bien escrito en tu proyecto es una de las mejores formas de guiar a Copilot. Este aprenderá tus convenciones de nomenclatura, estilos de afirmación y cómo estructuras tus pruebas, lo que dará lugar a resultados más coherentes.

Integra Copilot con tu IDE.

Una vez instaladas las extensiones, es hora de familiarizarse con la interfaz de Copilot en su IDE. La forma principal de interactuar con ella para la generación de pruebas es a través del panel Copilot Chat.

Interfaz del producto GitHub Copilot que ilustra las capacidades de codificación asistida por IA y generación de pruebas.

Puedes abrir la vista de chat con el atajo de teclado Ctrl+Cmd+I (en Mac) o Ctrl+Alt+I (en Windows/Linux), o haciendo clic en el icono Copilot Chat de la barra de actividades de tu IDE. Este panel de chat es tu centro de comandos para generar pruebas.

Copilot es sensible al contexto, lo que significa que lee los archivos que tienes abiertos actualmente, la estructura de archivos de tu proyecto y cualquier código que hayas seleccionado en tu selección. Para obtener los mejores resultados, mantén siempre abierto y con visibilidad en tu editor el archivo que contiene la función o clase que deseas probar.

🌟 ClickUp Brain, la IA contextual integrada en ClickUp, puede crear rápidamente un plan de pruebas para usted. Pruébelo hoy mismo.

Cómo escribir casos de prueba con GitHub Copilot

GitHub Copilot te ofrece tres formas principales de generar casos de prueba: utilizando el panel de chat con indicaciones detalladas, utilizando comandos de barra inclinada y utilizando acciones inteligentes directamente en tu editor. Cada método es adecuado para diferentes situaciones dentro de tu flujo de trabajo de desarrollo, dependiendo de si necesitas velocidad o un control minucioso.

Utiliza las indicaciones de Copilot Chat.

Usar Copilot Chat con una indicación específica es el método más eficaz para generar casos de prueba. Es ideal para funciones o clases complejas en las que necesitas definir escenarios específicos, simular dependencias o manejar casos extremos complicados.

Este es el flujo de trabajo básico:

  1. Abre el panel Copilot Chat para chatear.
  2. En tu editor, resalta la función, clase o bloque de código que deseas probar.
  3. Escribe una indicación clara y específica en el panel de chat describiendo las pruebas que necesitas.

Por ejemplo, podrías escribir indicaciones como:

  • «Escribe pruebas unitarias para la función seleccionada que cubran la ruta feliz, los casos extremos como entradas vacías y el manejo de errores para datos no válidos».
  • «Genera pruebas pytest para esta clase y crea accesorios para simular la conexión a la base de datos».
  • «Crea pruebas Jest para este componente React que simulen los clics de los usuarios y verifiquen los cambios de estado».

Cuantos más detalles proporciones en tu indicación, mejores serán las pruebas generadas.

Utiliza comandos de barra inclinada como /tests.

Cuando necesites generar pruebas rápidamente y no requieras escenarios muy específicos, el comando de barra inclinada /tests es tu mejor aliado. Es la forma más rápida de obtener una base sólida de cobertura de pruebas.

Para utilizarlo:

  1. Abre el panel Copilot Chat para chatear.
  2. Seleccione el código que desea probar en su editor.
  3. En el cuadro para chatear, simplemente escribe /tests y pulsa Intro.

Copilot generará inmediatamente un conjunto de pruebas unitarias basadas en la estructura y la lógica del código seleccionado. Intentará cubrir la funcionalidad principal y algunas entradas comunes. Si los resultados no son del todo correctos, siempre puedes refinarlos con una indicación de seguimiento como «Ahora añade una prueba para cuando la entrada sea nula».

Utiliza las acciones inteligentes del editor.

Cuando desee generar pruebas sin interrumpir su flujo de trabajo, puede utilizar acciones inteligentes directamente desde su editor de código. Esto le evita tener que cambiar al panel de chat.

  1. Resalta la función o clase que deseas probar.
  2. Haga clic con el botón derecho del ratón sobre la selección para abrir el menú contextual.
  3. Vaya a Generar código en el menú contextual y seleccione Generar pruebas.

Copilot generará las pruebas y, por lo general, las mostrará en una nueva pestaña temporal del editor. Allí podrás revisar el código y, a continuación, elegir entre crear un nuevo archivo de pruebas o añadir las pruebas a uno ya existente.

GitHub Copilot proporciona indicaciones para la generación de casos de prueba.

Tus indicaciones son el volante de GitHub Copilot. Las indicaciones genéricas dan lugar a pruebas genéricas, pero las indicaciones bien elaboradas que dan instrucciones específicas a la IA dan como resultado casos de prueba completos y útiles. La clave es decirle a Copilot no solo qué probar, sino cómo probarlo.

Aquí tienes algunas plantillas que puedes adaptar a diferentes escenarios:

EscenarioPlantilla de indicación
Prueba unitaria básica«Escribe pruebas unitarias para la función [nombre_de_la_función] utilizando [marco]. Asegúrate de cubrir las entradas normales, los valores límite como cero o números negativos, y las entradas no válidas como nulas o indefinidas».
Clase con dependencias«Genera pruebas para la clase [ClassName]. Utiliza [mocking_library] para crear simulaciones para las dependencias [DependencyName] y [AnotherDependencyName]. »
Funciones asíncronas«Cree pruebas para esta función asíncrona. Incluya pruebas para el caso de intento correcto, un caso en el que la promesa se rechaza y un escenario para los tiempos de espera de las solicitudes».
Punto final de la API«Escribe pruebas de integración para este punto final de la API. Cubre un intento correcto de solicitud GET, una solicitud POST con datos válidos, una solicitud con un token de autenticación faltante y una solicitud con datos no válidos que debería devolver un error 400».
Validación de datos«Genera pruebas para esta función de validación. Incluye una prueba para un objeto válido y, a continuación, añade pruebas independientes para cada fallo de la regla de validación con el fin de garantizar que se devuelven los mensajes de error correctos».

Consejos para mejorar las indicaciones:

  • Sé explícito sobre el marco: realiza siempre una mención del marco de pruebas (por ejemplo, pytest, Jest, JUnit) para asegurarte de que la sintaxis es correcta.
  • Defina sus metas de cobertura: utilice técnicas avanzadas de IA para solicitar tipos específicos de cobertura, como «casos extremos», «gestión de errores» o «pruebas de límites».
  • Consulte sus propios patrones: si tiene un buen archivo de ejemplo, puede indicarle a Copilot que «siga el patrón de prueba en tests/test_user. py».
  • Solicite afirmaciones específicas: en lugar de dejar que Copilot adivine, puede pedirle que «afirme que se genera un ValueError para entradas no válidas».

Ejemplos de generación de pruebas con GitHub Copilot

Así es como funciona en la práctica.

Genere pruebas unitarias en Python.

Imagina que tienes una función Python que calcula el precio total de los elementos de un carrito de la compra, incluido el descuento.

Función de muestra para probar:

Indicación utilizada: «Escribe pruebas pytest para calculate_total. Cubre una lista vacía de elementos, un solo elemento, varios elementos, la aplicación de un descuento, un descuento del 0 %, un descuento del 100 % y un porcentaje de descuento no válido que debería generar un ValueError».

Resultado de la prueba generada:

Copilot utilizó correctamente pytest. raises para comprobar la excepción y cubrió los principales escenarios. Es posible que aún desee añadir pruebas para precios o cantidades negativas como refinamiento manual.

Genere pruebas unitarias en TypeScript con Jest.

Ahora, probemos una función TypeScript que aplica un formato al nombre de un usuario.

Función de muestra para probar:

Indicación utilizada: «Generar pruebas Jest para formatDisplayName. Cubrir un usuario con nombre y apellidos, un usuario con un apodo, un usuario con el nombre en blanco y un usuario solo con un apodo».

Resultado de la prueba generada:

Las pruebas generadas utilizan los bloques describe y it estándar de Jest y gestionan correctamente las diferentes rutas lógicas.

Buenas prácticas para la generación de pruebas con GitHub Copilot

El uso de Copilot para la generación de pruebas supone un enorme aumento de la productividad, pero requiere una supervisión cuidadosa para garantizar la calidad.

  • Revisa cada una de las pruebas: esta es la regla de oro. Copilot no entiende tu lógica de negocio, por lo que podría generar una prueba que pase, pero que afirme algo incorrecto. Lee siempre el código generado y pregúntate: «¿Esto realmente verifica el comportamiento correcto?».
  • Verifica manualmente la cobertura de los casos extremos: Copilot es bueno para detectar casos extremos comunes, como entradas nulas o cadenas vacías, pero puede que se le pasen por alto algunos específicos del dominio. En el caso de una aplicación de comercio electrónico, ¿ha probado qué ocurre cuando el total del carrito es exactamente el mínimo para el envío gratis? Tú sigues siendo el experto.
  • Mantén convenciones de nomenclatura coherentes: los nombres de las pruebas generados por IA pueden ser a veces genéricos. Tómate un momento para renombrarlos y adaptarlos al estilo de tu equipo. Un nombre descriptivo como test_login_fails_with_incorrect_password es mucho más útil que test_login_2.
  • Ejecute las pruebas inmediatamente: no deje que las pruebas generadas queden sin ejecutar. Ejecútelas de inmediato para detectar cualquier error de sintaxis o afirmaciones que fallen de forma evidente antes de realizar la confirmación del código.
  • Integración con CI/CD: añade las pruebas generadas a tu canalización de integración continua. Las pruebas que solo se ejecutan localmente ofrecen un valor limitado.
  • Ten cuidado con las pruebas inestables: a veces, la IA puede generar pruebas que son «inestables», es decir, que a veces pasan y otras fallan. Esto suele ocurrir con pruebas que incluyen marcas de tiempo o datos aleatorios. Sustitúyelas siempre por valores deterministas y predecibles.

📮ClickUp Insight: Nuestras encuestas muestran que, mientras que el 34 % de los usuarios opera con total confianza en los sistemas de IA, un grupo ligeramente mayor (38 %) mantiene un enfoque de «confiar, pero verificar». Una herramienta independiente que no está familiarizada con su contexto de trabajo suele conllevar un mayor riesgo de generar respuestas inexactas o insatisfactorias.

Por eso hemos creado ClickUp Brain, la IA que conecta la gestión de proyectos, la gestión del conocimiento y la colaboración en tu entorno de trabajo y herramientas de terceros integradas. Obtén respuestas contextuales sin tener que cambiar de aplicación y experimenta un aumento de 2 a 3 veces en la eficiencia del trabajo, al igual que nuestros clientes de Seequent.

Limitaciones del uso de GitHub Copilot para la generación de casos de prueba

Aunque GitHub Copilot es un gran impulsor de la productividad, no es la panacea para las pruebas de software. Conocer sus límites es clave para utilizarlo de forma eficaz y evitar errores comunes. Es un «copiloto», no el piloto: tú sigues estando al mando del plan de vuelo.

La mayor limitación es su falta de contexto empresarial. Copilot analiza la estructura de su código, pero no tiene ni idea de lo que su aplicación realmente debe hacer para sus usuarios. No puede saber que un usuario «premium» debe tener acceso a determinadas funciones, mientras que un usuario «básico» no, a menos que esa lógica esté explícitamente clara en el código que está leyendo.

Aquí tienes otras limitaciones clave que debes tener en cuenta:

  • Puede pasar por alto casos extremos críticos específicos del dominio: Copilot es excelente para encontrar casos extremos generales, pero no conocerá los casos extraños específicos de su sector, como un cálculo financiero que debe tratar los años bisiestos de forma diferente.
  • No tiene acceso a sistemas externos: Copilot no puede generar pruebas de integración significativas para su base de datos o una API de terceros porque no puede establecer la conexión con ellas. Puede crear el código, pero usted tendrá que rellenar los detalles.
  • Puede dar una falsa sensación de confianza: ver una cobertura de pruebas del 100 % puede ser muy satisfactorio, pero si las pruebas afirman cosas erróneas, ese número de cobertura no tiene sentido. Por eso es tan importante la revisión humana.
  • Límites de la ventana de contexto: los archivos muy grandes o las jerarquías de clases complejas pueden exceder la ventana de contexto de Copilot, lo que resulta en sugerencias incompletas o genéricas.

Cómo crear y gestionar casos de prueba en ClickUp

Generar casos de prueba con GitHub Copilot es solo la mitad del flujo de trabajo. Una vez que las pruebas existen, los equipos aún deben hacer un seguimiento de ellas, enlazarlas a los requisitos y gestionar su ejecución a lo largo de los sprints y las versiones.

ClickUp proporciona un entorno de trabajo centralizado donde los casos de prueba generados por IA pueden coexistir con tareas de desarrollo, errores y planes de sprint, de modo que las pruebas no quedan atrapadas dentro de IDE individuales.

ClickUp actúa como un entorno de trabajo de IA convergente, que reúne la gestión de proyectos, la documentación y la comunicación del equipo en un solo sistema. Para los equipos de software, esto significa que la gestión de casos de prueba ya no es una herramienta o una hoja de cálculo independiente.

Las pruebas, los requisitos, las solicitudes de validación y los debates sobre lanzamientos permanecen conectados, lo que reduce la dispersión del contexto y convierte el control de calidad en una parte fundamental del flujo de trabajo de entrega.

La plantilla de casos de prueba de ClickUp está diseñada para ayudarte a realizar el seguimiento del progreso de los casos de prueba. Facilita las siguientes tareas:

La plantilla de casos de prueba de ClickUp está diseñada para ayudarte a realizar el seguimiento del progreso de los casos de prueba.
  • Revisa los resultados de las pruebas y toma decisiones basadas en datos para corregir incidencias.
  • Desarrolle planes de pruebas personalizados para cada proyecto.
  • Organiza y prioriza los casos de prueba para obtener la máxima eficiencia.

Empieza por crear una lista dedicada en ClickUp que sirva como repositorio de casos de prueba. Cada caso de prueba, ya sea generado por IA o escrito manualmente, se convierte en una tarea.

Enriquece cada caso de prueba con metadatos cruciales utilizando los Campos personalizados de ClickUp para realizar el seguimiento exacto de lo que es importante para tu equipo.

Campos personalizados de ClickUp
Utiliza los campos personalizados con IA de ClickUp para capturar y registrar detalles críticos.
  • Tipo de prueba: desplegable para unidad, integración, de extremo a extremo o manual.
  • Estado de automatización: un estado que indica si la prueba está automatizada o no.
  • Prioridad: alta, media o baja.
  • Última fecha de ejecución: un campo de fecha para realizar el seguimiento de cuándo se ejecutó la prueba por última vez.

Realice un seguimiento de todo el ciclo de vida de las pruebas con los estados personalizados de ClickUp creando un flujo de trabajo que mueva las pruebas de «No ejecutadas» a «Aprobadas», «Fallidas» o «Bloqueadas». Esto proporciona a todos los miembros del equipo, desde los desarrolladores hasta los gestores de productos, una visibilidad instantánea del progreso de la ejecución de las pruebas.

Relaciones en ClickUp
Conecta las tareas de los casos de prueba con tareas relacionadas utilizando ClickUp Relaciones.

Con ClickUp Relaciones, las tareas de los casos de prueba se pueden enlazar directamente con historias de usuario, funciones o epics. Si una prueba falla, puede crear una tarea de informe de errores y enlazarla tanto con la prueba fallida como con la historia original, creando una cadena completa de trazabilidad.

Redacta informes de errores en segundos señalando a ClickUp Brain una tarea de caso de prueba fallida. Como tiene el contexto de todo tu entorno de trabajo, puede extraer detalles de la historia de usuario enlazada y del propio caso de prueba.

🌟 La plantilla de informe de pruebas de ClickUp te permite crear informes más rápidamente, al tiempo que te asegura identificar y abordar los problemas que necesitan mejorar.

Pero eso no es todo lo que puedes hacer. ¿Recuerdas todas esas tareas tediosas de las que hablamos, esas tareas aburridas y repetitivas que siempre conllevan las pruebas? Puedes automatizarlas con ClickUp Automations.

Configure reglas como «Cuando el estado de un caso de prueba cambie a Fallido, cree automáticamente una nueva tarea en la lista de incidencias y asígnela al desarrollador principal».

Pantalla de configuración de ClickUp Automations que muestra las reglas que automatizan las acciones del flujo de trabajo, como la creación de tareas o la actualización de estados.
Automatice las tareas repetitivas de las pruebas con ClickUp Automatizaciones.

Al integrar GitHub con ClickUp, las tareas de los casos de prueba se pueden enlazar con las confirmaciones y las solicitudes de validación. Cuando se combinan los cambios en el código, las tareas de prueba relacionadas se actualizan automáticamente, lo que permite que el equipo de control de calidad, los desarrolladores y los gestores de lanzamientos estén al tanto de los cambios y de lo que hay que volver a probar.

Los paneles de ClickUp te permiten realizar el seguimiento del progreso de las pruebas en tiempo real, visualizar el recuento de errores, la ejecución de casos de prueba y mucho más.

En conjunto, este flujo de trabajo salva la brecha entre las pruebas generadas por IA en GitHub Copilot y la gestión de casos de prueba para todo el equipo en ClickUp, lo que proporciona a los equipos un único sistema para planificar, realizar el seguimiento, realizar la automatización y mejorar su proceso de control de calidad sin necesidad de una coordinación manual constante.

Vea este vídeo para obtener consejos sobre cómo crear un flujo de trabajo de gestión de lanzamientos eficiente:

Simplifica la gestión de casos de prueba con ClickUp.

Las pruebas generadas por IA ya no son artefactos aislados, sino componentes integrados en su proceso de desarrollo, con visibilidad, rastreabilidad y procesabilidad para todo el equipo.

GitHub Copilot genera casos de prueba rápidamente, pero la velocidad por sí sola no garantiza la calidad. Sin una propiedad clara, la trazabilidad de los requisitos y la visibilidad en todos los Sprints, incluso las pruebas bien redactadas pueden quedar obsoletas o pasarse por alto. Ahí es donde importa un sistema de registro.

Al gestionar los casos de prueba en ClickUp, los equipos convierten los resultados generados por la IA en un flujo de trabajo de control de calidad repetible, que conecta las pruebas con los requisitos, los cambios en el código y los cronogramas de lanzamiento. En lugar de hacer malabarismos con herramientas y actualizaciones manuales, los equipos de control de calidad e ingeniería trabajan desde un entorno de trabajo compartido y contextual. El resultado no es solo más pruebas, sino también más confianza en lo que se envía y por qué.

¿Está listo para gestionar sus casos de prueba junto con sus sprints y lanzamientos? Empiece hoy mismo gratis con ClickUp.

Preguntas frecuentes

Sí, Copilot puede analizar la estructura y la lógica del código heredado para generar una base de pruebas. Sin embargo, es probable que estas pruebas requieran una revisión y un perfeccionamiento manuales significativos, ya que la IA no tendrá contexto sobre comportamientos no documentados o reglas de negocio históricas.

La precisión sintáctica es muy alta, pero la precisión lógica depende de la claridad de su código y de la especificidad de sus indicaciones. Revise siempre las afirmaciones para asegurarse de que verifican requisitos empresariales significativos, y no solo confirman la implementación actual (y posiblemente defectuosa).

Sí, Copilot ofrece una excelente compatibilidad con pytest, unittest y otros marcos de pruebas populares de Python. Es experto en reconocer y replicar patrones existentes en tu proyecto, como el uso de accesorios o pruebas parametrizadas.

Los equipos eficaces utilizan una plataforma centralizada de gestión de proyectos para gestionar sus conjuntos de pruebas. Al realizar el seguimiento de cada caso de prueba como una tarea con metadatos personalizados para el estado y la prioridad, obtienen visibilidad de la cobertura y los resultados de la ejecución, conectando el proceso de control de calidad directamente con la planificación de sprints y el seguimiento de incidencias.