Guía Completa de Entrevistas Técnicas en Pruebas de Software

Fundamentos del Ciclo de Vida y Modelos de Pruebas

El ciclo de vida del desarrollo de software (SDLC) abarca desde la concepción inicial de la idea hasta el retiro final del producto. Incluye etapas como análisis de requisitos, diseño arquitectónico, codificación, pruebas, despliegue y mantenimiento. Los modelos más populares para estructurar este ciclo incluyen el modelo en Cascada (ideal para requisitos estáticos), el modelo en Espiral, el desarrollo Iterativo y las metodologías Ágiles.

El control de versiones es fundamental para gestionar los cambios en el código. Git, un sistema distribuido creado por Linus Torvalds, y SVN son las herramientas más utilizadas para mantener un historial de modificaciones y facilitar la colaboración en equipos de desarrollo.

Dentro de la planificación, el modelo W (doble V) destaca por integrar las pruebas en paralelo al desarrollo desde las etapas iniciales (análisis de requisitos). Esto permite la detección temprana de defectos, reduciendo significativamente los costos de corrección en comparación con el modelo V tradicional, donde las pruebas comienzan después de la fase de codificación.

Un defecto o bug se define como cualquier discrepancia entre el comportamiento esperado del software (basado en los requisitos) y el comportamiento real. Los principios fundamentales del testing establecen que es imposible probar exhaustivamente un sistema, por lo que el esfuerzo debe centrarse en áreas críticas y aplicar la regla de Pareto (80/20), donde la mayoría de los errores suelen concentrarse en módulos específicos.

Pruebas Web y Seguridad de Aplicaciones

En el ámbito de las aplicaciones web, la interacción con bases de datos requiere un dominio de SQL. Para análisis complejos, se emplean consultas con INNER JOIN para relacionar tablas, y funciones de agregación como AVG o COUNT combinadas con GROUP BY para identificar datos anómalos o promedios. Para elminar duplicados, se utiliza DISTINCT.

La comprensión del DOM y las tecnologías frontend es crucial. Por ejemplo, la diferencia entre src y href: el atributo src detiene el renderizado de la página hasta que carga el recurso (como scripts), mientras que href permite la descarga paralela sin bloquear el procesamiento del documento.

En materia de seguridad, los testers deben comprender tres vectores de ataque principales:

  • Inyección SQL: Ocurre cuando entradas de usuario no saneadas se concatenan en consultas SQL, permitiendo la ejecución de comandos maliciosos. Se previene usando consultas preparadas (PreparedStatements) o validación estricta.
  • XSS (Cross-Site Scripting): Inyección de scripts maliciosos en páginas vistas por otros usuarios. Puede ser reflejado o persistente (almacenado en la base de datos).
  • CSRF (Cross-Site Request Forgery): Obliga a un usuario autenticado a ejecutar acciones no deseadas en una aplicación. Se mitiga mediante tokens anti-CSRF o validación de cabeceras Referer.

Pruebas en Aplicaciones Móviles

Las pruebas en aplicaciones móviles comparten metodologías con el testing web, pero introducen desafíos propios de la arquitectura C/S (Cliente/Servidor) y las limitaciones de hardware. A diferencia de la web, donde una actualización en el servidor despliega el cambio instantáneamente, en móviles se debe considerar la fragmentación de versiones instaladas en los dispositivos.

Las pruebas específicas para móviles incluyen:

  • Interrupciones: Llamadas, SMS, alarmas o batería baja durante la ejecución.
  • Redes débiles y transiciones: Simulación de pérdida de paquetes y conmutación entre Wi-Fi y datos móviles.
  • Ciclo de vida de la app: Instalación, actualización incremental, desinstalación y paso a segundo plano.
  • Consumo de recursos: Monitoreo de batería, CPU, memoria y tráfico de red.

Para Android, ADB (Android Debug Bridge) es la herramienta principal. Opera mediante una arquitectura cliente-servidor compuesta por el cliente ADB, el servidor en la máquina de desarrollo y el demonio (adbd) en el dispositivo. Comandos como adb logcat son esenciales para capturar logs y diagnosticar cuelgues. Asimismo, el ciclo de vida de un componente Activity pasa por estados como creación, inicio, reanudación, pausa y destrucción, los cuales deben probarse rigurosamente.

El rendimiento de arranque de la app se evalúa en cuatro escenarios: arranque en frío (proceso inexistente), tibio (proceso en segundo plano), caliente (actividad presente) y renderizado del primer fotograma.

Pruebas de APIs y Microservicios

Las pruebas de interfaces (APIs) validan la comunicación entre sistemas, comúnmente mediante HTTP o RPC (Remote Procedure Call). En HTTP, el método GET solicita datos mediante la URL, mientras que POST envía cargas útiles (payloads) en el cuerpo de la petición. Los códigos de estado HTTP indican el resultado: 1xx (informativos), 2xx (éxito), 3xx (redirecciones), 4xx (errores del cliente) y 5xx (errores del servidor).

Para la automatización y ejecución de pruebas de integración, frameworks como JUnit y TestNG en Java son ampliamente adoptados. TestNG ofrece anotaciones potentes como @BeforeSuite, @Test y @DataProvider para gestionar la inyección de datos y la ejecución paralela de pruebas, permitiendo generar reportes estructurados.

Automatización y Frameworks de Testing

La automatización de pruebas requiere una sólida base de programación. En Python, por ejemplo, es vital distinguir entre tipos de datos mutables (listas, diccionarios) e inmutables (tuplas, cadenas). El paso de argumentos variables en funciones se maneja con *args (tuplas de argumentos posicionales) y **kwargs (diccionarios de argumentos nombrados).

Al plantear automatización, el patrón Page Object Model (POM) es un estándar en pruebas UI. Separa la lógica de localización de elementos de la lógica de validación de pruebas, mejorando el mantenimiento del código.

Manipulación de Datos y Algoritmos en Python

Cálculo de potencias mediante recursividad:

def calculate_power(base, exponent):
    if exponent == 0:
        return 1
    return base * calculate_power(base, exponent - 1)

print(calculate_power(3, 4))

Conteo de frecuencias de elementos en una lista:

def count_frequencies(data_list):
    frequency_map = {}
    for element in data_list:
        frequency_map[element] = frequency_map.get(element, 0) + 1
    return frequency_map

numbers = [1, 2, 3, 4, 12, 22, 15, 44, 3, 4, 4, 4, 7, 7, 44, 77, 100]
print(count_frequencies(numbers))

Obtención de prefijos comunes en una lista de cadenas:

def find_common_prefix(strings):
    prefix = ""
    for chars in zip(*strings):
        if len(set(chars)) == 1:
            prefix += chars[0]
        else:
            break
    return prefix

Identificación de duplicados en un arreglo:

from collections import Counter

def get_duplicates(elements):
    counts = Counter(elements)
    return [item for item, count in counts.items() if count > 1]

data = [1, 2, 3, 3, 4, 4]
print(get_duplicates(data))

Implementación de ordenamiento de burbuja bidireccional:

def bidirectional_bubble_sort(array):
    left = 0
    right = len(array) - 1
    swapped = True
    
    while swapped:
        swapped = False
        
        for i in range(left, right):
            if array[i] > array[i + 1]:
                array[i], array[i + 1] = array[i + 1], array[i]
                swapped = True
                
        if not swapped:
            break
            
        right -= 1
        swapped = False
        
        for i in range(right - 1, left - 1, -1):
            if array[i] > array[i + 1]:
                array[i], array[i + 1] = array[i + 1], array[i]
                swapped = True
                
        left += 1
        
    return array

unsorted = [8, 6, 4, 3, 9, 1, 2, 5, 7]
print(bidirectional_bubble_sort(unsorted))

En la automatización de UI con Selenium, los retos más comunes incluyen la sincronización. Las esperas implícitas aplican un tiempo global de espera para todos los elementos, mientras que las esperas explícitas (WebDriverWait) permiten condiciones personalizadas para elementos específicos, optimizando la ejecución. Las estrategias de localización más robustas son por ID y selectores CSS, alternando a XPath cuando es estrictamente necesario.

Etiquetas: Selenium Appium Python testng SQL

Publicado el 7-13 05:04