Alats
A Alats (Associação Latino Americana de Testes de Software) é uma associação sem fins lucrativos cujo objetivo é incentivar e divulgar as boas práticas em teste de software.
Alats
Assuntos diversos sobre TI.
A Alats (Associação Latino Americana de Testes de Software) é uma associação sem fins lucrativos cujo objetivo é incentivar e divulgar as boas práticas em teste de software.
Alats
De forma similar a outras áreas da engenharia de software, há diversas certificações em teste de software. Uma certificação em testes de software indica que o profissional que a possui adquiriu determinado nível de conhecimento na área. Isso funciona, por um lado, como um facilitador para que as organizações contratantes identifiquem profissionais qualificados e, por outro lado, fornece ao profissional certificado um diferencial que o destaca, aumentando suas chances de contratação.
A disseminação dos processos de testes no Brasil é relativamente nova. Algumas organizações e institutos foram criados com o objetivo de profissionalizar a atividade, realizando avaliações e fornecendo certificação para os profissionais da área.
Dentre as principais instituições certificadoras mundiais estão:
Certificações
No scrum não existe uma fase específica de teste. De acordo com Schwaber e Sutherland (2016, p. 6), no scrum, os times de desenvolvimento
[...] são multifuncionais, possuindo todas as habilidades necessárias, como equipe, para criar o incremento do produto. O scrum não reconhece títulos para os integrantes do Time de Desenvolvimento que não seja o Desenvolvedor, independentemente do trabalho que está sendo realizado pela pessoa e não há exceções para esta regra. Individualmente os integrantes do Time de Desenvolvimento podem ter habilidades especializadas e área de especialização, mas a responsabilidade pertence ao Time de Desenvolvimento como um todo.
Na prática, testes iterativos são executados durante todo o desenvolvimento, como os testes de unidade e os testes de caixa preta. Uma funcionalidade só é considerada concluída quando todos os testes foram executados durante o desenvolvimento. O analista de teste, no scrum, faz parte do time de desenvolvimento e assume várias responsabilidades, como as de líder, arquiteto e responsável pela automatização. Este profissional participa ativamente no levantamento de requisitos e definição de escopo, tratando com grande relevância a necessidade do cliente, considerando os objetivos que o software deve alcançar à medida que ele é entregue. Ao fim de cada sprint, o analista de testes, junto com o time, é responsável por garantir que todos os testes automatizados tenham sido executados sem falhas.
De acordo com Cockburn e Highsmith (2001), para alcançar os resultados adequados, o testador realizará algumas tarefas, como:
Este profissional ganha um papel importante na modelagem ágil, pois participará ativamente do desenvolvimento, implantando técnicas eficientes de testes de software, levando em consideração o negócio e suas necessidades.
O time, como um todo, sempre atuará para o benefício do projeto, portanto, o testador, componente agora agregado ao time, integra-se, participando ativamente e colaborando de forma significativa na criação de um software com o mínimo de falhas, defeitos e erros.
De acordo com Duong (2016), o analista de teste, como importante membro do time, participa ativamente de todos os processos, apoiando o scrum master, que faz a mediação, e consultando o product owner para esclarecer eventuais dúvidas. A Figura mostra as principais etapas e membros envolvidos em um projeto scrum:
A modelagem ágil é uma realidade para as empresas que necessitam de desenvolvimento eficiente. Os métodos ágeis estabelecem um conjunto de práticas no desenvolvimento de software que está cada vez mais se tornando habitual. Mas, diferente do que muitos pensam, não existe um modelo predefinido ou um conjunto de regras a serem adotadas.
Desenvolvimento ágil |
O IEEE (Institute of Electrical and Electronic Engineers), organização sem fins lucrativos responsável por promover o conhecimento nas áreas de Engenharia Elétrica, Eletrônica e Computação define padrões para diversas áreas e práticas presentes na engenharia de software.
IEEE - Advancing Technology for Humanity |
Padrão IEEE 829 e documentos associados |
A automação de testes tem como um dos objetivos diminuir o envolvimento direto das pessoas em atividades repetitivas. Mas, como vimos, a automação de testes não se restringe ao trabalho repetitivo e chato. Na prática, a automação de 100% dos testes manuais pode não ser a melhor estratégia. A automação de testes é pouco eficaz quando os testes são complexos e exigem interações intersistemas ou validações subjetivas. Além disso, em vários casos o custo e o tempo para automatizar os testes de um projeto são maiores que o custo e o tempo do próprio projeto de desenvolvimento, inviabilizando a iniciativa.
Segundo Lages (2010), quando se deseja aplicar a automação na etapa de execução de testes das funcionalidades de um sistema, vários fatores devem ser avaliados para se identificar se é vantagem ou não a automação dos testes. Ela deve ser feita somente quando uma rotina específica de teste for executada várias vezes, pois a automação também demanda tempo de criação e manutenção de scripts. Lages ressalta que “[...] 70% dos testes do mercado são manuais. O teste automatizado serve basicamente para fazer Teste de Regressão. O que acha erro mesmo é o teste manual”.
Existem diversos tipos de testes para detectar a ineficiência de um sistema, e antes de muitos deles serem automatizados, são executados por várias vezes em modo manual para, depois de comprovado sucesso na sua utilização, serem automatizados.Uma vez que o software tenha sido elaborado, é necessário fazer a implementação dos testes manuais ou automatizados. Isto pode exigir conhecimento multidisciplinar, ou seja, conhecimento de programação, de testes de software, de linguagem de negócio e de ferramentas específicas. Portanto, o profissional responsável pelos testes automatizados normalmente é diferenciado.
Segundo Schach (2010, p. 463),
[...] implementação é o processo de converter o projeto detalhado em código. Quando isso é feito por um único indivíduo, o processo é relativamente bem compreendido. Porém, hoje em dia, a maioria dos produtos são muito grandes para serem implementados por apenas um programador dentro das restrições de tempo. Em vez disso, o produto é implementado por uma equipe, com todos trabalhando ao mesmo tempo em diferentes componentes do produto.
O trabalho colaborativo não indica a necessidade de todos realizarem tarefas semelhantes. Indica apenas a integração de ideias que naturalmente ocorre em uma equipe integrada.
De acordo com Pressman e Maxim (2016, p. 417), na década de 1970, McCall, Richards e Walters categorizaram os fatores que afetam a qualidade do software, relacionados com três áreas distintas: operação do produto, transição do produto e revisão do produto.
Fatores de qualidade de McCall |
Ao meu ver a essência está correta, porém talvez faltasse deixar claro que TDD não se trata apenas de escrever testes antes do código. Esta é a primeira visão que a maioria dos iniciantes têm sobre desenvolvimento orientado a testes: que basta escrever todos os testes antes e pronto. Isto é compreensível, já que escrever testes antes do código já causa um choque por si só. Porém, TDD foi definido pelo Kent Beck com a seguinte fórmula:
TDD = Test-First + Design Incremental
E a parte do design incremental ficou um pouco confusa na continuação do texto:
‘…O processo de desenvolvimento usando TDD é muito simples:
1 - Escolha a classe e o método que você que codificar e pense em todos os testes possíveis para ela;
2- Antes de escrever a classe, codifique os testes que você pensou…’
Seguindo estas instruções (escrever todos os testes possíveis antes) pode-se perder um pouco de um dos maiores benefícios de TDD, que é prover feedback rápido sobre o que está sendo implementado. Aí que entra o design incremental. A ideia é que a solução seja criada em pequenos passos (Baby Steps), seguindo a rotina descrita no livro TDD by Example:
1 - Escreva um pequeno teste que falhe, e talvez até mesmo sequer compile inicialmente;
2 - Faça o teste passar da maneira rápida, cometendo qualquer ‘pecado’ durante este processo;
3 - Refatore: elimine toda duplicação criada para fazer os testes passarem.
Desta forma, não é preciso pensar na solução completa (sequer numa classe inteira) antes de começar, basta pensar em um teste apenas e fazê-lo passar. Com o conhecimento adquirido é possível então passar para o próximo teste com mais segurança, e assim avançar até que a solução esteja completa.
Outra noção comum é pensar que TDD trata apenas de testes de unidade.Embora sejam bem pontuais, observar estes detalhes pode ajudar no uso mais eficiente de TDD.”
Para iniciar o planejamento dos testes, temos que partir de um problema específico e usaremos um caso clássico denominado problema FizzBuzz. O FizzBuzz consiste em exibir uma lista de 1 a 30, um em cada linha, e filtrar todos os números respeitando as regras:
Retorno do Fizz Buzz |
Testes automatizados são programas ou scripts simples que exercitam funcionalidades do sistema sendo testado e fazem verificações automáticas nos efeitos colaterais obtidos. A grande vantagem desta abordagem é a de que todos os casos de teste podem ser fácil e rapidamente repetidos a qualquer momento e com pouco esforço.
A reprodução de um teste automatizado inúmeras vezes, em situações específicas, garante que passos importantes não sejam esquecidos, e isto, sem dúvida, evitará uma situação indesejável.
Além disso, como os casos para verificação são descritos através de um código interpretado por um computador, é possível criar situações de testes bem mais elaboradas e complexas do que as realizadas manualmente, possibilitando qualquer combinação de comandos e operações. A magnitude dos testes pode também ser facilmente alterada. Por exemplo, é trivial simular centenas de usuários acessando um sistema ou inserir milhares de registros em uma base de dados, o que não é factível com testes manuais.
Quanto mais cedo se iniciarem os testes, mais barata será a correção dos erros encontrados e, para conquistar este benefício, o processo de teste, assim como o processo de desenvolvimento, deve ter um ciclo de vida, que é definido em fases.
Estas etapas são detalhadas no que se segue.
Aprofunda-se, nesta etapa, um estudo sobre os requisitos do sistema relacionados ao negócio, de forma a garantir que estejam completos e sem nenhuma ambiguidade. Deve ser traçado também um pequeno esboço do processo de teste. É preciso elaborar um plano com todas as atividades principais que serão executadas.
Nesta etapa são realizadas a elaboração da estratégia de testes e do plano de testes com objetivo de minimizar os principais riscos do negócio e fornecer os caminhos para as próximas etapas. Esta etapa deve ser executada em conjunto com as atividades de captação dos requisitos e o planejamento do projeto de desenvolvimento do sistema a ser testado. Testes de verificação deverão ser executados sobre os requisitos do sistema. Deverá também ser preparada a análise de risco do projeto de teste.
Esta etapa ocorre paralelamente às outras etapas. O objetivo básico é preparar o ambiente de teste para que os testes sejam executados corretamente, em condições mais próximas às da utilização pelo cliente.
Esta etapa se refere à especificação dos casos e roteiros de teste que são elaborados no decorrer do projeto. À medida que a equipe de desenvolvimento conclui alguns módulos ou partes do sistema, são elaborados os casos e roteiros de teste.
Executar e registrar os resultados dos testes são tarefas que precisam obedecer as seguintes diretrizes:
O projeto de teste é finalizado, sendo concluída e arquivada sua documentação. Deve ser recolhida esta documentação e elaborado um relatório gerencial com as conformidades e não-conformidades encontradas.
Os casos de teste funcionam como um roteiro a ser seguido para que os testes sejam realizados. De acordo com Farias (2014), um caso de teste é projetado para resolver um determinado objetivo e reúne um conjunto de condições que especificam os valores de entrada, precondições de execução, resultados esperados em função das entradas e pós-condições de execução. Os casos de teste podem ser positivos ou negativos:
Os autores argumentam que não há consenso entre os especialistas em relação à distinção entre estes três termos, principalmente em desenvolvimento com base em metodologias ágeis, em que pré e pós-entrega não são conceitos bem definidos. Mas é fato que cada um destes problemas pode causar diferentes impactos financeiros e humanos no negócio. As pessoas envolvidas no desenvolvimento querem evitar defeitos para que não fiquem com sua imagem manchada.
Mas é possível argumentar a favor das diferenças entre os termos. Considere a seguinte frase: “A melhor maneira de tentar construir a confiança é tentar destruí-la”.
Parece um paradoxo, concorda?
Pois saiba que não apenas parece, é um paradoxo.
Na tentativa de destruir a confiança por encontrar defeitos, falhas ou erros, na verdade estamos construindo uma confiança cada vez mais sólida no produto desenvolvido.
Pense, por exemplo, nos exaustivos testes automobilísticos, quando as montadoras literalmente destroem seus veículos para provar a qualidade de seus bens produzidos. Não concorda que estão provando com isso a segurança que você espera em um momento crítico, como um acidente de colisão frontal em uma estrada em alta velocidade?
Os projetos podem ter uma grande complexidade, então entendemos claramente que será impossível que eles não possuam alguns defeitos, principalmente porque em um grande projeto temos várias cabeças pensantes, com formações e lógicas diferentes, trabalhando juntas para atingir os objetivos.
Vários poderiam ser os motivos para alegar a impossibilidade de um software sem qualquer tipo de erro, falha ou defeito, mas não queremos contribuir nem para a busca da perfeição, que não existe, nem para o relaxamento relacionado à inexistência de perfeição.
Hoje não podemos falar de qualidade de software sem falar de desenvolvimento ágil, que tem sido considerado um conceito avançado de desenvolvimento e busca na eliminação de erros, falhas e defeitos.
Qualidade, confiabilidade, usabilidade, eficiência, manutenibilidade e portabilidade são atributos buscados incansavelmente no desenvolvimento de software e o que nos propomos a fazer na consideração deste assunto é como o testador pode contribuir para esta busca quase que inalcançável.
O processo de testes é efetivo quando encontra defeitos e é eficiente quando encontra os defeitos com a menor quantidade de recursos possível.
De acordo com Pressman e Maxim (2016), um software é testado para descobrir erros que foram introduzidos inadvertidamente no momento em que foi projetado e construído.
“Teste é um conjunto de atividades que podem ser planejadas antecipadamente e conduzidas sistematicamente. Por esta razão deverá ser definido para o processo de software, um modelo para o teste, que é um conjunto de etapas no qual podem ser empregadas técnicas específicas de projetos de casos de teste e métodos de teste.” (PRESSMAN; MAXIM, 2016, p. 466).
Pressman e Maxim (2006, p. 467) listam um conjunto de perguntas e respostas que apresentam os principais fundamentos que embasam os testes de software, quais sejam:
Samsung suspende fabricação e venda do Galaxy Note 7
“A Samsung suspendeu a fabricação do telefone Galaxy Note 7, informou a agência sul-coreana de notícias Yonhap, citando como fonte uma fornecedora da empresa. A iniciativa ocorre após um recall de 2,5 milhões de aparelhos no mundo todo por conta do risco de explosão da bateria.
A empresa também anunciou que ordenou a suspensão das vendas e trocas de unidades do Galaxy Note 7 enquanto acontecem as investigações sobre os problemas recentes.
O caso
Fabricante número 1 de smartphones no mundo, a Samsung enfrenta tempos difíceis desde que, em 2 de setembro de 2016, semanas após o lançamento antecipado do Galaxy Note 7, teve de anunciar o recall de 2,5 milhões de unidades vendidas em 10 países. O motivo era que as baterias podiam explodir.
A decisão de suspender temporariamente a produção foi tomada em coordenação com as autoridades de proteção ao consumidor da Coreia do Sul, Estados Unidos e China, informou a fonte, que pediu anonimato, à agência.
A AT&T e T-Mobile anunciaram a interrupção das vendas do Galaxy Note 7, à espera de investigações adicionais.
‘Estamos tentando ajustar os volumes de produção para melhorar o controle de qualidade e permitir investigações mais profundas após as crescentes explosões do Galaxy Note 7’, afirmou o grupo em um comunicado.
As imagens de telefones carbonizados inundaram as redes sociais de todo o mundo nas últimas semanas. Os incidentes com aparelhos que já haviam sido substituídos agravaram ainda mais a situação da Samsung.
A crise ocorre num momento que não podia ser pior. Após os anos excepcionais de 2012 e 2013, a Samsung começou a sofrer com o avanço da Apple e dos grupos chineses. O grupo sul-coreano contava com este smartphone para sustentar seu crescimento até o fim do ano, em um mercado cada vez mais competitivo. Os analistas consideram que o custo deste recall pode chegar a US$ 2 bilhões.
‘É novamente algo muito grave’, declarou S. R. Kwon, analista da Dongbu Securities. ‘Podem chegar a retirar o Note 7 do mercado. O mais inquietante é que as coisas não parariam por aí.’ ‘Isso vai danificar a imagem de marca da Samsung e penalizará as vendas de outros smartphones Galaxy’, previu.”
Fonte: <g1.globo.com>
De acordo com o Syllabus, em ISTQB (2011, p. 14, adaptado), há sete princípios que fornecem um guia geral para o processo de teste de software:
Princípio 1 – Teste demonstra a presença de defeitos
O teste pode demonstrar a presença de defeitos, mas não pode provar que eles não existem. O teste reduz a probabilidade que os defeitos permaneçam em um software, mas mesmo se nenhum defeito for encontrado, não prova que ele esteja perfeito.
Princípio 2 – Teste exaustivo é impossível
Testar tudo (todas as combinações de entradas e pré-condições) não é viável, exceto para casos triviais. Em vez do teste exaustivo, riscos e prioridades são levados em consideração para dar foco aos esforços de teste.
Princípio 3 – Teste antecipado
A atividade de teste deve começar o mais breve possível no ciclo de desenvolvimento do software ou sistema e deve ser focado em objetivos definidos.
Princípio 4 – Agrupamento de defeitos
Um número pequeno de módulos contém a maioria dos defeitos descobertos durante o teste antes de sua entrega ou exibe a maioria das falhas operacionais.
Princípio 5 – Paradoxo do Pesticida
Pode ocorrer de um mesmo conjunto de testes que são repetidos várias vezes não encontrarem novos defeitos após um determinado momento. Para superar este “paradoxo do pesticida”, os casos de testes necessitam ser frequentemente revisados e atualizados. Um conjunto de testes novo e diferente precisa ser escrito para exercitar diferentes partes do software ou sistema com objetivo de aumentar a possibilidade de encontrar mais erros.
Princípio 6 – Teste depende do contexto
Testes são realizados de forma diferente conforme o contexto. Por exemplo, softwares de segurança crítica são testados diferentemente de um software de comércio eletrônico.
Princípio 7 – A ilusão da ausência de erros
Encontrar e consertar defeitos não ajuda se o sistema construído não atende às expectativas e necessidades dos usuários.