# Verificación de software

La verificación de software es una disciplina de la ingeniería de software cuyo objetivo es asegurar que el software satisface por completo todos los requisitos esperados.

## Amplio alcance y clasificación

Una definición de amplio alcance de la verificación la hace equivalente al testing de software. Por ello, hay dos enfoques principales en cuanto a la verificación
* Verificación dinámica, también conocida como experimentación, testing dinámico o, simplemente testing. - Que es apropiado para encontrar fallos (bugs de software).
* Verificación estática, también conocida como análisis or, testing estático - Que es útil para probar la corrección de un programa. Aunque puede dar lugar a falsos positivos cuando hay uno o más conflictos entre lo que hace realmente el proceso del software y lo que la verificación estática asume que hace.

## Verificación dinámica (test, experimentación)

La verificación dinámica es llevada a cabo durante la ejecución del software, y dinámicante comprueba su comportamiento; se conoce comúnmente como fase de testing. La verificación es un proceso de revisión. Dependiendo de la extensión de los tests, se pueden catalogar en tres familias:
* Test corto: un test que comprueba una única función o clase (test unitario)
* Test largo: un test que comprueba un grupo de clases, como
** Test de módulo (un único módulo)
** Test de integración (más de un módulo)
** Test de sistema (todo el sistema)
* Test de aceptación: un test formal definido para comprobar el criterio de aceptación del software
** Test funcional
** Test no funcional (ejecución, test de estrés)
El objetivo de la verificación dinámica de software es encontrar errores presentados por una actividad (por ejemplo, tener un software para analizar datos bioquímicos); o por la acción repetitiva de una o más acciones (como un test de estrés para un servidor web, i.e. comprobar si el producto actual de la actividad es tan correcto como lo era al comienzo de la actividad).

## Verificación estática (análisis)

La verificación estática es el proceso de comprobar que el software cumple con los requisitos, inspeccionándolo antes de ejecutar el código. Por ejemplo:
* Verificación de convenciones de código
* Detección de mala praxis (antipatrones)
* Cálculo de métricas de software
* Verificación formal
Verificación por análisis - El método de análisis de verificación se aplica a la verificación por investigación, cálculos matemáticos, evaluación lógica y cálculos usando métodos de libros de texto clásicos o métodos de ordenador de uso general aceptados. El análisis incluye muestro, y correlación de datos medidos y tests observados con valores esperados para establecer la conformidad con los requisitos.

## Alcance limitado

Cuando es definido más estrictamente, la verificación es equivalente solo al testing estático y está destinado a ser aplicado a artefactos. Y, la validación (de todo el producto software) sería equivalente al testing dinámico y destinado a ser aplicado al producto software en ejecución (no sus artefactos, a excepción de los requisitos). Se debe advertir que los requisitos de validación pueden comprobarse estática y dinámicamente (ver validación de artefactos).

## Comparativa con la validación

La verificación de software se confunde usualmente con la validación de software. Las diferencias entre <i id="mwPA">verificación</i> y <i id="mwPQ">validación</i> software son:
* La verificación de software pregunta "¿Estamos construyendo correctamente el producto?"; esto es, ¿el software cumple con sus requisitos? (como una casa cumple con sus planos).
* La validación de software pregunta "¿Estamos construyendo el producto correcto?"; esto es, ¿hace el software lo que el usuario realmente requiere? (como una casa cumple con lo que el propietario necesita y quiere).