Condiciones para la transmisión de señales sin distorsiones. Transferencia de información. Condiciones para la transmisión de señales sin distorsiones mediante un cuadrupolo lineal.

Las pruebas de integración consisten en probar una parte de un sistema que consta de dos o más módulos. La tarea principal de las pruebas de integración es buscar defectos asociados con errores en la implementación e interpretación de la interacción de la interfaz entre módulos.

Desde un punto de vista tecnológico, las pruebas de integración son un desarrollo cuantitativo de las pruebas unitarias, ya que, al igual que las pruebas unitarias, operan en las interfaces de módulos y subsistemas y requieren la creación de un entorno de prueba, que incluye stubs en lugar de los módulos faltantes. La principal diferencia entre las pruebas unitarias y de integración son los objetivos, es decir, los tipos de defectos detectados, que a su vez determinan la estrategia para seleccionar los datos de entrada y los métodos de análisis. En particular, a nivel de pruebas de integración, a menudo se utilizan métodos asociados con la cobertura de interfaces, por ejemplo, llamar a funciones o métodos, o analizar el uso de objetos de interfaz, como recursos globales, instalaciones de comunicación proporcionadas por el sistema operativo.

En la figura. La Figura 15 muestra la estructura del complejo del programa K, que consta de los módulos M1, M2, M11, M12, M21, M22 probados en la etapa de prueba unitaria. El problema resuelto por el método de prueba de integración es la prueba de las conexiones intermodulares implementadas durante la ejecución del software del complejo K.

Arroz. 15. Ejemplo de la estructura de un paquete de software.

Las pruebas de integración utilizan un modelo de caja blanca a nivel de unidad. Dado que el evaluador conoce el texto del programa en detalle antes de llamar a todos los módulos incluidos en el complejo bajo prueba, el uso de criterios estructurales en en esta etapa posible y justificado.

Las pruebas de integración se utilizan en la etapa de ensamblar módulos probados unitariamente en un solo complejo. Hay dos métodos conocidos para ensamblar módulos:

Monolítico, caracterizado por la integración simultánea de todos los módulos en un complejo probado;

Incremental, caracterizado por la construcción paso a paso (módulo por módulo) de un conjunto de programas con pruebas paso a paso del complejo ensamblado.

En el método incremental, existen dos estrategias para agregar módulos:

1) “Top-down” y sus correspondientes pruebas ascendentes.

2) Pruebas “de abajo hacia arriba” y, en consecuencia, de arriba hacia abajo.

Las características de las pruebas monolíticas son las siguientes: para reemplazar los módulos que no fueron desarrollados en el momento de las pruebas, excepto el superior (módulo K en la Fig. 15), es necesario desarrollar adicionalmente controladores (controlador de pruebas) y/o stubs (stubs) que reemplazan los módulos que faltaban en el momento de la sesión de prueba niveles más bajos.

Una comparación de los enfoques monolítico e integral arroja lo siguiente.

1. Las pruebas monolíticas requieren mucho trabajo asociado con el desarrollo adicional de controladores y stubs y la dificultad de identificar errores que aparecen en el espacio del código ensamblado.

2. Pruebas paso a paso se asocia con una menor laboriosidad en la identificación de errores debido a un aumento gradual en el volumen de código probado y, en consecuencia, a la localización del área agregada del código probado.

Las características de las pruebas de arriba hacia abajo son las siguientes: organización de un entorno para la cola ejecutable de llamadas por módulos probados de los módulos probados, desarrollo y uso constante de stubs, organización de pruebas prioritarias de módulos que contienen operaciones de intercambio con el entorno o módulos crítico para el algoritmo que se está probando.

Por ejemplo, el orden de prueba del complejo K (Fig. 15) durante la prueba de arriba hacia abajo podría ser el que se muestra a continuación, donde equipo de prueba, desarrollado para el módulo Mi, se denota como XYi = (X, Y)i.

K->XYk
M1->XY1
M11->XY11
M2->XY2
M22->XY22
M21->XY21
M12->XY12

Las desventajas de las pruebas de arriba hacia abajo incluyen:

El problema de desarrollar stubs suficientemente “inteligentes”, es decir terminales capaces de utilizarse para simular varios modos de funcionamiento del complejo necesario para las pruebas;

La complejidad de organizar y desarrollar un entorno para implementar la ejecución de módulos en la secuencia requerida;

La implementación de módulos no siempre es efectiva debido a la adaptación (especialización) de módulos de nivel inferior aún no probados a módulos ya probados. niveles superiores con desarrollo paralelo de módulos de niveles superior e inferior.

Las características de las pruebas ascendentes son la organización del orden de montaje y la transición a los módulos de prueba correspondientes al orden de su implementación.

Por ejemplo, el orden de prueba del complejo K (Fig. 15) durante la prueba de arriba hacia abajo podría ser el siguiente:

M11->XY11
M12->XY12
M1->XY1
M21->XY21
M2(M21, trozo(M22))->XY2
K(M1, M2(M21, Trozo(M22)) ->XYk
M22->XY22
M2->XY2
K->XYk

Las desventajas de las pruebas ascendentes incluyen:

Retraso en la verificación de las características conceptuales del complejo probado;

La necesidad de desarrollar y utilizar controladores.

Ni un solo desarrollo software no puedo prescindir de las pruebas código ejecutable. De hecho, ocupa la mitad del tiempo total de desarrollo y más de la mitad del coste del proyecto. Sin embargo, esto es una parte integral del proceso de creación de nuevas aplicaciones, programas y sistemas.

Pruebas de integración como parte de un gran trabajo

Una de las formas de controlar la calidad del software son las pruebas de integración, cuyos datos se toman de los módulos individuales probados en la etapa anterior.

A diferencia de versión modular, durante el cual se identifican errores que se localizan en cada función o clase individual, las pruebas de integración son la búsqueda de defectos asociados con la implementación de la interacción entre en partes separadas producto creado. Integración pruebas funcionales utiliza el método de la “caja blanca”, es decir, el ingeniero de calidad tiene acceso y conocimiento de los textos de cada módulo individual, así como de los principios de interacción entre ellos.

Métodos de montaje del módulo.

El método monolítico significa que todos los módulos que estarán sujetos a pruebas de integración en el futuro se ensamblan al mismo tiempo. Es casi seguro que surjan situaciones en las que parte del complejo bajo prueba aún no esté listo.

En este caso, se reemplaza por "stubs" o controladores desarrollados adicionalmente.

Junto con el método monolítico, se distingue el método incremental (también llamado paso a paso), ya que el volumen del código probado aumenta gradualmente, lo que permite localizar áreas con defectos en las relaciones entre partes individuales.

El método incremental incluye dos formas de agregar módulos:

  • de arriba hacia abajo o ascendente,
  • de abajo hacia arriba - descendente.

Características de las pruebas monolíticas e incrementales.

Principal desventaja tipo monolítico asambleas - gran número Se gastan tiempo y costes laborales en simular las partes faltantes del complejo probado. Parecería que los talones son suficientes. herramienta útil Sin embargo, durante las pruebas surgen situaciones en las que durante el proceso es necesario recrear partes de simulación del programa. Por ejemplo, si cambia la composición de los módulos probados. Además, la eficiencia de encontrar defectos no es tan alta cuando el trabajo no se realiza con un producto real, sino solo con un componente ficticio. El mismo inconveniente también acompaña a las pruebas incrementales con un método de construcción ascendente.

Al mismo tiempo, una de las desventajas método paso a paso es la necesidad de organizar y crear un entorno para ejecutar módulos en una secuencia determinada. También es prácticamente imposible desarrollar los niveles superior e inferior en paralelo.

Por supuesto, ambos métodos de montaje, monolítico e incremental, no sólo tienen desventajas, sino también ventajas. En el primer caso, surgen excelentes oportunidades para desarrollo paralelo todas las clases y funciones involucradas en las pruebas, como en etapa inicial, y después de la modificación. El método paso a paso requiere menos mano de obra: los módulos se agregan gradualmente y los errores y defectos también se descubren gradualmente. Se sabe que esto reduce el tiempo dedicado a buscarlos.

Beneficios de las pruebas de integración

En esta etapa, se lleva a cabo una enorme cantidad de trabajo para verificar las relaciones de todos los niveles, sin el cual, por supuesto, es imposible realizar más pruebas.

Las pruebas de integración de software tienen una serie de ventajas:

  • comprobar la interfaz de interacción entre módulos de programa individuales;
  • control de las relaciones entre las soluciones de software complejas probadas y de terceros;
  • probar el funcionamiento de los componentes externos de la solución;
  • control del cumplimiento de la documentación del proyecto en términos de interacción módulos individuales.

Corrección de defectos

Las pruebas de integración están completas, pero eso no es todo. Los errores encontrados se registran y se envían al desarrollador para su corrección, tras lo cual el proceso comienza de nuevo.

En primer lugar, es necesario comprobar si se han eliminado los defectos identificados. En segundo lugar, durante el cambio código fuente Es posible que hayan surgido nuevos errores en el funcionamiento del programa y en la interacción con software de terceros.

Aunque en la actualidad existe una gran cantidad de métodos de control de calidad, todavía existen muchos papel importante Las pruebas de integración juegan un papel. Un ejemplo de este tipo de verificación puede demostrar claramente los obstáculos en el desarrollo y la documentación de software.

Automatización de pruebas

Dependiendo del volumen del complejo de datos original y área temática desarrollo, puede surgir el problema del tiempo de prueba y la intensidad del trabajo del evento en su conjunto.

Para la mayoría verificación efectiva El desarrollo requiere el uso de una gran cantidad de datos de entrada y condiciones, que es imposible de manejar "manualmente". La automatización de pruebas se utiliza para resolver este problema. Al igual que otros tipos, las pruebas de integración también se pueden automatizar. Esto reducirá el tiempo general de desarrollo y también aumentará la eficiencia del proceso de detección de errores.

Sin embargo, la automatización de pruebas no puede sustituir completamente el trabajo de un ingeniero de calidad, sino sólo complementarlo.

Por tanto, las pruebas de integración son una parte integral del desarrollo de cualquier software y una de las etapas de todo el proceso de verificación de la calidad del producto. Como cualquier método, tiene una serie de ventajas y desventajas, pero sin su uso, el desarrollo de software de alta calidad se vuelve imposible.

Anotación: La conferencia es la segunda de tres que cubren los niveles del proceso de verificación. El tema de esta conferencia es el proceso de pruebas de integración, sus tareas y objetivos. están siendo considerados aspectos organizativos pruebas de integración: clasificación estructural y temporal de los métodos de pruebas de integración, planificación de pruebas de integración. El propósito de esta conferencia: dar una idea del proceso de pruebas de integración, sus componentes técnicos y organizativos.

20.1. Objetivos y metas de las pruebas de integración.

El resultado de las pruebas y verificación de los módulos individuales que componen el sistema de software debe ser una conclusión de que estos módulos son internamente consistentes y cumplen con los requisitos. Sin embargo, los módulos individuales rara vez funcionan por sí solos, por lo que la siguiente tarea después de probar los módulos individuales es probar la interacción correcta de varios módulos combinados en un solo todo. Este tipo de prueba se llama integración. Su propósito es garantizar que los componentes del sistema funcionen juntos correctamente.

Pruebas de integración también llamado pruebas de arquitectura del sistema. Por un lado, este nombre se debe a que las pruebas de integración incluyen comprobaciones de todos tipos posibles interacciones entre módulos de software y elementos que están definidos en la arquitectura del sistema; por lo tanto, las pruebas de integración verifican lo completo interacciones en la implementación del sistema que se está probando. Por otro lado, los resultados de las pruebas de integración son una de las principales fuentes de información para el proceso de mejora y clarificación de la arquitectura del sistema, las interfaces entre módulos e intercomponentes. Es decir, desde este punto de vista, las pruebas de integración verifican exactitud interacción de los componentes del sistema.

Un ejemplo de verificación de la exactitud de la interacción pueden ser dos módulos, uno de los cuales acumula mensajes de protocolo sobre archivos recibidos, y el segundo muestra este protocolo en la pantalla. Los requisitos funcionales del sistema establecen que los mensajes deben mostrarse en orden cronológico inverso. Sin embargo, el módulo de almacenamiento de mensajes los almacena en en orden directo y el módulo de salida utiliza la pila para generar en orden inverso. Pruebas unitarias, afectar a cada módulo por separado no tendrá ningún efecto aquí; la situación opuesta es bastante posible, en la que los mensajes se almacenan en orden inverso y se generan mediante una cola. Descubrir problema potencial Esto sólo se puede hacer comprobando la interacción de los módulos mediante pruebas de integración. El punto clave La razón es que el sistema en su conjunto genera mensajes en orden cronológico inverso, es decir, al verificar el módulo de salida y descubrir que genera mensajes en orden directo, no podemos garantizar que hayamos detectado un defecto.

Como resultado de las pruebas de integración y la eliminación de todos los defectos identificados, se obtiene una arquitectura consistente y holística del sistema de software, es decir. podemos suponer que pruebas de integración está probando la arquitectura y los requisitos funcionales de bajo nivel.

Pruebas de integración, por regla general, es un proceso iterativo en el que se prueba la funcionalidad de un conjunto cada vez mayor de módulos.

20.2. Organización de pruebas de integración.

20.2.1. Clasificación estructural de los métodos de prueba de integración.

Como regla general, las pruebas de integración se llevan a cabo después de completar las pruebas unitarias para todos los módulos integrados. Sin embargo, este no es siempre el caso. Existen varios métodos para realizar pruebas de integración:

  • prueba ascendente;
  • pruebas monolíticas;
  • pruebas de arriba hacia abajo.

Todas estas técnicas se basan en el conocimiento de la arquitectura del sistema, que a menudo se representa como diagramas de estructura o diagramas de llamada de funciones. Cada nodo en dicho diagrama representa un módulo de software y las flechas entre ellos representan dependencias de llamadas entre módulos. La principal diferencia entre las técnicas de prueba de integración es la dirección del movimiento a lo largo de estos diagramas y la amplitud de la cobertura por iteración.

Pruebas ascendentes. Este método supone que todo se prueba primero. módulos de software, incluidos en el sistema y solo entonces se combinan para las pruebas de integración. Con este enfoque, la localización de errores se simplifica enormemente: si los módulos se prueban por separado, entonces el error cuando trabajando juntos hay un problema con su interfaz. Con este enfoque, el área de búsqueda de problemas del evaluador es bastante estrecha y, por lo tanto, la probabilidad de identificar correctamente un defecto es mucho mayor.


Arroz. 20.1.

Sin embargo, método ascendente pruebas disponibles inconveniente significativo- la necesidad de desarrollar un controlador y stubs para las pruebas unitarias antes de realizar las pruebas de integración y la necesidad de desarrollar un controlador y stubs durante las pruebas de integración de parte de los módulos del sistema (Fig. 20.1)

Por un lado están los controladores y los enchufes. poderosa herramienta Las pruebas, por otro lado, su desarrollo requieren recursos significativos, especialmente cuando la composición de los módulos integrados cambia; en otras palabras, puede ser necesario un conjunto de controladores para las pruebas unitarias de cada módulo, un controlador separado y stubs para probar la integración. de dos módulos del conjunto, uno separado para probar la integración de tres módulos, etc. Esto se debe principalmente al hecho de que la integración del módulo elimina la necesidad de algunos códigos auxiliares y también requiere un cambio de controlador que admita nuevas pruebas que afecten a varios módulos.

Pruebas monolíticas asume que componentes individuales Los sistemas no han sido sometidos a pruebas serias. Ventaja principal este método- no es necesario desarrollar un entorno de prueba, controladores ni códigos auxiliares. Una vez desarrollados todos los módulos, se lleva a cabo su integración y luego se prueba el sistema en su conjunto. Este enfoque no debe confundirse con las pruebas del sistema, que es el tema de la próxima conferencia. A pesar de que las pruebas monolíticas comprobarán el funcionamiento de todo el sistema en su conjunto, la tarea principal de estas pruebas es identificar problemas con la interacción de los módulos individuales del sistema. la tarea prueba del sistema Es una evaluación de las características cualitativas y cuantitativas del sistema desde el punto de vista de su aceptabilidad para el usuario final.

Pruebas monolíticas tiene una serie de serias desventajas.

  • Es muy difícil identificar la fuente del error (identificar el fragmento de código erróneo). La mayoría de los módulos deberían asumir que hay un error. El problema se reduce a determinar cuál de los errores en todos los módulos involucrados condujo al resultado. Esto puede introducir efectos de error. Además, un error en un módulo puede bloquear la prueba de otro.
  • Es difícil organizar correcciones de errores. Como resultado de la prueba, el probador registra el problema encontrado. El desarrollador solucionará el defecto en el sistema que causó este problema. Dado que, por regla general, los módulos bajo prueba están escritos diferentes personas Surge el problema: ¿cuál de ellos es responsable de encontrar y eliminar el defecto? Con tal “irresponsabilidad colectiva”, la velocidad de eliminación de defectos puede disminuir drásticamente.
  • El proceso de prueba está poco automatizado. La ventaja (no hay software adicional que acompañe al proceso de prueba) se convierte en una desventaja. Cada cambio realizado requiere repetir todas las pruebas.

Pruebas de arriba hacia abajo Se supone que el proceso de prueba de integración sigue al desarrollo. En primer lugar, sólo se prueba el nivel de control más alto del sistema, sin módulos más nivel bajo. Luego, gradualmente, los de nivel inferior se integran con los módulos de nivel superior. Como resultado del uso de este método, no hay necesidad de controladores (la función del controlador la desempeña un módulo del sistema de nivel superior), pero persiste la necesidad de stubs (Fig. 20.2).

Ud. diferentes especialistas En el campo de las pruebas, existen diferentes opiniones sobre qué método es más conveniente para pruebas reales sistemas de software. Jordania sostiene que pruebas de arriba hacia abajo Es más apropiado en situaciones de la vida real, y Myers cree que cada enfoque tiene sus propias ventajas y desventajas, pero en general el método ascendente es mejor.

La literatura a menudo menciona un método de prueba de integración de sistemas de software orientados a objetos, que se basa en identificar grupos de clases que juntas tienen alguna funcionalidad cerrada y completa. En esencia, este enfoque no es un nuevo tipo de prueba de integración; simplemente cambia el elemento mínimo resultante de la integración. Al integrar módulos en lenguajes procesales programación, puede integrar cualquier número de módulos, sujeto al desarrollo de stubs. Al integrar clases en clústeres, existe una restricción bastante laxa sobre la integridad de la funcionalidad del clúster. Sin embargo, incluso en el caso de sistemas orientados a objetos, es posible integrar cualquier número de clases utilizando clases stub.

Independientemente del método de prueba de integración utilizado, es necesario tener en cuenta el grado de cobertura de la funcionalidad del sistema mediante las pruebas de integración. El trabajo propuso un método para evaluar el grado de cobertura basado en llamadas de control entre funciones y flujos de datos. Con esta evaluación, se debe ejecutar el código de todos los módulos en el diagrama de estructura del sistema (se deben cubrir todos los nodos), se deben ejecutar todas las llamadas al menos una vez (se deben cubrir todas las conexiones entre los nodos en el diagrama de estructura), todas las secuencias de llamadas debe ejecutarse al menos una vez (se deben cubrir todos los caminos en el diagrama de estructura).

prueba pedagógica

Una prueba pedagógica se define como un sistema de tareas de un contenido determinado, de dificultad creciente, de una forma específica, que permite medir cualitativa y eficazmente el nivel y evaluar la estructura de preparación de los estudiantes. En la prueba pedagógica, las tareas se organizan en orden de dificultad creciente, desde la más fácil hasta la más difícil.

prueba integrativa

Una prueba integrativa puede denominarse prueba que consta de un sistema de tareas que cumplen con los requisitos de contenido integrador, una forma de prueba y una dificultad creciente de las tareas destinadas a un diagnóstico final generalizado de la preparación de un egresado de una institución educativa.

El diagnóstico se lleva a cabo presentando tales tareas, cuyas respuestas correctas requieren conocimientos integrados (generalizados, claramente interrelacionados) en el campo de dos y más disciplinas educativas. La creación de tales pruebas se otorga solo a aquellos maestros que tienen conocimiento de una serie de disciplinas académicas, comprenden el importante papel de las conexiones interdisciplinarias en el aprendizaje y son capaces de crear tareas cuyas respuestas correctas requieren que los estudiantes tengan conocimiento de varios disciplinas y la capacidad de aplicar dichos conocimientos. Las pruebas integradoras van precedidas de la organización de la formación integradora. Desafortunadamente, la forma actual de impartir clases clase-lección, combinada con una fragmentación excesiva de las disciplinas académicas, junto con la tradición de enseñar disciplinas individuales (en lugar de cursos generalizados), obstaculizará durante mucho tiempo la implementación de un enfoque integrador en los procesos. de aprendizaje y seguimiento de la preparación.

La ventaja de las pruebas integradoras frente a las heterogéneas radica en el mayor contenido informativo de cada tarea y en el menor número de tareas en sí.

La metodología para la creación de pruebas integradoras es similar a la metodología para la creación de pruebas tradicionales, con la excepción del trabajo de determinación del contenido de las tareas. Para seleccionar el contenido de las pruebas integrativas es obligatorio el uso de métodos expertos.

Prueba adaptativa

La prueba adaptativa funciona como un buen examinador. Primero "hace" una pregunta. dificultad media, y la respuesta resultante se evalúa inmediatamente. Si la respuesta es correcta, entonces aumenta la evaluación de las capacidades del examinado. En este caso, se plantea una pregunta más difícil. Si el estudiante responde exitosamente una pregunta, se elige la siguiente como más difícil; si no responde, se elige la siguiente más fácil;

La principal ventaja de un test adaptativo frente a uno tradicional es la eficiencia. Una prueba adaptativa puede determinar el nivel de conocimientos del examinado con menos preguntas (a veces la duración de la prueba se reduce hasta en un 60%).

En una prueba adaptativa, en promedio, tienes más tiempo para pensar en cada pregunta que en una prueba normal. Por ejemplo, en lugar de tomar 2 minutos por pregunta, un examinado adaptativo podría tener 3 o 4 minutos (dependiendo de cuántas preguntas necesite responder).

La confiabilidad de los resultados de la prueba adaptativa coincide con la confiabilidad de las pruebas de duración fija. Ambos tipos de pruebas evalúan con la misma precisión el nivel de conocimientos.

Sin embargo, se cree ampliamente que la prueba adaptativa es una evaluación de conocimientos más precisa. Esto no es cierto.

Del curso del instituto sobre tecnologías de programación aprendí la siguiente clasificación tipos de pruebas (criterio - grado de aislamiento del código). La prueba ocurre:

  • Pruebas unitarias: prueba de un módulo de forma aislada.
  • Pruebas de integración: prueba de un grupo de módulos interactivos.
  • Pruebas del sistema: probar el sistema en su conjunto.
La clasificación es buena y clara. Sin embargo, en la práctica resulta que cada tipo de prueba tiene sus propias características. Y si no se tienen en cuenta, las pruebas se vuelven onerosas y no se hacen tan bien como deberían. Aquí he recopilado enfoques para aplicación real varios tipos pruebas. Y como estoy escribiendo en .NET, los enlaces serán a las bibliotecas correspondientes.

Pruebas unitarias

Las pruebas de bloques (modulares, pruebas unitarias) son las más comprensibles para un programador. De hecho, se trata de probar los métodos de una clase de programa de forma aislada del resto del programa.

No todas las clases son fáciles de cubrir con pruebas unitarias. Al diseñar, es necesario tener en cuenta la posibilidad de capacidad de prueba y hacer explícitas las dependencias de clases. Para garantizar la capacidad de prueba, puede utilizar la metodología TDD, que prescribe primero escribir una prueba y luego el código de implementación del método que se está probando. Entonces la arquitectura se vuelve comprobable. La desenredación de dependencias se puede realizar mediante la inyección de dependencias. Luego, cada dependencia se asocia explícitamente con una interfaz y se determina explícitamente cómo se inyecta la dependencia: en un constructor, en una propiedad o en un método.

Existen marcos especiales para pruebas unitarias. Por ejemplo, NUnit o el marco de prueba de estudio visual 2008. Para que sea posible probar clases de forma aislada, existen marcos simulados especiales. Por ejemplo, Rhino se burla. Permiten que las interfaces creen automáticamente códigos auxiliares para clases de dependencia, dándoles el comportamiento requerido.

Se han escrito muchos artículos sobre pruebas unitarias. Realmente me gusta el artículo de MSDN Escriba pruebas unitarias mantenibles que le ahorrarán tiempo y lágrimas, que explica bien y claramente cómo crear pruebas que no resulten engorrosas de mantener con el tiempo.

Pruebas de integración

Las pruebas de integración son, en mi opinión, las más difíciles de entender. Hay una definición: se trata de probar la interacción de varias clases que realizan algún tipo de trabajo juntas. Sin embargo, no está claro cómo realizar pruebas según esta definición. Por supuesto, puede basarse en otros tipos de pruebas. Pero esto es complicado.

Si lo abordamos como una prueba unitaria, en la que las dependencias no se reemplazan por objetos simulados en las pruebas, entonces tenemos problemas. Para buena cobertura necesito escribir muchos pruebas, ya que el número de combinaciones posibles de componentes que interactúan es una dependencia polinomial. Además, las pruebas unitarias prueban exactamente cómo se lleva a cabo la interacción (consulte las pruebas de caja blanca). Debido a esto, después de la refactorización, cuando se destacó alguna interacción en nueva clase, las pruebas fallan. Es necesario utilizar un método menos invasivo.

Tampoco es posible abordar las pruebas de integración como una prueba del sistema más detallada. En este caso, lo contrario de las pruebas será pocos para comprobar todas las interacciones utilizadas en el programa. Las pruebas del sistema son de un nivel demasiado alto.

Me encontré con un buen artículo sobre pruebas de integración solo una vez: Pruebas basadas en escenarios. Después de leerlo y el libro de Ayende sobre DSL en Boo, lenguajes específicos de dominio en .NET, tuve una idea sobre cómo realizar pruebas de integración.

La idea es sencilla. Tenemos datos de entrada y sabemos cómo debería funcionar el programa con ellos. Escribamos este conocimiento en archivo de texto. Esta será una especificación de datos de prueba que indica qué resultados se esperan del programa. Las pruebas determinarán el cumplimiento de la especificación y lo que realmente encuentre el programa.

Lo ilustraré con un ejemplo. El programa convierte un formato de documento a otro. La conversión es complicada y con mucha cálculos matemáticos. El cliente proporcionó un conjunto de documentos típicos que necesitaba convertir. Para cada uno de estos documentos, escribiremos una especificación, donde registraremos todo tipo de resultados intermedios que nuestro programa alcanzará durante la conversión.

1) Digamos que los documentos enviados tienen varias secciones. Luego en la especificación podemos indicar que el documento que se está analizando debe tener secciones con nombres especificados:

$SectionNames = Introducción, Texto del artículo, Conclusión, Literatura

2) Otro ejemplo. Al convertir necesitas dividir formas geométricas a los primitivos. La división se considera exitosa si, en total, todas las primitivas cubren completamente la figura original. De los documentos enviados seleccionaremos varias figuras y redactaremos nuestras propias especificaciones para ellas. El hecho de que una figura esté cubierta por primitivas se puede reflejar de la siguiente manera:

$IsCoverable = verdadero

Está claro que para verificar dichas especificaciones, necesitará un motor que pueda leer las especificaciones y verificar su conformidad con el comportamiento del programa. Escribí un motor de este tipo y quedé satisfecho con este enfoque. Publicaré el motor pronto. Código abierto. (UPD: Publicado)

Este tipo de prueba es de integración, ya que durante la prueba se llama al código de interacción de varias clases. Además, sólo es importante el resultado de la interacción, no los detalles ni el orden de las llamadas. Por lo tanto, las pruebas no se ven afectadas por la refactorización del código. No hay pruebas excesivas o insuficientes: solo se prueban aquellas interacciones que ocurren cuando se procesan datos reales. Las pruebas en sí son fáciles de mantener porque la especificación es fácil de leer y fácil de cambiar para adaptarse a nuevos requisitos.

Pruebas del sistema

La prueba del sistema es una prueba del programa en su conjunto. Para pequeños proyectos Esto es, por regla general, una prueba manual: la inicié, hice clic y me aseguré de que (no) funcionara. Se puede automatizar. Hay dos enfoques para la automatización.

El primer enfoque es utilizar la variación. patrón MVC- Vista pasiva (aquí hay otra buen articulo según variaciones del patrón MVC) y formalizar la interacción del usuario con la GUI en código. Luego, las pruebas del sistema se reducen a probar las clases de Presentador, así como la lógica de las transiciones entre Vistas. Pero aquí hay un matiz. Si prueba las clases de Presenter en el contexto de las pruebas del sistema, deberá reemplazar la menor cantidad posible de dependencias con objetos simulados. Y aquí surge el problema de inicializar y llevar el programa al estado requerido para comenzar las pruebas. El artículo sobre pruebas basadas en escenarios mencionado anteriormente habla sobre esto con más detalle.

El segundo enfoque consiste en utilizar herramientas especiales para registrar las acciones del usuario. Es decir, al final el programa se inicia, pero se hace clic en los botones automáticamente. Para .NET, un ejemplo de dicha herramienta es la biblioteca White. Se admiten WinForms, WPF y varias otras plataformas GUI. La regla es la siguiente: para cada caso de uso, se escribe un script que describe las acciones del usuario. Si todos los casos de uso están cubiertos y las pruebas pasan, entonces podrá entregar el sistema al cliente. El certificado de aceptación debe estar firmado.




Edición del proyecto