En primer lugar, me gustaría decir que las matemáticas ayudan a ordenar nuestros pensamientos y desarrollan de manera efectiva el pensamiento lógico, y estas son algunas de las cualidades más necesarias de los participantes en el desarrollo de software. Hablando de pruebas, se refiere principalmente al comportamiento del sistema, que es ortogonal a la representación estructural común a los desarrolladores de software. La diferencia entre las representaciones estructurales y de comportamiento es que el enfoque estructural se centra en lo que es el software, y la vista del comportamiento tiene en cuenta lo que hace el software.
Una de las dificultades de los probadores es que la documentación técnica básica o el manual de desarrollo de software generalmente está escrito por y para desarrolladores, y el énfasis principal está en la información estructural más que en el comportamiento. Por supuesto, las partes estructurales y de comportamiento son muy importantes para las pruebas, ya que se pueden encontrar errores de programación en cada una de estas partes. Es por eso que hablaremos de métodos matemáticos discretos para mostrar la relación entre la estructura del programa y su comportamiento.
En su trabajo diario, los ingenieros de garantía de calidad de software (QA) trabajan con operaciones de fórmula, comportamiento de funciones y estructuras de datos. Siempre supervisan y verifican el estado cambiante de los sistemas, por lo que necesitan tener un pensamiento algorítmico y matemático para comprender la lógica del software.
Si un desarrollador utiliza un enfoque matemático en su trabajo, como resultado, todas las operaciones lógicas se conectarán entre sí, las acciones seguirán una cadena lógica y cada función se considerará estructuralmente.
Las matemáticas discretas nos ayudan a encontrar la mejor solución en diversas situaciones. Por ejemplo, puede encontrar el conjunto más adecuado de casos de prueba (Casos de prueba), sin cubrir todas las opciones posibles. Además, las matemáticas discretas nos ayudan a visualizar la pieza exacta de software que se ha implementado y cubierto en las pruebas.
Desafortunadamente, no vivimos en un mundo ideal, y los resultados reales esperados del uso del software y los resultados reales pueden variar. Por lo tanto, el objetivo principal del Departamento de Aseguramiento de la Calidad (QA) es cubrir eficazmente tantos casos de prueba como sea posible.
Para mostrarle este concepto con más detalle, creamos el siguiente diagrama de Venn con un ejemplo que describimos anteriormente:

El diagrama de Venn anterior describe muchas situaciones, lo que ayuda a ilustrar y definir conjuntos de situaciones. Por ejemplo, esto puede ayudarnos a ver la diferencia entre conjuntos de objetos. Las matemáticas discretas ayudan a analizar y optimizar conjuntos de acciones que pueden afectar el software que se está desarrollando.
Teoría de conjuntos
Usando los principios de la teoría de conjuntos básicos, podemos crear un pseudocódigo para ilustrar todos los casos posibles para la aplicación Next Day (un programa que calcula qué día será el próximo usando la fecha ingresada):
M1={month:month has 30 days} M2={month:month has 31 days except December} M3={month:month is February} M4={month:month is December} D1={day:1<=day<=28} D2={day:1<=day<=29} D3={day:1<=day<=30} D4={day:1<=day<=31} Y1={year:year is a leap year} Y2={year:year is not a leap year}
Este pseudocódigo ya se ha preparado para el desarrollo y la prueba de la aplicación, por lo que los evaluadores también pueden aplicar todos los casos de prueba posibles basados en estos datos. El uso de datos en este formato ayuda a aumentar la velocidad de desarrollo y reduce la posibilidad de error.
Teoría de grafos
La matemática más discreta es la llamada "teoría de grafos", que estudia los grafos. Los gráficos se utilizan para representar la relación entre algunos objetos o datos, y una red informática es un ejemplo adecuado de un gráfico.
Los gráficos también son fundamentales para el proceso de desarrollo de software. Por ejemplo, usando un gráfico, podemos descomponer funciones complejas en varias partes más pequeñas, lo que nos ayuda a comprender mejor la lógica de negocios.
Los gráficos pueden ser direccionales y no direccionales, lo que significa que podemos movernos de un nodo a otro en una dirección o en ambas direcciones (en el caso de un gráfico orientado), o no podemos movernos de un nodo a otro (si el gráfico se dirige estrictamente en uno dirección)
Entonces, volvamos a las pruebas de software e imaginemos que tenemos un flujo de algún proceso (por ejemplo, mover una tarea en algún tipo de sistema de seguimiento de tareas); tenemos una condición para algún problema, y podemos moverlo a otra etapa (gráfico orientado), o podemos llegar a un punto en el que no podemos hacer nada con la entidad (gráfico no dirigido). Con este enfoque de visualización, podemos ensamblar fácilmente un conjunto de todas las acciones posibles disponibles para esta entidad:

Continuemos y observemos la matriz de adyacencia, que se puede construir sobre la base de un gráfico no dirigido. En el siguiente ejemplo, los elementos de la matriz de adyacencia indican si los pares de vértices son adyacentes o no:

Ahora imagine que los nodos son las condiciones de algunas entidades, y si construimos la matriz de adyacencia para este gráfico (conjunto de entidades), veremos un conjunto finito de acciones que podemos tomar. Por ejemplo, cambiar el estado del nodo "0" al nodo "1" está disponible porque están relacionados entre sí. Pero la entidad "0" no se puede cambiar a la etapa "2" o "3", como podemos ver en nuestra matriz: "cero" está escrito en las celdas. Usando esta matriz, podemos eliminar conjuntos innecesarios de pasos de entidad y reducir el conjunto de casos de prueba.
Otra matriz que podemos usar para recopilar casos de prueba es la matriz de incidencia, que muestra la relación entre dos clases de objetos. En la siguiente figura vemos un gráfico no dirigido y su matriz de incidencia: "1", "2", "3" y "4" son nodos (entidades), "e1", "e2", "e3", "e4" son los bordes del gráfico , y la matriz ilustra las entidades y acciones que podemos hacer con ellas. Con el nodo "1" podemos realizar las acciones "e1", "e2" y "e3", pero la acción "e4" no está disponible para el nodo "1.". Este método es muy útil para crear un conjunto de casos de prueba.

Imagine que el probador recibió una lista de entidades y acciones que se pueden realizar con estas entidades. Con esta matriz, puede reducir el conjunto de casos de prueba. Reducir el número de pruebas es una parte muy importante del proceso de prueba de software. Las pruebas de software dependen en gran medida de la reducción del número de casos de prueba, y con este enfoque, se maximiza la cobertura de prueba y se evita la redundancia.
El objetivo de los probadores de software es cubrir el producto utilizando casos de prueba efectivos que le permitan probar todas las combinaciones posibles de acciones. Los probadores pueden tener éxito con un esfuerzo mínimo utilizando enfoques matemáticos discretos (algoritmos) para encontrar el conjunto óptimo de casos de prueba y maximizar la efectividad del proceso de prueba de software.
Las matemáticas discretas también nos ayudan a comprender cómo se crea realmente el software, porque todo software utiliza algoritmos y métodos de matemática discreta y lógica matemática. Por lo tanto, si entendemos cómo funciona esto, podemos encontrar errores o problemas dentro del programa que el usuario no puede detectar.
Redes de petri
Veamos un ejemplo de cómo funciona la aplicación en la tecnología de microservicio utilizando redes de Petri (gráfico dinámico):

Aquí vemos que el sistema tiene un estado inicial y debería recibir alguna señal que se envía desde otro servicio (aparece un marcador). Dependiendo del resultado, se debe realizar la siguiente acción. Por lo tanto, la red de Petri ilustra la dinámica de todo el sistema. Si existe algún problema, podemos localizar el defecto más rápido.
Redes neuronales
Las redes neuronales artificiales también se basan en principios gráficos. Imitan el procesamiento de la información por las neuronas del cerebro humano. Cada parte del sistema neural se basa en un gráfico que contiene nodos de "entrada", una capa "oculta" y nodos de "salida".

Algunos datos van a la capa de entrada, y los algoritmos de capa oculta procesan estos datos y envían el resultado a la etapa de salida. Por lo tanto, una red neuronal puede realizar acciones basadas en estos datos. Las redes neuronales también consisten en muchos gráficos similares con lógica diferente, por lo que pueden tomar decisiones basadas en parámetros de entrada.
Pruebas del milenio
Nuestro último ejemplo del uso de matemáticas discretas en las pruebas implica la creación de un proceso de prueba de software. Actualmente, hay muchas metodologías y enfoques llamados "pruebas de milenio", que se desarrollaron mucho antes de su uso real, a partir de la década de 2000, cuando el desarrollo de software comenzó a desarrollarse rápidamente.
BDD (Behavior Driven Development) es parte de las llamadas Millenium Testing, esta metodología es una extensión de TDD (Test Driven Development). BDD permite a los evaluadores establecer una relación más estrecha entre los criterios de aceptación para una función determinada y las pruebas utilizadas para probar esta funcionalidad. BDD puede transformar declaraciones estructuradas en un lenguaje natural en pruebas ejecutables, introduciendo así una mayor claridad y comprensión en el lado comercial y en el lado del desarrollo, a medida que comienzan a hablar un lenguaje común. La estructura básica del flujo de trabajo de BDD también se basa en un gráfico dinámico (Petri Net).

Como puede verse en esta estructura, cada proceso va acompañado de un proceso diferente y no puede pasar a la siguiente etapa hasta que se complete la etapa anterior. Una vez más, los principios de las matemáticas discretas nos ayudan a comprender el proceso de manera más eficiente.
En conclusión, me gustaría enumerar una vez más las ventajas de usar matemáticas discretas en el proceso de desarrollo de software:
- Asistencia para comprender la lógica empresarial de la funcionalidad requerida
- Simplifique la capacidad de dividir tareas complejas en tareas más simples.
- Permitir a los profesionales realizar pruebas efectivas con menos esfuerzo.
- Ayuda para comprender y visualizar la estructura de todo lo que queremos.
Los ejemplos anteriores demuestran cómo se pueden usar las matemáticas discretas para aumentar efectivamente el rendimiento del examen. Cada aspecto de las matemáticas discretas puede ayudar a los desarrolladores a comprender el flujo de trabajo general del software y sus principios a lo largo del ciclo de vida del desarrollo del software.