Olá. No vídeo de hoje eu vou falar para vocês sobre teste estrutural que, como a gente vai ver, ao contrário do teste funcional, tem como objetivo exercitar o nosso código. Então o foco dessa técnica vai ser olhar o código e tentar exercitar. Imagine que tenhamos que escrever programa bem simples que diz se uma pessoa é menor de idade ou maior de idade. Baseando-se apenas nessa especificação, podemos aplicar algum critério de teste funcional e saímos com os seguintes casos de teste, esses que temos aqui. Esse conjunto de teste baseia-se na ideia bastante razoável de que todos os valores menores do que 18 são tratados da mesma maneira, assim como todos os valores de 18 para cima. Então incluímos alguns casos de teste para testar os limites e temos conjunto de teste adequado. Mas imagine que, por algum motivo absurdo que seja, programador escreveu esse código para implementar esse programa. O que que acontece então com o nosso conjunto de teste? O que acontece é que ele vai executar apenas uma parte desse programa, deixando de fora boa parte dos comandos que a gente tem aqui. Isso certamente não seria bom, pois pode ser que justamente nessa parte que não foi executada é que se encontram os defeitos do nosso programa. Obviamente esse exemplo ele é bem irreal, mas serve para a gente ter uma ideia de qual que é o propósito dos critérios de teste estrutural. Com esse tipo de teste, queremos ter certeza de que todas as partes, ou mais precisamente, que toda a estrutura do programa tenha sido exercitada, ou seja, tenha sido executada pelo menos uma vez. Na verdade, para que a gente reconheça a estrutura do programa que vamos testar, vez de pensarmos nos seus comandos diretamente, é mais fácil fazermos uma abstração da estrutura do programa, e essa abstração é feita por meio do que chamamos de grafo de fluxo de controle, ou grafo de programa. Esse grafo é criado considerando os blocos de código que são sempre executados juntos como vértices do grafo. E a transferência da execução de bloco a outro são as arestas do grafo. Então, por exemplo, se tivermos uma função bem simples como essa, que consiste apenas de comando if, podemos extrair a sua estrutura pelo seguinte grafo: aqui notamos a estrutura do programa, no qual o fluxo de execução pode seguir por esse caminho ou esse caminho, representando os dois ramos do comando if. E aqui anotamos no grafo os comandos que correspondem a cada vértice do nosso programa. Então aqui temos a condição do if, aqui temos essa atribuição, aqui temos essa atribuição, e por fim, nesse nó, temos o comando return. Notem que comandos que formam blocos indivisíveis, como nesse exemplo, não mudam a estrutura do grafo porque eles são sempre executados juntos. Então esses dois comandos que temos aqui eles formam juntos único vértice do meu grafo, que é esse vértice número dois. Outro exemplo que vale a pena ver é da estrutura de laço, então esse outro programa aqui a gente tem comando de repetição while e temos o seguinte grafo. Veja que no nó temos o comando de inicialização da variável r. No nó dois, temos o início do comando while. No nó três, nós temos os nós, os comandos que estão dentro do while. E por fim, no nó cinco, nós temos o retorno da função. Notem que a partir do nó dois, que é o início do while, nós podemos ter desvio que vai para dentro do laço e que vai para o final da execução da nossa função. E obviamente nós podemos ter qualquer combinação dessas estruturas, como, por exemplo, laço com comando de seleção dentro, que é o caso desse primeiro grafo, que temos aqui laço no nó dois e dentro dele temos comando de seleção if. Ou comando de seleção, que eu tenho dois caminhos possíveis, e dentro dele eu tenho comando de repetição. Voltando ao exemplo do programa identifier que vimos anteriormente, temos que essa é a função, aqui do lado esquerdo, a função principal do programa, que toma cada dos caracteres do string e verifica se são válidos ou não. Aqui do lado direito temos então o grafo de fluxo de controle para essa função. Identificamos aqui no nó a inicialização das variáveis locais e o início do comando if. No nó dois, temos aqui essas atribuições e o início do segundo if. No nó quatro, podemos ver que temos comando de repetição, que é o início do while. E dentro do while nós temos comando if, que está aqui iniciado no nó cinco. Saindo desse laço inicial e dessa parte inicial do programa, nós vamos a esse comando if que está representado a partir do nó dez do nosso grafo. Cada cláusula dessa condição ela está representada nó, então essa cláusula aqui corresponde ao nó dez, essa cláusula, segunda cláusula, corresponde ao nó 11, e a terceira cláusula que temos aqui corresponde ao nó 12. Por fim, nós temos dois pontos de retorno: o nó 13 que corresponde ao return true, e o nó 14 que corresponde ao return false. Então esse é o resuminho do nosso vídeo. A gente viu que o teste estrutural, ao contrário do funcional, tem como objetivo exercitar então os comandos do nosso programa. Vimos também como abstrair a estrutura do programa por meio do grafo de fluxo de controle, e no próximo vídeo o que eu vou falar para vocês é sobre como a gente utiliza o grafo de fluxo de controle então para derivar os nossos conjuntos de teste.