[MÚSICA] Então, já implementamos dois algoritmos de ordenação, mas a gente não fez teste automatizado e se não fizer teste automatizado, nosso código não tem nenhuma garantia de que a gente tem uma boa qualidade, e que essa qualidade vai perdurar ao longo do tempo, ao longo do desenvolvimento do nosso software. Então, vamos fazer testes automatizados aqui para o nosso algoritmo de ordenação. Então, eu vou criar aqui uma classe TestaOrdenador, que vai testar a nossa classe ordenador, então, vamos fazer import aqui da nossa classe ordenador. E eu vou fazer import do pytest também, [iii] Uma coisa que eu vou precisar, eu vou querer testar o quê? Eu vou querer testar o algoritmo do Bubble Sort, bolha, aquele bolha curta, que é mais eficiente. Eu vou querer testar o seleção direta. E eu vou querer testar com pelo menos dois tipos diferentes de vetores, vetor aleatório e vetor quase ordenado, que foram aqueles exemplos que a gente viu. Então, vou ter pelo menos esses quatro métodos de teste. Mas, todos esses quatro métodos de teste vão usar ordenador, então, vamos criar uma fixture para esse ordenador, então, a gente faz pytest.fixture e daí eu vou chamar de O, o nome dessa fixture do ordenador aqui. Então, return ordenador ponto ordenador. Então, cada vez vez que eu chamar aqui o método passando o O como parâmetro, ele vai na verdade gerar uma nova instância da classe ordenador que está no módulo ordenador. Além disso, eu vou querer ter aqueles vetores aleatórios e quase ordenados. Vou criar fixtures para eles também, aí é uma questão de gosto, mas eu vou, para ilustrar, vou criar uma fixture para uma lista quase ordenada, que ele vai devolver o quê? Aquele, ele vai ter que chamar no contaTempos, porque ela estava quase ordenada, lembra o método que gerava. Está aqui ContaTempos, essa lista quase ordenada da classe ContaTempos. Então, como que eu vou fazer? Eu vou pegar esse, vamos instanciar a classe ContaTempos, c = ContaTempos, e daqui c.lista_quase_ordenada. Vou pegar uma lista de tamanho 1000, quase ordenada de tamanho 1000. Se bem que o teste automatizado, eu quero que ele role rápido, vou pegar uma de tamanho 100 só. Se funciona para 100, provavelmente funciona para 1000. Então, essa aqui é a fixture da lista_quase_ordenada. Copiar tudo aqui, e agora, na outra fixture para aleatória, lista aleatória. ContaTempos, lista aleatória de 100 elementos também. Então, já tenho essas três fixtures aqui, agora podemos começar imprimindo, implementando nosso método. Então, test_bolha_curta com uma lista aleatória. Então, vai passar como parâmetro o O, que é o meu ordenador, e também lista_aleatória que vai passar como parâmetro uma lista aleatória. [SEM_ÁUDIO] E daí o que é que eu faço? Eu vou executar nessa minha lista aleatória a.bolha_curta, passando como parâmetro a minha lista aleatória. E daí, eu vou querer fazer uma asserção, assert para saber se esta lista aleatória está ordenada. Então, eu vou precisar criar uma função aqui para dizer se está ordenada ou não. Então, vamos criar aqui def esta_ordenada, ele vai receber como parâmetro uma lista L e vai dizer se está ordenada ou não. Como que a gente pode fazer isso? Eu vou percorrer todos os elementos dessa minha lista [SEM_ÁUDIO] aqui. E daí, eu vou ver se elemento que está na posição i, se ele for menor do que o elemento que está na posição i+1, se ele for menor, está tudo bem, daí não tem nada a se fazer. O problema é se ele for maior. Se ele for maior do que o elemento que está na posição i+1, aí quer dizer que não está ordenado, está fora de ordem, então, eu posso dar return false. Por outro lado, se ele chega até ao final do for e nunca faz esse retun false, daí quer dizer que todos os elementos, o que vem antes é menor ou igual ao que vem depois, então, está ordem crescente, eu posso dar return true. Agora detalhe, note que eu estou indo até i+1, se eu fizer isso indo até aqui com lenght de l, ele vai estourar o vetor, então, na verdade, tenho de fazer lenght de l-1. Tirar porque o i+1 daí vai indo até a última posição. Então, está ordenado, é só ver agora se está ordenado, a minha lista aleatória. Então, vamos ver se esse teste está funcionando, esse primeiro teste? Se estiver, a gente escreve os outros. Então, vou salvar isso aqui, vou salvar num método chamado testOrdenador, aqui, pronto. Agora vou executar o pytest aqui. Py.test test_ordenador Eu errei alguma coisa, vamos ver o que é que eu errei, erro de sintaxe, class testaOrdenador. Aqui faltou dois pontos. Vamos ver, voltar a executar aqui. Mais erro. Vejamos aqui o que está errado, fixture 'l_aleat' not found. Não achou essa fixture l_aleat, porque aleat, não aleatório. Vamos ver agora, de novo. Cruzando os dedos, ainda tem erro, mas está melhorando. ContaTempos não está definido, eu tenho que importar aqui, import ContaTempos, com minúscula aqui. conta_tempos, e daí o c = contatempos eu vou precisar aqui botar conta_tempos, ponto. Conta. Tempos ponto. Vamos ver agora, cruze os dedos. Ainda deu algo errado. TestaOrdenador instance has no attribute 'esta_ordenado'. O esta_ordenado eu tenho que self.esta_ordenada. Nossa, hoje eu errei todos os nomes das funções. Esta_ordenada, pronto. Vamos lá, pronto. Primeira vez que eu falei que eu falei que não precisava cruzar os dedos, daí deu certo, então, cruzar os dedos dá azar. Então, deu certo aqui, corrigimos esses errinhos que é normal a gente fazer. E agora, eu quero fazer mais três testes. Então, eu quero testar o seleção direta, com vetores aleatórios, selecao_direta, ae que eu vou chamar aqui o a.selecão_direta. Passando uma lista aleatório. Vamos verificar se ela está ordenada, e daí, copiar tudo. A mesma coisa para esses dois, era para vetores aleatórios, aqui vão ser vetores ou listas quase ordenadas. Então, eu vou chamar de, o nome que a gente deu para a fixture é quase, então, vez de aleat vai ser quase, quase, quase, quase. Pronto, a gente está tem mais dois testes automatizados testando com o Bubble Sort e o seleção direta com os vetores quase ordenados. Salvar e executar os testes. Agora cometi mais erro aqui, vamos ver, sintaxe inválida, aqui antes do test_selecao_direta aleat. Eu errei na sintaxe aqui. Primeiro, os nomes aqui não é aleatória mas o quase, [SEM_ÁUDIO] quase. Tem algum erro de sintaxe aí. Vamos ver, executar aqui. Tem erro, no test_selecao_direta_quase. SyntaxError, def, test, def. Aqui, faltou o fecha parêntesis. Acho que vocês já tinham percebido antes de mim. Deu certo, então, passou aqui nos nossos quatro testes, temos uma razoável bateria de testes automatizados para os nossos ordenadores aqui, os dois algoritmos de duas situações diferentes. Se você quiser, pode pensar outros casos de teste importantes e estender essa classe aí com mais casos de teste importantes. Por hoje, é só. [MÚSICA] [MÚSICA] [MÚSICA]