Alura > Cursos de Programação > Cursos de Python > Conteúdos de Python > Primeiras aulas do curso Python: testes automatizados e qualidade de código

Python: testes automatizados e qualidade de código

Fundamentos de Testes de Software - Apresentação

Apresentando os instrutores

Olá! Meu nome é Danilo de Sousa Miguel, sou um dos instrutores dos cursos de programação aqui da Alura, e irei acompanhar vocês no curso de testes automatizados utilizando a linguagem Python.

Audiodescrição: Danilo é um homem negro, com barba de tamanho médio para longo. Ele veste uma camiseta cinza e está sentado em uma cadeira preta com detalhes vermelhos.

Olá! Meu nome é [Nome do Instrutor] e estou aqui para guiá-lo neste curso.

Audiodescrição: [Nome do Instrutor] está em um ambiente com uma parede branca iluminada por luzes rosa e azul. Ele possui graduação em Ciência da Computação e mestrado em Engenharia da Computação. Tem experiência como docente em universidades e como engenheiro de software no setor corporativo.

Introduzindo o curso de testes automatizados

Este curso é destinado a quem deseja se aprofundar na elaboração de casos de teste e na preparação do ambiente para a execução desses testes. Vamos explorar desde testes básicos, como testes unitários e de integração, até a medição da complexidade do código. Também abordaremos a avaliação de quão bem o código está alinhado com boas práticas e a integração com pipelines automatizados de testes, como o GitHub Actions.

Nos próximos vídeos, aprofundaremos esses tópicos. Sejam bem-vindos!

Fundamentos de Testes de Software - Conceitos de teste de software, níveis e tipos de teste

Explorando os conceitos de testes de software

Para começar, vamos explorar os principais conceitos de testes de software de forma geral. Primeiramente, precisamos entender o que é um teste de software. Trata-se de um processo que permite analisar e validar se a aplicação ou o sistema está funcionando conforme o esperado. Além disso, o teste possibilita identificar bugs, execuções incorretas e comportamentos inadequados. Portanto, o teste é um processo criado para verificar se a aplicação está operando conforme o esperado.

Dentro do processo de teste, nosso objetivo é detectar erros ou bugs para impedir que eles ocorram em operação. É preferível que o erro aconteça durante o desenvolvimento ou teste, em vez de ocorrer com o cliente ou quando a aplicação está em operação, o que poderia causar interrupções ou comportamentos inadequados. O teste nos proporciona uma visão abrangente de cada funcionalidade, orientando-nos a criar uma boa documentação. Ele traz confiabilidade, pois, antes de implantar a aplicação, verificamos e analisamos seu comportamento para garantir que funcione como deveria, assegurando, assim, a qualidade.

Analisando a experiência do usuário e custos

Se a aplicação funciona bem e tem um bom desempenho, ela proporciona uma boa experiência para o usuário, que é o próximo tópico. Analisamos se o usuário está tendo ou terá uma boa interação com a interface da aplicação, oferecendo facilidade e uma experiência satisfatória durante a navegação.

A redução de custo e risco também é um aspecto importante. Cada pessoa envolvida no processo de desenvolvimento do software representa um custo. Se precisarmos aumentar a operação dessa pessoa por não termos analisado ou previsto adequadamente, isso resultará em custos adicionais e aumentará o risco de não cumprirmos um prazo, por exemplo. Prazos não cumpridos elevam os custos, pois a pessoa continuará desenvolvendo a aplicação.

Determinando o tipo de teste adequado

Nesse contexto, encontramos aplicações com diferentes domínios e cenários, o que nos leva a concluir que nem todo teste será adequado para qualquer aplicação. É importante analisar o cenário da aplicação para determinar qual teste deve ser aplicado e em que nível a aplicação se encontra. Aplicações mais básicas, com poucas funcionalidades, como uma calculadora que realiza operações aritméticas básicas (soma, subtração, multiplicação e divisão), podem ser testadas de forma unitária.

Por exemplo, ao testar apenas um módulo ou uma operação, chamamos isso de teste unitário, que verifica uma única unidade da aplicação ou software. No exemplo mencionado, estamos testando apenas a soma, considerando casos como a soma de números positivos, a soma de números negativos, e a soma de um número negativo com um número positivo, entre outros. Estamos testando alguns casos, mas focando em uma única funcionalidade ou função, conforme o código demonstra.

Explorando testes de integração e regressão

Um teste unitário é utilizado quando precisamos verificar se dois ou mais módulos funcionam bem juntos, especialmente quando um depende do outro. Isso caracteriza um teste de integração. No exemplo apresentado na tela, observamos a integração entre o módulo de soma e o módulo de multiplicação. Quando precisamos realizar uma soma a partir do resultado de uma multiplicação, utilizamos a função de soma e a função de multiplicação para testar se elas operam bem juntas e retornam o resultado esperado.

O teste de regressão é aplicado quando implementamos algo novo ou fazemos alguma correção em uma aplicação que já possui algumas versões lançadas e está operacional. Precisamos garantir que essa alteração não modificou o comportamento da aplicação de forma indesejada. Assim, um teste de regressão verifica se a nova funcionalidade implementada não alterou o comportamento da aplicação de maneira inadequada.

Avaliando testes de sistema e aceitação

O teste de sistema, por sua vez, avalia a aplicação de ponta a ponta para verificar se ela realiza o que deveria. Já o teste de aceitação é realizado pelo usuário, que testa a aplicação para entender se ela atende a todas as suas expectativas. O teste de aceitação é, portanto, um aceite final para a aplicação.

Dentro desse contexto, existem diferentes tipos de testes, considerando as diversas dimensões das aplicações existentes. Algumas aplicações precisam suportar uma carga de requisições muito alta, enquanto outras devem responder rapidamente, ser responsivas e atender a diversos dispositivos, garantindo estabilidade e disponibilidade. Isso nos leva a diferentes tipos de testes.

Descrevendo tipos de testes específicos

Começamos pelo teste funcional, que verifica se todas as funcionalidades estão se comportando como esperado, validando fluxos, regras de negócio, entre outros aspectos. O teste de usabilidade é importante para garantir que o nível de acessibilidade da aplicação seja adequado para todos os públicos, considerando que ela pode ser acessada por pessoas diferentes o tempo todo.

O teste de aceitação do usuário está relacionado a garantir que as expectativas do usuário estão sendo atendidas. O teste de segurança assegura que a aplicação está protegida contra ameaças internas e externas. O teste de carga verifica se a aplicação se comporta bem sob um volume de acessos simultâneos esperado, conforme planejado.

O teste de estresse submete a aplicação a condições extremas para entender como ela reage diante de falhas controladas, por exemplo. Por fim, o teste de aceitação operacional garante que a aplicação está em conformidade com requisitos legais e contratuais, como a LGPD e emissão fiscal.

Esses são alguns dos principais conceitos de testes. Nos próximos vídeos, começaremos a entender qual é o cenário de aplicação que utilizaremos para este curso.

Fundamentos de Testes de Software - Demostração da estrutura da aplicação utilizada como estudo de caso

Apresentando a aplicação e o ambiente de desenvolvimento

Falaremos agora sobre a aplicação que será utilizada para a construção de todos os cenários de teste durante o curso. Vamos apresentá-la utilizando a ferramenta VS Code. Acreditamos que vocês estejam familiarizados com ela, mas não é obrigatório utilizar o VS Code. Nos próximos vídeos, mostraremos como clonar o projeto e configurar o pouco que precisa ser configurado. Vocês podem utilizar a IDE de sua preferência. Estamos utilizando o VS Code para este curso, mas, novamente, não é uma regra.

A aplicação é desenvolvida em Python e utiliza um servidor Flask para sustentar a aplicação web. Ela incorpora algumas boas práticas, incluindo uma arquitetura distribuída orientada a microserviços. A aplicação possui quatro microserviços.

Descrevendo a arquitetura e funcionalidades da aplicação

Antes de detalharmos os microserviços, é importante mencionar que esta aplicação simula uma hamburgueria, onde o cliente pode se cadastrar, fazer pedidos e modificar seu perfil. Existem dois níveis de usuário: o cliente e o administrador. A aplicação adota uma arquitetura orientada a microserviços.

No VS Code, podemos ver a pasta principal da aplicação, que é a "burger app".

Explicando a estrutura dos microserviços

Além disso, temos quatro microserviços divididos em quatro pastas, o que é uma boa prática adotada no projeto. Essa prática segue uma arquitetura, um design pattern (padrão de design) adequado, readequado, considerando o MVC e fazendo algumas adaptações. A separação é feita pelo modelo de dados, pela view, que é onde está a interface e onde a pessoa usuária interage mais com a aplicação, e pelo controlador, o controller, que é onde está a gerência das rotas, por exemplo.

Cada microserviço possui uma função específica: o microserviço de autenticação de usuários, o microserviço de pedidos, que é o order service, o microserviço de produto, que é o product server — para fazer um pedido, precisamos escolher um produto — e o microserviço de usuários, que gerencia os usuários. Cada aplicação, ou microserviço, possui uma série de pastas, como explicado, seguindo esse padrão de design, MVC ou MVC adequado. Temos os controllers, os models, os serviços, e também a parte estética e os templates. Além de seguir esse padrão, onde ficam as views e as interfaces, seguimos o padrão que o Flask, junto com o Jinja, estabelece para separar a interface de usuário do modelo de negócio.

Preparando para a configuração e uso da aplicação

Essa é a aplicação. Nos próximos vídeos, vamos entender o que precisa ser configurado, além de como podemos ter essa aplicação em nosso ambiente de trabalho.

Sobre o curso Python: testes automatizados e qualidade de código

O curso Python: testes automatizados e qualidade de código possui 240 minutos de vídeos, em um total de 79 atividades. Gostou? Conheça nossos outros cursos de Python em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Escolha a duração do seu plano

Conheça os Planos para Empresas