Usando matemática discreta nos testes

Antes de mais, gostaria de dizer que a matemática ajuda a colocar nossos pensamentos em ordem e efetivamente desenvolve o pensamento lógico, e essas são algumas das qualidades mais necessárias dos participantes no desenvolvimento de software. Falando em teste, ele diz respeito principalmente ao comportamento do sistema, ortogonal à representação estrutural comum aos desenvolvedores de software. A diferença entre representações estruturais e comportamentais é que a estrutura se concentra no que é o software e a visão comportamental leva em consideração o que o software faz.


Uma das dificuldades dos testadores é que a documentação técnica básica ou o manual de desenvolvimento de software geralmente é escrito por e para desenvolvedores, e a ênfase principal está nas informações estruturais, e não nas comportamentais. Obviamente, as partes estruturais e comportamentais são muito importantes para o teste, pois erros de programação podem ser encontrados em cada uma dessas partes. É por isso que falaremos sobre métodos matemáticos discretos para mostrar a relação entre a estrutura do programa e seu comportamento.


Em seu trabalho diário, os engenheiros de garantia de qualidade de software (QA) trabalham com operações de fórmula, comportamento de função e estruturas de dados. Eles sempre monitoram e verificam o estado em constante mudança dos sistemas, portanto precisam ter um pensamento algorítmico e matemático para entender a lógica do software.


Se um desenvolvedor usar uma abordagem matemática em seu trabalho, como resultado, todas as operações lógicas serão conectadas entre si, as ações seguirão uma cadeia lógica e cada função será considerada estruturalmente.


A matemática discreta nos ajuda a encontrar a melhor solução em várias situações. Por exemplo, você pode encontrar o conjunto mais adequado de casos de teste (casos de teste), sem cobrir todas as opções possíveis. Além disso, a matemática discreta nos ajuda a visualizar o software exato que foi implementado e coberto nos testes.


Infelizmente, não vivemos em um mundo ideal, e os resultados reais esperados do uso do software e os resultados reais podem variar. Portanto, o principal objetivo do Departamento de Garantia da Qualidade (QA) é efetivamente cobrir o maior número possível de casos de teste.

Para mostrar esse conceito com mais detalhes, criamos o seguinte diagrama de Venn com um exemplo descrito anteriormente:





O diagrama de Venn acima descreve muitas situações, ajudando assim a ilustrar e definir conjuntos de situações. Por exemplo, isso pode nos ajudar a ver a diferença entre conjuntos de objetos. A matemática discreta ajuda a analisar e otimizar conjuntos de ações que podem afetar o software que está sendo desenvolvido.

Teoria dos conjuntos


Usando os princípios da teoria básica dos conjuntos, podemos criar pseudo-código para ilustrar todos os casos possíveis para o aplicativo Next Day (um programa que calcula qual dia será o próximo usando a data inserida):

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} 

Esse pseudocódigo já foi preparado para o desenvolvimento e teste do aplicativo, para que os testadores também possam aplicar todos os casos de teste possíveis com base nesses dados. O uso de dados nesse formato ajuda a aumentar a velocidade de desenvolvimento e reduz a chance de erro.

Teoria dos grafos


A matemática mais discreta é a chamada "teoria dos grafos", que estuda gráficos. Os gráficos são usados ​​para representar o relacionamento entre alguns objetos ou dados, e uma rede de computadores é um exemplo adequado de gráfico.

Os gráficos também são fundamentais para o processo de desenvolvimento de software. Por exemplo, usando um gráfico, podemos decompor funções complexas em várias partes menores, o que nos ajuda a entender melhor a lógica de negócios.


Os gráficos podem ser direcionais e não direcionais, o que significa que podemos mover de nó em nó em uma direção ou em ambas as direções (no caso de um gráfico direcionado) ou não podemos mover de um nó para outro (se o gráfico for direcionado estritamente em um direção)


Então, voltemos ao teste de software e imaginemos que temos um fluxo de algum processo (por exemplo, mover uma tarefa em algum tipo de sistema de rastreamento de tarefas); temos uma condição para algum problema e podemos movê-lo para outro estágio (gráfico orientado) ou podemos chegar a um ponto em que não podemos fazer nada com a entidade (gráfico não direcionado). Com essa abordagem de visualização, podemos montar facilmente um conjunto de todas as ações possíveis disponíveis para esta entidade:



Vamos continuar e examinar a matriz de adjacência, que pode ser construída com base em um gráfico não direcionado. No exemplo abaixo, os elementos da matriz de adjacência indicam se pares de vértices são adjacentes ou não:



Agora imagine que os nós são as condições de algumas entidades e, se construirmos a matriz de adjacência para este gráfico (conjunto de entidades), veremos um conjunto finito de ações que podemos executar. Por exemplo, a alteração do status do nó "0" para o nó "1" está disponível porque eles estão relacionados entre si. Mas a entidade "0" não pode ser alterada para o estágio "2" ou "3", como podemos ver em nossa matriz - "zero" está escrito nas células. Usando essa matriz, podemos eliminar conjuntos desnecessários de etapas da entidade e reduzir o conjunto de casos de teste.


Outra matriz que podemos usar para coletar casos de teste é a matriz de incidência, que mostra o relacionamento entre duas classes de objetos. Na figura a seguir, vemos um gráfico não direcionado e sua matriz de incidência: "1", "2", "3" e "4" são nós (entidades), "e1", "e2", "e3" "e4" são as bordas do gráfico e a matriz ilustra as entidades e ações que podemos fazer com elas. Com o nó "1", podemos executar as ações "e1", "e2" e "e3", mas a ação "e4" não está disponível para o nó "1". Este método é muito útil na criação de um conjunto de casos de teste.



Imagine que o testador recebeu uma lista de entidades e ações que podem ser executadas com essas entidades. Com essa matriz, ele pode reduzir o conjunto de casos de teste. Reduzir o número de testes é uma parte muito importante do processo de teste de software. O teste de software depende muito da redução do número de casos de teste e, com essa abordagem, a cobertura do teste e a prevenção de redundância são maximizadas.


O objetivo dos testadores de software é cobrir o produto usando casos de teste eficazes que permitem testar todas as combinações possíveis de ações. Os testadores podem ter sucesso com o mínimo de esforço usando abordagens matemáticas (algoritmos) distintos para encontrar o conjunto ideal de casos de teste e maximizar a eficácia do processo de teste de software.


A matemática discreta também nos ajuda a entender como o software é realmente criado, porque todo software usa algoritmos e métodos de matemática discreta e lógica matemática. Portanto, se entendermos como isso funciona, podemos encontrar erros ou problemas no programa que não podem ser detectados pelo usuário.


Redes de Petri


Vejamos um exemplo de como o aplicativo funciona na tecnologia de microsserviços usando as Redes de Petri (gráfico dinâmico):



Aqui vemos que o sistema tem um estado inicial e deve receber algum sinal enviado de outro serviço (um marcador aparece). Dependendo do resultado, a seguinte ação deve ser executada. Assim, a rede de Petri ilustra a dinâmica de todo o sistema. Se houver algum problema, podemos localizar o defeito mais rapidamente.


Redes neurais


As redes neurais artificiais também são baseadas em princípios gráficos. Eles imitam o processamento de informações pelos neurônios do cérebro humano. Cada parte do sistema neural é baseada em um gráfico que contém nós de "entrada", uma camada "oculta" e nós de "saída".



Alguns dados vão para a camada de entrada, e os algoritmos da camada oculta processam esses dados e enviam o resultado para o estágio de saída. Assim, uma rede neural pode executar ações com base nesses dados. As redes neurais também consistem em muitos gráficos semelhantes com lógica diferente, para que possam tomar decisões com base nos parâmetros de entrada.


Millennium Testing


Nosso exemplo final de uso de matemática discreta nos testes envolve a construção de um processo de teste de software. Atualmente, existem muitas metodologias e abordagens chamadas "testes de milênio", que foram desenvolvidas muito antes de seu uso real, a partir dos anos 2000, quando o desenvolvimento de software começou a se desenvolver rapidamente.


O BDD (Behavior Driven Development) faz parte do chamado Millenium Testing, essa metodologia é uma extensão do TDD (Test Driven Development). O BDD permite que os testadores estabeleçam uma relação mais próxima entre os critérios de aceitação para uma determinada função e os testes usados ​​para testar essa funcionalidade. O BDD pode transformar declarações estruturadas em um idioma natural em testes executáveis, introduzindo mais clareza e entendimento para o lado comercial e o desenvolvimento, à medida que eles começam a falar um idioma comum. A estrutura básica do fluxo de trabalho do BDD também é baseada em um gráfico dinâmico (Petri Net).



Como pode ser visto nessa estrutura, cada processo é acompanhado por um processo diferente e não pode passar para o próximo estágio até que o estágio anterior seja concluído. Mais uma vez, os princípios da matemática discreta nos ajudam a entender o processo com mais eficiência.



Concluindo, gostaria de listar mais uma vez as vantagens do uso de matemática discreta no processo de desenvolvimento de software:

  • Assistência na compreensão da lógica de negócios da funcionalidade necessária
  • Simplifique a capacidade de dividir tarefas complexas em tarefas mais simples
  • Permitir que os profissionais realizem testes eficazes com menos esforço
  • Ajudar a entender e visualizar a estrutura de tudo o que queremos

Os exemplos acima demonstram como a matemática discreta pode ser usada para aumentar efetivamente o desempenho do teste. Todos os aspectos da matemática discreta podem ajudar os desenvolvedores a entender o fluxo de trabalho geral do software e seus princípios ao longo do ciclo de vida do desenvolvimento de software.

Source: https://habr.com/ru/post/pt451886/


All Articles