No vídeo anterior, eu introduzi os conceitos de teste estrutural mostrando como que programa pode ser abstraído por meio do grafo do fluxo de controle. Agora, precisamos ver como esse grafo de fluxo de controle vai nos ajudar a gerar casos te deste, ou seja, como que aplicamos os critérios de teste estrutural. Nesse exemplo, que temos aqui, vemos o grafo de fluxo de controle de uma das funções do programa "identifier". Precisamos aplicar os critérios de teste estrutural para que possamos então projetar nossos casos de teste, baseados nesses critérios. Vamos falar de dois tipos de critérios, os baseados fluxo de controle e os baseados fluxo de dados. Quando falamos critérios baseados fluxo de controle, isso significa que olharemos os elementos do grafo de fluxo de controle e devemos escolher casos de teste que exercitem esses elementos. Os critérios mais populares dessa classe de critérios são: o critérios "Todos-nós" e o critério "Todos-arcos". Todos-nós significa que devemos achar casos de teste que façam com que todos-nós do grafo do fluxo de controle sejam executados pelo menos uma vez. Quando conseguirmos isso, temos conjunto de teste adequado. Por exemplo, executando essa função do identifier com o "string" vazio, ou seja, a entrada do nosso programa é o string vazio, a execução passa por esses nós que estão aqui verde; então ele segue esse caminho, do nó para o nó dez, e do nó dez para o nó quatorze. Portanto, já executamos três nós e já cobrimos esses três requisitos de teste: o nó o nó dez e o nó quatorze. Adicionando mais caso de teste, por exemplo, o string "a", como entrada do nosso programa, cobrimos mais alguns nós no grafo; que são os nós dois, o nó nove, o nó onze- que não havíamos coberto ainda- o nó doze e o nó treze. Com mais caso de teste- a entrada a,b,c- executamos quase todos os nós da nossa função; fica faltando apenas o nó seis. Esse nó seis, olhando no código, a gente percebe que ele só vai ser executado se tivermos caso de teste com carácter inválido; então, adicionamos caso de teste para ele executar o nó seis, por exemplo, usando o string A*C. E com isso, obtemos conjunto de teste que é adequado ao critério Todos-nós, ou seja, conseguimos executar todos os nós do nosso grafo. Chamamos esse tipo de teste, também, de teste de cobertura de comandos, pois ao executarmos todos os nós do grafo, estamos executando todos os comandos do nosso programa. Já no critério que chamamos Todos-arcos, estamos interessados cobrir, executar, as arestas do grafo, ou seja, executar todos os desvios que representam o fluxo de execução do nosso programa. Por isso, também, chamamos esse tipo de teste de cobertura de ramos, ou cobertura de desvios. Se olharmos para o nosso grafo de fluxo de controle, que temos aqui, vemos que com o conjunto de teste que havíamos criado, conseguimos executar quase todas as arestas, quase todos os arcos do nosso grafo. Ficaram faltando essas duas arestas: a aresta onze quatorze; e a aresta doze quatorze. Olhando o código, vemos que essa aresta doze quatorze, só é coberta quando identificador com mais de seis caracteres é fornecido, por isso, vamos adicionar esse caso de teste ao nosso conjunto. Agora com essa entrada que temos aqui, essa nova entrada, cobrimos o arco doze quatorze; e finalmente, precisamos executar a aresta onze quatorze, que é a única que está faltando. Mas também analisando o código, vemos que, devido a combinações de condições, não é possível fazer com que a execução passe por esse desvio, passe por essa aresta. Isso é o que chamamos de requisito não executável, pois não existe dado de teste que possa fazer com que ele seja executado. Assim então, ignorando os requisitos que são não executáveis. temos esse conjunto de teste que é adequado ao critério Todos-arcos, ou seja, ele executa todos os desvios da nossa função. Já os critérios de fluxo de dados, além da estrutura do grafo de fluxo de controle, usam também informações sobre a utilização das variáveis dentro da função. Então temos que uma definição de variável é o ponto que a variável recebe valor; e uso é o ponto que esse valor é utilizado, ou seja, pode ser utilizado para cálculo qualquer ou para decidir o fluxo de execução do nosso programa. No caso de cálculo, esse uso está associado a nó do grafo. No caso que a variável é utilizada para decidir o fluxo de execução, esse uso da variável está associada às arestas do grafo. Aqui eu tomei como exemplo, uma das variáveis do nosso programa, a variável "valid id"; ela é definida, ou seja, ela recebe valor todos esses pontos que estão marcados amarelo. Então, uma atribuição de valor é feita para essa variável nesses três pontos; e ela é usada para decidir o fluxo de execução nesses dois pontos, ou seja, na aresta dez onze e na aresta dez quatorze. Identificados os usos e as definições das variáveis, temos como requisitos de teste, isso que chamamos de associações, definição e uso; que estão marcados aqui. Então por exemplo, nós temos a definição da variável no nó e o uso na aresta dez quatorze. O quê nós temos que fazer? Nós temos que achar dado de teste para cobrir essa associação que eu marquei aqui, temos que achar dado de teste que faça com que a execução passe pelo nó e alcance essa aresta dez quatorze, sem que haja uma redefinição dessa variável. Ou seja, nesse caso, eu teria que achar caso de teste que passasse pelo nó e viesse diretamente para a aresta dez quatorze. Por quê? Se eu escolher outro dado de teste que percorra, por exemplo, caminho que passe pelo nó dois, essa variável vai estar sendo redefinida, e então, não serve para cobrir esse requisito de teste que eu marquei aqui. Olhando esse requisito de teste, temos que cobri-lo por esse caminho aqui, então eu teria que estabelecer dado de teste que passasse por esse caminho. Veja! Os critérios de fluxo de dados utilizam conceitos que são mais complexos do que os critérios baseados fluxo de controle. Por lado, eles geram casos de teste de melhor qualidade, mas por outro lado, eles são mais difíceis de utilizar; justamente porque eles apresentam conceitos mais complexos e, com isso, custo mais alto. Além disso, a gente tem muitos requisitos que são requisitos não executáveis, e por isso, na prática, a gente raramente utiliza esse tipo de critério. Os critérios que são realmente mais utilizados na prática, são os critérios baseados fluxo de controle, e não aqueles utilizados baseados fluxo de dados. Então esse é o resumo do nosso vídeo de hoje; fica então para o próximo vídeo, a gente dá uma olhada como que a gente aplica esses critérios na prática, ou seja, eu vou falar sobre ferramentas para automatização dos critérios de teste baseados fluxo de controle.