Escolar Documentos
Profissional Documentos
Cultura Documentos
SUMÁRIO
1 INTRODUÇÃO..................................................................................... 4
8 MÉTODOS ÁGEIS............................................................................. 28
3
1 INTRODUÇÃO
Prezado aluno!
4
2 PROCESSOS DE SOFTWARE
5
Segundo Sommerville (2011), podemos identificar as seguintes atividades
no processo de software:
Especificação
Projeto
Implementação
Validação
6
• Teste unitário: ocorre a realização de testes para verificar se há erros
e se o comportamento está adequado.
• Integração: união de diferentes módulos do software em um só,
assim como a verificação da interação entre eles quando estão
funcionando em conjunto.
Manutenção e evolução
3 REQUISITOS DE UM SOFTWARE
7
3.1 REQUISITOS FUNCIONAIS
8
verificar que um único requisito não funcional poderá gerar outros requisitos
funcionais relacionados a ele, os quais possam definir serviços necessários, como
um requisito de proteção. A Figura 1 apresenta tipos de requisitos não funcionais,
segundo Sommerville (2011).
9
dos requisitos (funcionais e não funcionais) de sistema, ou seja, esses documentos
são essenciais quando alguém está desenvolvendo um sistema. O Quadro 1 mostra
usuários desses documentos e como eles o utilizam, conforme Kotonya e
Sommerville (1998).
10
11
Fonte: IEEE (IEEE, 1998).
12
Fonte: Adaptado de Sommerville (2011)
13
O gerenciamento de projetos em software leva em consideração primeiro a
qualidade, a produtividade e a redução de riscos. Os pontos técnicos devem incluir
a definição do ciclo de vida e tipos de planos a serem utilizados para testes,
documentação, desenvolvimento, qualidade e gerenciamento Sommerville (2011).
No quesito ciclo de vida do software, identificam-se três fases: definição,
desenvolvimento e operação. Em definição, os requisitos são determinados e a
viabilidade é estudada, assim como o planejamento de atividades é elaborado. Na
fase do desenvolvimento, são realizadas atividades para a produção do software,
como: concepção, especificação, design de interface, prototipação, arquitetura,
codificação e verificação. Na fase da operação, o software será utilizado pelos
usuários e podem ocorrer manutenções, para correções ou evoluções Sommerville
(2011).
Os principais motivos para problemas apresentados estão relacionados a
falhas no gerenciamento de projetos durante a fase de desenvolvimento, segundo
Standish Group (1994). Uma das tarefas de um gestor de projetos é identificar as
partes mais difíceis e buscar soluções eficientes Sommerville (2011).
O gestor de projetos deve trabalhar com ideias e com pessoas, tendo como
principais atividades planejamento, assessoria, organização, saber dirigir e
controlar o projeto. Da mesma forma que deve ter comprometimento com equipe,
prazos, custos e qualidade em suas entregas Sommerville (2011).
Como há muitas mudanças de requisitos, o ciclo mostrado na figura
apresentada deve ser repetido toda vez que for necessário. As novas técnicas com
metodologias ágeis facilitam a vida dos gerentes de projeto desde que estes tenham
uma equipe qualificada e comprometida, pois podem facilitar a adaptação às
mudanças que ocorrem no decorrer dos projetos Sommerville (2011).
É importante que aspectos como arquitetura de sistema, linguagem de
programação, sistema gerenciador de banco de dados e padrão de interface gráfica
sejam considerados na fase do projeto Sommerville (2011).
14
É fundamental que gerentes de projeto estejam atualizados sobre novas
tecnologias, ferramentas, metodologias, modelos e melhores práticas para que o
projeto tenha sucesso e o desenvolvimento seja eficaz e eficiente Sommerville
(2011).
15
5.1 DEFINIÇÃO E SURGIMENTO DOS PADRÕES DE PROJETOS
16
• Problema: descreve o problema, em que situação se aplica o padrão.
• Contexto: descreve uma situação que complemente o problema.
• Solução: descreve a solução; é uma descrição abstrata de um
problema e de como as classes e os objetos o resolverão.
• Consequências: descreve as vantagens e desvantagens da
utilização do padrão; são críticas para a avaliação de alternativas de
projetos e a compreensão de custos e benefícios para aplicação no
software desenvolvido Zenker(2020).
17
Uma coisa que os melhores projetistas sabem que não devem fazer é
resolver cada problema a partir de princípios elementares ou do zero.
Quando encontram uma boa solução, eles a utilizam repetidamente.
Consequentemente, você encontrará padrões de classes e de
comunicação entre objetos. Esses padrões resolvem problemas
específicos de projetos e tornam os projetos orientados a objetos mais
flexíveis e, em última instância, reutilizáveis.
18
Veja a seguir a terminologia relacionada ao programa orientado a objetos:
19
• Sobrecarga: é a utilização do mesmo nome para símbolos ou
métodos com operações ou funcionalidades distintas.
Geralmente os métodos se diferenciam pela sua assinatura.
• Acoplamento: significa o quanto uma classe depende da
outra para funcionar. Surge da associação entre as classes;
conforme for a dependência entre ambas, surge o termo
“fortemente acopladas”.
• Refatoração: é o processo de alterar um software de maneira
que não mude o seu comportamento externo e ainda melhore
a sua estrutura interna, modificando apenas a estrutura
interna do código.
20
Fonte: Gamma et al. (2000)
21
1. Considerar como os padrões de projeto solucionam problemas de
projeto. Avaliar a necessidade do software e qual é a intenção ao
utilizar o padrão.
2. Examinar qual é a intenção do padrão, o que faz, de fato, o padrão
de projeto, quais são os princípios do modelo e se o mesmo
solucionará o problema em questão.
3. Estudar como os padrões se relacionam. Avaliar, por meio da tabela
de escopo e propósitos do projeto (Quadro 1), qual é a relação
existente entre os padrões.
4. Estudar as semelhanças existentes entre os padrões. Verificar
semelhanças entre os grupos de padrões de criação, estruturados e
comportamentais.
5. Examinar uma causa de reformulação de projeto.
6. Considerar o que deveria ser variável no seu projeto; ou seja, em vez
de considerar o que pode forçar uma mudança em um projeto, deve-
se considerar o que se deseja mudar sem necessitar reprojetá-lo.
22
Fonte: Adaptado de Gamma et al. (2000).
23
7 TIPOS DE PADRÕES DE PROJETO
24
• Abstract Factory: fornece uma interface para a criação de conjuntos
de objetos relacionados ou dependentes, sem precisar especificar
sua classe
• Builder: separa a construção de um objeto complexo da sua
representação. Possibilita que seu processo de construção crie
diferentes representações
• Factory Method: define a interface para a criação de um objeto, mas
são as subclasses que decidem qual classe deve ser instanciada.
• Prototype: especifica os tipos de objetos a serem criados usando
uma instância prototípica e criando objetos copiando esse protótipo
• Singleton: garante que a classe tenha somente uma instância e
fornece um ponto global de acesso a ela.
25
Apenas quando uma propriedade desse objeto (método getX) ou um
relacionamento (por exemplo, empresa.getFuncionarios()) for chamado, a consulta
no banco será realizada — tudo isso de forma transparente para o cliente
Zenker(2020).
Os padrões de estrutura são os seguintes.
26
São 11 os padrões comportamentais, que são descritos a seguir
Zenker(2020).
8 MÉTODOS ÁGEIS
29
do software do que a documentação; é mais importante satisfazer as necessidades
do cliente do que seguir um plano. No método ágil, os colaboradores têm perfil
motivado, as entregas são semanais e não mensais, o que facilita o
acompanhamento da satisfação do cliente. Logo, neste modelo, as adaptações
falam mais alto do que a disciplina, e o processo de criação de software é
transparente, o cliente vê tudo, o que ajuda na customização, conforme Sommerville
(2011). No método ágil, as equipes são pequenas, com alto nível técnico, feedbacks
constantes, as reuniões são rápidas — duram geralmente 15 minutos — e muitas
vezes são feitas em pé, e cada reunião gera um plano de ação, em outras palavras,
um conjunto de atividades a serem realizadas em um intervalo de tempo
determinado. A maioria dos métodos ágeis foi criada na década de 1990, e eles
serão explicados mais adiante (Andrade, 2020).
Que tal falarmos sobre ferramentas de gestão? O primeiro passo para criar
um painel de metodologia ágil é escolher o seu modelo de gestão, estes modelos
denominados Scrum, Kanban, entre outros, serão explicados posteriormente, mas
precisamos mencionar que as empresas estão usando preferencialmente dois sites:
Trello e Jira (Andrade, 2020).
O Trello é uma ferramenta de gestão on-line para métodos ágeis que auxilia
na organização de tarefas e possui três versões. O Quadro 1 compara as três
versões desta ferramenta. A primeira é o plano básico, que é gratuito e, mesmo
assim, permite vários usuários, porém não tem todas as ferramentas dos outros
planos. A segunda versão do Trello, chamada Business Class, é paga e possui, por
exemplo, relação com o Github. Hoje muitas empresas de tecnologia usam
programas como o Github a fim de salvar versões de cada alteração do código
automaticamente no servidor da plataforma. A terceira versão, o plano Enterprise,
30
também é paga e possui muitas ferramentas de gerenciamento de acessos a pastas
e a convites, entre outras funcionalidades administrativas (Andrade, 2020).
31
O Quadro 2 mostra as utilidades do Jira e compara três planos: o básico,
gratuito, e os demais, Standart e Premium, sendo este último o mais caro (Andrade,
2020).
De acordo com o site do Manifesto Ágil (BECK et al., c2001), no ano 2001,
em Utah, nos EUA, 17 profissionais que praticavam metodologias ágeis se reuniram
para praticar Snowbird e conversar sobre métodos de planejamento de software.
32
Criaram, portanto, um documento, chamado de grito de guerra, o Manifesto Ágil,
que possui quatro valores (contidos na coluna da esquerda na Figura 1). Estes
valores priorizam os pontos a seguir.
33
Fonte: Adaptada de Isotani e Rocha (2020).
34
Agora, imagine que você tem que ficar documentando os detalhes de tudo
que fizer. Os programadores ficariam mais sobrecarregados ainda, pois além de
programar eles teriam que documentar. Neste ponto, ferramentas como o Github
ajudam, pois salvam automaticamente as versões (Andrade, 2020).
Imagine agora que você não permite que seus funcionários mudem um
pouco o curso? Isso acabaria atrapalhando um atributo muito importante:
funcionalidade! Por isso devemos seguir, sim, as boas práticas, sem, contudo,
negligenciar o tempo de execução, pois cada minuto poderia ser um recurso a mais
no seu software (Andrade, 2020).
Falamos dos quatro valores do Manifesto Ágil. Vejamos agora seus 12
princípios desenvolvimento de software? Eles estão presentes do próprio site oficial
do Manifesto Ágil (BECK et al., 2001).
35
• Software funcionando é a medida primária de progresso.
• Os processos ágeis promovem desenvolvimento sustentável. Os
patrocinadores, desenvolvedores e usuários devem ser capazes de
manter um ritmo constante indefinidamente.
• Contínua atenção à excelência técnica e bom design aumentam a
agilidade.
• Simplicidade: arte de maximizar a quantidade de trabalho não
realizado é essencial.
• As melhores arquiteturas, requisitos e designs emergem de times
auto-organizáveis.
• Em intervalos regulares, a equipe reflete sobre como se tornar mais
eficaz, e então refina e ajusta seu comportamento de acordo.
Como você pode perceber, é um método poderoso, para quem já atua com
programação ele faz muito sentido. O sistema tradicional se mostra lento: nele, os
clientes chamam a empresa de criação de software, e para fazer a elicitação são
necessárias longas visitas técnicas, análises de documentos, entrevistas e análises
de processos, para então dar uma data relativamente demorada com um valor
relativamente alto para entregar a aplicação. Resultado? Alto custo e lentidão. No
sistema ágil o processo é mais fatiado e incrementado. Falaremos agora sobre
algumas metodologias famosas (Andrade, 2020).
36
seguintes modelos: Desenvolvimento Incremental, DSDM (Metodologia de
Desenvolvimento de Sistemas Dinâmicos), Crystal Clear, FDD (Desenvolvimento
Direcionado a Funcionalidade), XP (Extrem Programming) e Scrum. (Andrade,
2020).
O Quadro abaixo mostra a recomendação de métodos por fases do projeto
de desenvolvimento de software.
37
conceito mais próximo a um framework do que um método propriamente dito, sua
ênfase foca a criação de protótipos que posteriormente evoluem para o sistema, e
para isso é utilizada muito fortemente a colaboração próxima com o cliente”.
Este método buscar entregar 80% do projeto em 20% do tempo disponível.
Ele é composto por três fases: a fase do pré-projeto (onde se elabora o orçamento),
a fase do ciclo de vida (onde se analisa a viabilidade) e a fase do pós-projeto (onde
ocorrem as alterações), conforme a Figura abaixo:
38
tem cronograma e orçamento fechados, mas o roteiro é aberto (SOMMERVILE,
2011).
O Crystal Clear (ISOTANI; ROCHA, [20––]) é outra metodologia ágil. Ela
atende vários tipos de projetos e tem como valor a comunicação com o cliente, bem
como o relacionamento do desenvolvedor com o cliente, a fim de que possa captar
com facilidade suas expectativas. Este método evita a criação de ferramentas
complexas que não serão utilizadas, objetivando reduzir tempo e custo na entrega.
Este método busca diferenciar a metodologia específica conforme a natureza de
cada projeto e permite que os desenvolvedores se manifestem quando algo os
incomodar. O método Crystal é um cristal em figura elaborado pela gestão e
mostrado com uma escala de cores, onde as cores variam de acordo com nível de
criticidade e com o tamanho da equipe: quanto mais escuro o cristal, mais crítico de
fazer é o software ou projeto; já as cores claras (branco e amarelo) atestam que os
software ou projetos serão simples e poucas pessoas serão necessárias; projetos
alaranjados ou até vermelhos demandam mais pessoas e são mais arriscados. No
Crystal da Figura 3, desenhado pela gestão, C significa confortável e D significa
baixo custo, E significa alto custo, e L significa risco de vida. O números indicam o
número de funcionários.
39
Fonte: Adaptada de Abrahamsson et al. (2002)
40
será o carrinho de compras completo; o terceiro item será o catálogo
completo, e assim por diante;
• design voltado à funcionalidade, ou seja, criar um design que
simplifica a navegação e promove a experiência do usuário;
• teste de software orientado à funcionalidade, ou seja, testar cada
função em detrimento de testar uma interface, por exemplo.
Pode-se perceber que neste projeto a soma de cada etapa se faz maior do
que o todo; assim, recomenda-se dividir em features curtas, a fim de agilizar a
conclusão de cada função, aumentando a eficiência da construção do programa.
Por exemplo: cria-se uma função de upload de imagens, cria-se uma função de
adicionar produto, e assim sucessivamente.
De acordo com Sommervile (2011), o quarto método a ser citado é o XP,
mais conhecido como Extremming Programing. Criado em 1996, possui como
princípios básicos: trabalho de qualidade, mudanças incrementais, feedback rápido
e abraçar mudanças. A metodologia possui algumas práticas:
41
• Equipe inteira: as reuniões devem ser em pé e devem ser rápidas.
• Programação em par: um desenvolvedor mais experiente fica com
um novato, o novato codifica e o mais experiente programa. O
benefício deste método é que ele é revisado por duas pessoas.
• Padronizações de código: a equipe de dev (developers) determina
regras de codificação de salvamento, bem como as boas práticas
que devem ser seguidas. Assim, parecerá que foi a mesma pessoa
que editou o código, ele ficará com uma “cara” única.
• Desenvolvimento orientado a teste: elaborar códigos de forma que
sejam capazes de ser testados por software de teste como Imeter
(um software que mede desempenho), Selenium (um software que
mede erros de sites), etc.
• Refatoração: é o processo de otimizar a estrutura do código sem
alterar o seu comportamento externo para o usuário final.
• Integração contínua: integrar alterações de forma contínua, sem
esperar uma semana, por exemplo. Permite saber a real situação do
software da programação
• Entregas curtas: entregar pequenos pedaços para o cliente corrigir e
avaliar, aumentando a probabilidade de acertar o todo.
• Metáfora: entender a linguagem e as expressões do cliente.
• Design simples: o código deve ter exatamente o que o cliente pediu.
42
• o Product Owner, que define o que comporá o Product Backlog (lista
de ações do Sprint) e prioriza isso nas Sprint Planning Meetings
(reuniões de planejamento do Sprint);
• o Scrum Master (geralmente um gerente ou líder técnico), que
verifica se todos seguem as regras e também busca impedir
trabalhos excessivos;
• o Scrum Team é a equipe de desenvolvimento
43
11 TEST-DRIVEN DEVELOPMENT
44
11.2 HISTÓRICO
45
McCracken, mas Beck é o responsável por redescobrir a técnica e sistematizá-la,
além de ser um dos grandes responsáveis pela sua popularização (Ladeira, 2020).
46
Fonte: Ladeira (2020)
47
conceito de refatoração é modelado pelo terceiro e último estado: refatorar. Mas o
que é refatoração ? (Ladeira, 2020).
A refatoração é um conjunto de ações de aprimoramento da estrutura
interna do componente. Estas ações envolvem (Ladeira, 2020).
48
componente, pois passar por um conjunto volumoso de testes automatizados
minimiza as chances de problemas futuros. Prikladnicki, Willi e Milani (2014)
complementam afirmando que o teste automatizado é composto por etapas de
preparação, exercício e verificação, e definem como fundamental que o teste seja
autocontido, isto é, não dependa de intervenção humana para decidir o resultado
Como o TDD preconiza a realização de testes que sejam automáticos, por
vezes é necessário simular comportamentos de outros componentes que interagem
com a unidade testada mas não estão disponíveis neste formato ou não são viáveis
de se utilizar por questões de, por exemplo, desempenho ou complexidade. Alguns
componentes nessas situações estão relacionados à elaboração de interfaces cujo
comportamento depende da forma de ação do usuário, de acesso a arquivos
externos, a sistemas de gerenciamento de banco de dados ou até mesmo à
transmissão de dados em uma rede de computadores. Nestes casos, para viabilizar
os testes, foi proposto o conceito de mocks. Os mocks, também chamados de fake
mocks, mock objects ou objetos de simulação, representam simulações dos
componentes necessários. Esses objetos tentam reproduzir os objetos reais que
por algum motivo não podem ser utilizados nos testes (Ladeira, 2020).
Entre os motivos válidos para o uso de mocks estão, por exemplo, a
indisponibilidade do componente, seja por complexidade ou por ainda não estar
desenvolvido, ou até mesmo o desempenho do componente real, tal como um
sistema de gerenciamento de banco de dados cujas consultas sejam demoradas.
Assim, o uso de um objeto de simulação pode ser vantajoso por poupar tempo da
equipe de desenvolvimento e abstrair detalhes do componente (Ladeira, 2020).
A equipe de desenvolvimento pode elaborar seus próprios mocks ou utilizar
frameworks de suporte a mocks disponíveis para as principais linguagens de
programação do mercado (Ladeira, 2020).
49
11.4 O TEST-DRIVEN DEVELOPMENT NO CICLO DE VIDA DO SOFTWARE
inteiro termoFibonacci(inteiro n)
50
testaTermoFibonacci() {
inteiro n = 10
inteiro resposta
inteiro respostaEsperada = 34
resposta = termoFibonacci(n)
escreva verificaIgualdade(respostaEsperada, resposta)
}
51
calculada, retornando este valor. Note que aqui não foi utilizada a variável resposta,
mas o resultado é igualmente válido (Ladeira, 2020).
Como não há implementação de termoFibonacci, o teste falha, pois é
necessário implementar o método. Suponha agora que o desenvolvedor, utilizando
recursividade (chamadas sucessivas da função a ela própria), implementou o
método termoFibonacci na nossa pseudolinguagem de programação:
inteiro termoFibonacci(inteiro n) {
se (n == 1) {
retorna 0
}
se (n == 2) {
retorna 1
}
retorna termoFibonacci(n-1) +
termoFibonacci (n-2)
}
52
volumoso seria utilizado e testado de forma automatizada, não apenas um teste
com a entrada 10 (Ladeira, 2020).
O próximo estado previsto no TDD é refatorar. Para atingir esse estado é
necessário verificar a possibilidade de realizar melhorias internas no método
termoFibonacci. Isso é possível?
Entre várias ações possíveis, eliminar redundâncias e padronizar o código,
caso a empresa de desenvolvimento utilize algum padrão, são algumas das ações
necessárias. Não havendo a necessidade de realizar estas ações, precisamos
pensar na sequência de instruções do método. O primeiro teste realizado é sempre
a verificação se o número é um. No entanto, o comando de retorno deste teste só
será executado quando o valor de n for um. Para todos os outros números aceitos
na entrada, um dos testes de parada será n == 2. Por exemplo, ao chamar
termoFibonacci(2), o teste n == 1 resultará falso, mas o teste n == 2 resultará
verdadeiro. Assim, a simples inversão de ordem destas estruturas condicionais já
configura uma comparação a menos, representando uma pequena melhoria no
código:
inteiro termoFibonacci(inteiro n) {
se (n == 2) {
retorna 1
se (n == 1) {
retorna 0 }
}
retorna termoFibonacci(n-1) +
termoFibonacci(n-2)
53
}
(Ladeira, 2020).
inteiro termoFibonacci(inteiro n) {
se (n == 2 ou n == 1) {
retorna n-1
}
retorna termoFibonacci(n-1) +
termoFibonacci(n-2)
}
inteiro termoFibonacci(inteiro n) {
n=n–1
se (n == 0 ou n == 1) {
54
retorna n
}
inteiro acumulador[50]
acumulador [0] = 0
acumulador [1] = 1
inteiro índice
return acum[n];
}
}
55
Podemos supor, ainda, que a empresa exige que existam comentários
dentro da função, facilitando assim o entendimento de quem precisar manter o
código. Esta ação também deve ser realizada na etapa de refatoração. Assim, o
código comentado fica como segue (Ladeira, 2020).
56
acumulador [0] = 0
57
Um aspecto importante que podemos discutir é a ausência de qualquer
diretriz sobre os requisitos. Assume-se que o desenvolvedor compreendeu
corretamente os requisitos necessários para desenvolver a funcionalidade. Isto se
materializará diretamente nos códigos dos casos de teste. No entanto, nada o
impede de, antes, modelar os requisitos com outra técnica, tal como a criação de
histórias de usuário ou casos de uso (Ladeira, 2020).
Vimos o exemplo da função termoFibonacci em um pseudocódigo
estruturado válido. Agora vejamos como isso seria feito em uma linguagem de
programação, em uma situação prática real. Tomemos como exemplo a linguagem
C++, utilizando-a também de forma estruturada para facilitar o seu entendimento,
juntamente com o compilador g++. O código de teste seria como segue (Ladeira,
2020).
#include <iostream>
#include "fi bo.h"
n = 10;
resposta = termoFibonacci(n);
if (resposta == respostaEsperada)
cout << "Passou no teste!" << endl;
else
cout << "Falhou no teste!" << endl;
58
cout << "Entrada informada: " << resposta <<
endl;
cout << "Resposta informada: " << resposta <<
endl;
cout << "Resposta esperada: " << respostaEsperada << endl;
return 0;
}
fibo.cpp:
59
long long int termoFibonacci(long long int n) {
if (n == 2 || n == 1)
return n - 1;
return termoFibonacci(n-1) +
termoFibonacci(n-2);
}
Passou no teste!
Entrada informada: 34
Resposta informada: 34
Resposta esperada: 34
60
long long int termoFibonacci(long long int n) {
/* Decrementa n em uma unidade para trabalhar
com as posições corretas do vetor, de 0 até n-1,
resultando em n posições */
n--;
61
definição da Série de Fibonacci */
for(indice = 2; indice <= n; indice++)
acumulador[indice] = acumulador
[indice-1] + acumulador[indice-2];
Passou no teste!
Entrada informada: 34
Resposta informada: 34
Resposta esperada: 34
11.5 DOCUMENTAÇÃO
Até este ponto da leitura você pode estar se perguntando se (ou quando) o
TDD prevê a elaboração de documentação. A resposta a esta pergunta é mais
simples do que parece: a documentação já está elaborada! No TDD a
documentação é todo conjunto de testes implementados, pois eles mostram a
definição do comportamento esperado pelos componentes, sua interface e os tipos
62
dos dados definidos. Testes unitários, quando bem escritos, podem especificar o
trabalho do código funcional (Ladeira, 2020).
Por menor que seja o software desenvolvido, se a prática adotada for o
TDD, os testes devem permanecer armazenados, até mesmo porque estes testes,
enquanto documentos, são trabalhados em todos os estados do TDD. Além disso,
os testes realizados apoiam os futuros testes de regressão. Lembre-se de que um
software se diferencia de um programa por conter dados de configuração e
documentação. Portanto, a documentação é parte do software (Ladeira, 2020).
No caso do código apresentado, os arquivos que implementam o método
de teste (testaTermoFibonacci) fazem parte da suíte de testes, bem como fariam os
métodos que testam os métodos de subtração e de outras operações, se for o caso
do software em desenvolvimento. Se, futuramente, por algum motivo, o método de
teste precisar de correções ou alterações em virtude de mudanças de requisitos,
mantém-se o arquivo anterior e cria-se o novo. Todos os arquivos de teste gerados
formam a suíte de testes e ajudam a compreender o histórico de desenvolvimento
do software (Ladeira, 2020).
63
12.1 VANTAGENS DA UTILIZAÇÃO DO TEST-DRIVEN DEVELOPMENT
64
Já que o código é sempre coberto por testes que são documentados, os
desenvolvedores também adquirem maior confiança sobre os códigos
desenvolvidos. Neste ponto, os testes de regressão contribuem muito, já que o
registro e a reexecução dos testes anteriores ajuda a não permitir que a elaboração
de componentes gere erros em outros componentes, sendo este caminho rastreável
na sua totalidade (Ladeira, 2020).
O uso do TDD também acaba incentivando a testabilidade do código; isto
é, o desenvolvedor pensa o seu código de forma que ele seja fácil de testar. Se o
componente tem baixa testabilidade, estará mais propenso a esconder as falhas e
poderá produzir defeitos (Ladeira, 2020).
O TDD favorece ainda a flexibilidade. A agilidade do método, advinda do
seu ciclo curto de estados, permite adaptação ágil a novos requisitos e eventuais
alterações no código. É possível ainda que você, enquanto desenvolvedor, avalie e
utilize somente as práticas que julga interessantes no TDD ou proponha
customizações no processo que você entenda serem positivas na sua realidade de
trabalho (Ladeira, 2020).
65
O uso da suíte de testes como única documentação também é vista como
negativa por alguns autores que entendem que os casos de teste não foram criados
para serem toda documentação de software, e que outros documentos poderiam
auxiliar nas etapas de manutenção (ANWER et al., 2017).
Outro ponto a ser discutido é a limitação que o uso de mocks impõe. É difícil
testar a integração real com outros componentes, tais como sistemas de
gerenciamento de banco de dados ou interfaces de usuário, e é também difícil
garantir que o objeto simulado terá comportamento idêntico ao componente. Este
ponto é especialmente crítico em situações em que os objetos sofrem alterações
contínuas ou se os objetos em questão forem mantidos por terceiros (Ladeira,
2020).
O modelo não prevê a refatoração dos casos de teste. Isso significa que, se
os desenvolvedores não perceberem, um teste mal elaborado (com erros ou
incompleto, por exemplo) pode ser executado e fornecer a falsa sensação de
corretude. Um teste mal projetado pode ser identificado somente na fase de
manutenção, o que não é desejável e resulta em retrabalho. Além dos casos de
projeto incorreto de casos de teste, há situações em que há cenários de incerteza
e de necessidade de alteração de requisitos. Nestes casos o TDD também pode ser
desvantajoso, pois mudanças no projeto podem exigir que os testes sejam refeitos,
gerando perda no tempo de desenvolvimento (Ladeira, 2020).
Devido à lógica do TDD (escrever o teste antes do código), é um método
difícil de ser aplicado em ambientes em que existam códigos legados. Conforme
Anwer et al. (2017), o TDD também não se aplica a projetos de software que
requerem sincronização.
Anwer et al. (2017) afirmam também que o TDD é um método incompleto.
Segundo eles, o TDD não fornece orientações sobre como gerenciar projetos de
software desenvolvidos com este método, que se concentra apenas em atividades
relacionadas à engenharia.
66
Ainda há muita desinformação sobre o TDD. Ele muitas vezes é confundido
com a prática de testes unitários ou de automatização de testes, práticas estas que
na verdade são englobadas pelo TDD (Ladeira, 2020).
67
13 REFERÊNCIAS BIBLIOGRÁFICAS
68
SHALLOWY, A. Explicando padrões de projeto: uma nova perspectiva
em projeto orientado a objetos. Porto Alegre: Bookman, 2004.
69
ANWER, F. et al. Agile software development models TDD, FDD, DSDM,
and crystal methods: a survey. IJMSE, v. 8, n. 2, p. 1–10, 2017. Disponível em:
http://www.ijmse.org/ Volume8/Issue2/paper1.pdf. Acesso em: 23 maio 2020.
70