WEBVTT 99:59:59.999 --> 99:59:59.999 e ligar todas estas coisas junto 99:59:59.999 --> 99:59:59.999 até esta data 99:59:59.999 --> 99:59:59.999 Certo 99:59:59.999 --> 99:59:59.999 está pronto 00:00:00.579 --> 00:00:01.922 Investimos bastante tempo 00:00:01.922 --> 00:00:03.322 nas últimas aulas 00:00:03.322 --> 00:00:05.821 falando sobre diferente tipos de teste 00:00:05.821 --> 00:00:08.219 sobre teste unitário versus teste integrado 00:00:08.219 --> 00:00:10.102 sobre como você pode usar RSpec 00:00:10.102 --> 00:00:12.495 para de fato isolar as partes do seu código que você quer testar 00:00:12.495 --> 00:00:14.906 você também sabe, devido ao "Homework 3", 00:00:14.906 --> 00:00:18.176 e outras coisas, que fizemos BDD 00:00:18.176 --> 00:00:20.621 onde utilizamos, principalmente, o Cucumber para transformar 'User Stories' 00:00:20.621 --> 00:00:22.953 em testes de integração e aceitação 00:00:22.953 --> 00:00:25.610 Você viu testes em alguns níveis diferentes 00:00:25.610 --> 00:00:27.634 e o objetivo aqui é meio que fazer algums comentários 00:00:27.634 --> 00:00:29.924 para relembrar um pouquinho 00:00:29.924 --> 00:00:33.011 e conseguir ter uma visão mais abrangente 00:00:33.011 --> 00:00:34.956 Isso meio que abrange o material 00:00:34.956 --> 00:00:37.007 de três ou quato seções do livro 00:00:37.007 --> 00:00:39.618 e eu gostaria the salientar os pontos importantes nas aulas 00:00:39.618 --> 00:00:41.461 Uma questão que vem... 00:00:41.461 --> 00:00:43.253 Eu tenho certeza que veio para todos vocês 00:00:43.253 --> 00:00:44.526 quando vocês faziam o "homework" 00:00:44.526 --> 00:00:45.695 é: "Quanto teste é o suficiente? " 00:00:45.695 --> 00:00:48.497 E, tristemente, por um long período 00:00:48.497 --> 00:00:51.090 se você perguntasse isto para a indústria 00:00:51.090 --> 00:00:52.180 a resposta seria basicamente 00:00:52.180 --> 00:00:53.179 "Nós temos uma data de lançamento limite, 00:00:53.179 --> 00:00:55.000 assim, quanto conseguirmos fazer de teste 00:00:55.000 --> 00:00:56.667 é o quanto temos que fazer de teste." 00:00:56.667 --> 00:00:58.153 Certo? O quanto de tempo tiver. 00:00:58.153 --> 00:01:00.024 Você sabe... isto é meio sarcástico 00:01:00.024 --> 00:01:01.118 obviamente nada bom 00:01:01.118 --> 00:01:02.549 Você pode fazer algo melhor, não? 00:01:02.549 --> 00:01:03.702 Existem algumas medidas estáticas 00:01:03.702 --> 00:01:06.034 como quantas linhas de código sua aplicação tem 00:01:06.034 --> 00:01:08.216 e quantas linhas de teste você tem? 00:01:08.216 --> 00:01:10.290 E não é raro na indústria 00:01:10.290 --> 00:01:12.682 que para um pedaço de software bem testado 00:01:12.682 --> 00:01:14.574 o número de linhas de teste 00:01:14.574 --> 00:01:17.736 vá muito além do número de linhas de código 00:01:17.736 --> 00:01:19.752 Assim, multiplicadores inteiros não são tão raros 00:01:19.752 --> 00:01:21.843 E eu acho que mesmo para 00:01:21.843 --> 00:01:23.229 código de pesquisa ou trabalho escolar 00:01:23.229 --> 00:01:26.856 a proporção de, sei lá, talvez 1.5 não é absurda 00:01:26.856 --> 00:01:30.058 assim uma vez e meia a quantidade de código de teste 00:01:30.058 --> 00:01:32.249 para o código de aplicação 00:01:32.249 --> 00:01:34.221 E em uma boa quantidade de sistemas de produção 00:01:34.221 --> 00:01:35.277 onde eles realmente se importam com teste 00:01:35.277 --> 00:01:36.919 é muito maior que isso 00:01:36.919 --> 00:01:38.155 Então, talvez uma pergunta melhor a se fazer 00:01:38.155 --> 00:01:39.472 ao invés de dizer: Quanto teste é suficiente? 00:01:39.472 --> 00:01:42.493 seria melhor: Quão bom é o teste que estou fazendo agora? 00:01:42.493 --> 00:01:44.351 Qão completo ele é? 00:01:44.351 --> 00:01:45.565 Mais tarde neste semestre 00:01:45.565 --> 00:01:46.568 O Professor Sen falará 00:01:46.568 --> 00:01:48.189 um pouquinho sobre métodos formais 00:01:48.189 --> 00:01:50.857 e quais são as fronteiras para teste e depuração 00:01:50.857 --> 00:01:52.686 Mas a algumas coisas podemos falar agora 00:01:52.686 --> 00:01:54.073 baseado no que você já sabe 00:01:54.073 --> 00:01:57.744 sobre conceitos básicos de cobertura de testes 00:01:57.744 --> 00:01:59.550 e embora eu diria 00:01:59.550 --> 00:02:01.017 sei lá, temos falado o tempo todo 00:02:01.017 --> 00:02:03.034 que métodos formais não funcionam para grandes sistemas 00:02:03.034 --> 00:02:05.330 Eu penso que esta afirmação, em minha opinião pessoal 00:02:05.330 --> 00:02:07.011 é hoje muito menos verdade do que costumava ser 00:02:07.011 --> 00:02:09.190 Eu penso que existem alguns lugares específicos 00:02:09.190 --> 00:02:10.524 especialmente em teste e depuração 00:02:10.524 --> 00:02:12.848 onde métodos formais estão hoje fazendo rápido progresso 00:02:12.848 --> 00:02:15.756 e Koushik Sen é um dos líderes nisso 00:02:15.756 --> 00:02:17.944 Então, você terá a oportunidade de ouvir mais sobre isso depois 00:02:17.944 --> 00:02:21.437 para agora, eu acho mais prático 00:02:21.437 --> 00:02:22.734 falarmos sobre medir a cobertura 00:02:22.734 --> 00:02:24.475 porque isso é a coisa mais importante 00:02:24.475 --> 00:02:26.204 em termos de como você será avaliado 00:02:26.204 --> 00:02:28.631 se você estiver fazendo isso pra valer 00:02:28.631 --> 00:02:29.530 Então o que seria algo básico? 00:02:29.530 --> 00:02:30.781 Aqui está uma classe bem simples que você pode usar 00:02:30.781 --> 00:02:32.902 para falar sobre diferentes maneiras de medir 00:02:32.902 --> 00:02:34.801 como nossos testes cobrem o código 00:02:34.801 --> 00:02:36.632 e existem alguns níveis diferentes 00:02:36.632 --> 00:02:37.851 com diferentes terminologias 00:02:37.851 --> 00:02:40.737 Não é algo universal entre todas as escolas de software 00:02:40.737 --> 00:02:42.641 mas um grupo comum de terminologias 00:02:42.641 --> 00:02:43.647 que o livro expõe 00:02:43.647 --> 00:02:44.689 e que poderíamos falar é S0 00:02:44.689 --> 00:02:47.457 onde você deve chamar todos os métodos uma vez 00:02:47.457 --> 00:02:50.452 De tal modo que, se você invocar 'foo', e invocar 'bar' 00:02:50.452 --> 00:02:52.150 Isto é cobertura S0: não tão completo 00:02:52.150 --> 00:02:54.688 Um pouco mais rigoroso é o S1 00:02:54.688 --> 00:02:56.137 você poderia dizer, estamos invocando todos os métodos 00:02:56.137 --> 00:02:57.288 de todos os lugares onde ele poderia ser invocado 00:02:57.288 --> 00:02:58.820 Então o que isso significa? 00:02:58.820 --> 00:03:00.076 Significa, por exemplo 00:03:00.076 --> 00:03:01.124 que não basta apenas invocar 'bar' 00:03:01.124 --> 00:03:02.952 Você tem que ter certeza que você deve invocá-lo 00:03:02.952 --> 00:03:05.575 pelo menos uma vez daqui 00:03:05.575 --> 00:03:07.161 assim como invocar uma vez 00:03:07.161 --> 00:03:10.370 de todos as funções externas que podem invocá-lo 00:03:10.370 --> 00:03:12.820 C0 é o que o "SimpleCov" mede 00:03:12.820 --> 00:03:15.997 aqueles que colocaram "SimpleCov" para rodar 00:03:15.997 --> 00:03:18.522 basicamente dizem que cada linha foi executada 00:03:18.522 --> 00:03:20.045 que cada uma das linhas foi tocada uma vez em seu código 00:03:20.045 --> 00:03:22.483 Mas o limitante ali é que 00:03:22.483 --> 00:03:25.587 condicionais contam como uma única linha 00:03:25.587 --> 00:03:28.915 Então, não importa em que ramo deste "if" você tocou 00:03:28.915 --> 00:03:31.749 desde que você tenha tocado um dos outros ramos 00:03:31.749 --> 00:03:33.350 então você executou a linha do "if" 00:03:33.350 --> 00:03:35.670 Assim, mesmo "C0" meio que ainda oferece cobertura superficial 00:03:35.670 --> 00:03:37.267 Mas, como veremos 00:03:37.267 --> 00:03:39.231 o jeito que você deve ler esta informação é: 00:03:39.231 --> 00:03:41.792 Se você estiver tendo uma cobertura ruim no nível 'C0' 00:03:41.792 --> 00:03:44.072 então você realmente tem uma cobertura bem ruim 00:03:44.072 --> 00:03:46.082 Se você não estiver fazendo 00:03:46.082 --> 00:03:47.370 nem este nível simples de cobertura superficial 00:03:47.370 --> 00:03:50.021 então seu teste é provavelmente deficiente 00:03:50.021 --> 00:03:51.916 C1 é o próximo passo a frente 00:03:51.916 --> 00:03:53.719 Poderíamos dizer: 00:03:53.719 --> 00:03:55.198 Bem, temos que pegar cada ramo em ambas as direções 00:03:55.198 --> 00:03:56.617 assim, quando estivermos nesta linha de "if" 00:03:56.617 --> 00:03:58.667 temos que garantir que 00:03:58.667 --> 00:03:59.923 fazemos uma vez a parte do "if x" 00:03:59.923 --> 00:04:05.137 e a pelo menos uma vez a parte do "if not x" 00:04:05.137 --> 00:04:08.361 C1, pode ampliar isso com decisão de cobertura 00:04:08.361 --> 00:04:09.638 digamos: Bem, se vamos... 00:04:09.638 --> 00:04:12.369 Se temos uma linha "if" onde a condição 00:04:12.369 --> 00:04:13.890 é feita de múltiplos termos 00:04:13.890 --> 00:04:15.716 temos que garantir que cada sub expressão 00:04:15.716 --> 00:04:17.972 foi avaliada em ambas as direções 00:04:17.972 --> 00:04:19.678 Em outra palavras, isso significa que 00:04:19.678 --> 00:04:22.411 se vamos falhar esta linha do "if" 00:04:22.411 --> 00:04:24.348 temos que ter certeza de falhá-la pelo menos uma vez 00:04:24.348 --> 00:04:26.448 porque "y" era falso pelo menos uma vez porque "z" era falso 00:04:26.448 --> 00:04:28.889 Em outras palavras, qualquer sub expressão que puder 00:04:28.889 --> 00:04:31.214 mudar independente do resultado da condição 00:04:31.214 --> 00:04:34.483 tem que ser exercitada em ambas as direções 00:04:36.038 --> 00:04:38.523 e então tem uma que muita gente aspira 00:04:38.523 --> 00:04:41.264 mas que não há consenso de quão mais valiosa seria 00:04:41.264 --> 00:04:42.834 é que você tomaria todos os caminhos do código 00:04:42.834 --> 00:04:45.537 Obviamente, isso é meio que difícil porque 00:04:45.537 --> 00:04:48.331 tende a ser exponencial no número de condiçÕes 00:04:48.331 --> 00:04:53.088 e de forma geral é difícil 00:04:53.088 --> 00:04:55.312 de avaliar se você tomou cada um dos caminhos do código 00:04:55.312 --> 00:04:57.015 Existem técnicas formais que você poderia usar 00:04:57.015 --> 00:04:58.833 para te dizer onde os buracos estão 00:04:58.833 --> 00:05:01.311 mas no final 00:05:01.311 --> 00:05:03.050 na maioria das empresas de software 00:05:03.050 --> 00:05:04.891 não existe um consenso completo 00:05:04.891 --> 00:05:06.708 em quão mais valioso seria C2 00:05:06.708 --> 00:05:08.685 comparado com C0 e C1 00:05:08.685 --> 00:05:10.138 Assim, eu acho que para o propósito da nossa aula