Escolar Documentos
Profissional Documentos
Cultura Documentos
THANOS:
Um processo para geração automática de testes a partir de Histórias de Usuário
utilizando PLN
SÃO LEOPOLDO
2022
Pablo Da Silva Kleim
THANOS:
Um processo para geração automática de testes a partir de Histórias de Usuário
utilizando PLN
SÃO LEOPOLDO
2022
1
Resumo: A etapa de testes de software busca garantir que os requisitos definidos sejam aten-
didos pelo produto que será entregue, reduzindo o retrabalho, aumentando a qualidade dos
produtos e acrescentando grande valor nas entregas. Com objetivo de identificar oportunidades
de melhorias nessa etapa, foi realizado um estudo da arte cujo foco inicial foi analisar diver-
sos trabalhos e abordagens para geração de testes automatizados. A partir desta análise, foi
possível evidenciar diversas lacunas, tais como, o alto custo para gerar e manter códigos de
teste automatizado. Com o objetivo de mitigar estes problemas, neste trabalho, é apresentado
o processo thanoS, o qual provê a geração automática de códigos de teste para APIs backend
utilizando técnicas de Processamento de Linguagem Natural, a partir de requisitos descritos em
Histórias de Usuário. Com base neste processo, foi desenvolvido um protótipo de ferramenta
chamado thanoS Tool, o qual implementa as etapas do processo thanoS. Por fim, com o obje-
tivo de avaliar a aplicabilidade do processo thanoS e seu protótipo, foi realizada uma análise
quantitativa em que foram comparados os tempos de geração de códigos de teste utilizando a
abordagem manual e automatizada com o thanoS Tool. A partir desta análise, foi evidenciado
que o thanoS Tool se demonstrou mais eficiente, gerando os códigos de teste em um tempo
consideravelmente menor, se comparado com a abordagem manual.
1 INTRODUÇÃO
A etapa de teste de software tem como objetivo identificar e validar os cenários criados na
implementação de um sistema, a fim de encontrar possíveis erros e verificar se o seu funciona-
mento está de acordo com os requisitos solicitados. Portanto, a etapa de teste é imprescindível
para garantir a qualidade das entregas, entretanto, quando os testes são realizados de forma
manual, essa etapa se torna repetitiva e propensa a falhas humanas.
Considerando estas limitações, os testes manuais começaram a ser substituídos, no fluxo
de desenvolvimento, por testes automatizados. Desta forma, o advento da automação de testes
possibilitou maior controle dos cenários cobertos e proporcionou o reuso dos testes.
1.1 Problema
MAN, 2020). Além disso, a migração do processo manual para automatizado exige que os
profissionais da área sejam treinados no desenvolvimento dos testes.
Também é importante destacar que, no mercado atual, muitos dos profissionais que exer-
ciam a função de executar testes manuais, têm apresentado dificuldades em se adaptar para o
formato de desenvolvimento dos testes automatizados, e mesmo os que possuem o conheci-
mento necessário, concordam que é um processo com custo elevado, mas que ainda acrescenta
grande valor para a qualidade final do produto (CARDEAL; PARREIRA, 2015).
Além disso, existe o agravante de que, é necessário utilizar diferentes tecnologias de teste
para validar as diversas partes do sistema, ou seja, para testar o frontend e o backend de uma
mesma aplicação são utilizadas tecnologias de teste distintas. Desta forma, o profissional de
teste acaba necessitando se capacitar em diversas tecnologias para validar todo o sistema.
Atualmente, existem diversos trabalhos (citar uns 3 trabalhos) que apresentam abordagens
de automação de testes. No entanto, nenhum deles propõe soluções de automação de teste
backend, a partir de Histórias de Usuário (COHN, 2004) utilizando técnicas Processamento de
Linguagem Natural (PLN)(BARBOSA; VIEIRA, 2017).
1.2 Objetivos
2 FUNDAMENTAÇÃO TEÓRICA
Nesta seção, serão apresentados temas relacionados à proposta de pesquisa, i.e., metodolo-
gias ágeis, teste de software, metodologias e frameworks utilizados para o processo de automa-
ção de testes, bem como as etapas do Processamento de Linguagem Natural.
Entretanto, esse modelo apresenta problemas principalmente em cenários onde são requi-
sitadas mudanças em fases mais avançadas do fluxo, necessitando que o processo seja reinici-
ado para atender a nova demanda, essas alterações se tornam mais frequentes devido a baixa
interação do cliente no processo de desenvolvimento do software, que comumente ocorre ex-
clusivamente na fase de levantamento de requisitos e na entrega do produto (ALEXANDRU
4
O time Scrum incentiva comportamentos multifuncionais, onde todos devem ser capazes de
atender as tarefas, desde a análise ao teste do produto, e espera-se que o time seja autogeren-
ciável, por isso se tem um número reduzido de profissionais compondo cada time. Além disso,
5
segundo o Scrum Guide (SCHWABER; SUTHERLAND, 2020), os times devem ser formados
por os seguintes componentes:
• Scrum Master: tem como objetivo direcionar o time nas melhores práticas da metodologia
ágil.
• Product Owner: ou dono do produto, é o representante do cliente no time, ele deve ser
capaz de entender as necessidades e passar ao time.
As cerimônias são marcos dentro dos ciclos realizados pelo time, comumente referidas
como reuniões, devido a característica iterativa da metodologia, estas são realizadas para que
os ciclos sejam evoluídos a cada iteração, e têm diversos objetivos desde troca de informações
internamente e externamente à reflexões sobre o processo. Algumas das cerimonias propostas
pelo Scrum Guide (SCHWABER; SUTHERLAND, 2020) são:
• Planning: Momento onde são priorizadas as Histórias de Usuário que serão trabalhadas
no ciclo que irá se iniciar;
• Daily: Ocorre diariamente com objetivo de trocar e alinhar informação entre o time, a fim
de verificar riscos para a entrega;
• Review: Realizada ao fim da Sprint, nesse momento o Product Owner e os clientes são
convidados a validar a entrega realizada no período;
• Retrospectiva: Momento onde os times fazem uma auto-critica e refletem com objetivo
de aprimorar o processo de software para as próximas iterações.
todos do time, focando no que precisa ser feito e não em como fazer, deixando as especificidades
dos técnicas cenários para outros documentos com tal objetivo.
Com objetivo de padronizar o conteúdo das Histórias de Usuário, um formato frequente-
mente utilizado em times ágeis (INSTITUTE, 2016), é contar uma história do ponto de vista
do usuário, para isso, deve-se considerar quem será o principal ator envolvido, e responder as
perguntas:
• Porque? Os motivos para a necessidade dessa História de Usuário, bem como a criticidade
da mesma.
Deste modo, respondendo estas perguntas a partir da visão do usuário, coloca-se a necessidade
de trazer valor para o usuário final em primeiro lugar, deixando claro o que deve ser feito, e
qual o problema busca-se resolver, de forma simples e facilmente compreensível entre todos do
time, conforme pode ser observado na Figura 4. Além disso, para auxiliar na escrita de uma
História de Usuário de qualidade, alguns critérios podem ser considerados na elaboração da
mesma, para isto, em (COHN, 2004) propõe-se o padrão INVEST, acrônimo para:
• Testable: Testável.
Segundo (FARIAS, 2008), os níveis de teste são classificações da abstração e escopo que
serão utilizados na execução do teste, e quanto mais abrangentes mais complexo se torna o
processo, alguns desses grupos são:
• Teste de componente ou unidade: nesse caso é levado em consideração apenas o que foi
desenvolvido, focando na funcionalidade em específico, abstraindo questões externas ou
outros componentes com o qual pode se comunicar, apenas verificando se essa unidade
atende ao requisito;
• Teste de integração: testa-se além do que foi construído, todo o grupo de componentes
com o qual há relacionamento.
• Teste de aceitação: com uma visão mais alto nível, tenta-se simular a interação externa
com o sistema em uma posição de cliente, testando se o sistema como um todo atende ao
requisito;
Segundo (GRAHAM; VANS; BLACK, 2007), os três principais tipos de teste são funci-
onal, não funcional e de regressão, todos podem ser aplicados nos diferentes níveis de teste,
diferenciando apenas o objetivo especifico de cada um conforme a necessidade do item a ser
testados.
O teste funcional, é definido com base nos documentos de requisitos, realizando intera-
ções com a aplicação e comparando do resultado esperado, a fim de definir se o sistema tem o
comportamento especificado. Segundo (FARIAS, 2008), esse teste pode ser chamado também
de teste de caixa preta, referindo-se ao software em questão como a caixa preta, sendo assim,
apenas tem se a visão de fora do sistema podendo utilizar das entradas para definir o resultado.
Por outro lado, os testes não funcionais, tem como objetivo garantir que o sistema conse-
gue entregar o requisito funcional com qualidade, testando então o ambiente que suporta este
software. Estes podem ser sub categorizados entre:
• Teste de desempenho: pode ser realizado para evidenciar o tempo de resposta do sistema
em diferentes cenários de carga.
• Testes de regressão: nesse caso não se tem especificado um requisito em particular a ser
testado, mas busca-se garantir que funcionalidades críticas seguem no comportamento
esperado, após mudanças no sistema.
Após mapeados os critérios a serem atendidos pelo software e a estratégia de testes defi-
nida, resta então executar o processo de teste do sistema, passando pelos cenários definidos
para verificar o resultado obtido. Em um teste funcional, por exemplo, esse processo pode ser
realizado de forma manual, ou seja, uma pessoa interage manualmente com o sistema execu-
tando os passos definidos e verificando a resposta obtida, e normalmente são evidenciados tais
passos realizados a fim de comprovar o comportamento.
Entretanto, para cenários específicos, pode fazer sentido realizar os testes nesse formato,
mas quando tomamos de exemplo os testes de regressão, pode se evidenciar gargalos no fluxo
de desenvolvimento, como visto anteriormente, os testes regressivos visam manter funcionali-
dades críticas do sistema estáveis, então todos esses processos precisam ser manualmente tes-
tados e evidenciados repetidamente, trazendo a vista a característica de repetição dos processos
manuais.
Desta forma, os testes automatizados propõem uma abordagem diferente, buscando dispo-
nibilizar uma ferramenta capaz de realizar as funções que poderiam ser efetuadas de forma
manual, possibilitando uma forma simples de executar o teste e provendo reusabilidade para
eventuais necessidades posteriores.
Sendo assim, o esforço é utilizado para criar a ferramenta e não efetivamente executar os
passos, isso ao custo do incremento do tempo e complexidade dessa etapa (PINHEIRO; VA-
LENTIM; VINCENZ, 2015), uma comparação entre o tempo e esforço exigido entre testes
automatizados e manuais pode ser vista na Figura 5, em que evidencia-se que os testes auto-
matizados em geral custam mais para o desenvolvimento mas apresentam maior valor ao longo
prazo.
Contribuindo para a programação ágil de software, uma prática interessante que pode ser
adotada Teste Orientado ao Desenvolvimento (Test Driven Development - TDD), que propõe
para os desenvolvedores de um software que pensem também na qualidade do software em
primeiro lugar, criando seus próprios testes para aumentar a confiabilidade do código, cola-
borando assim para o processo de compartilhar a responsabilidade pela qualidade do software
entre o time (PINHEIRO; VALENTIM; VINCENZ, 2015).
Além disso, a adoção desta prática possibilita que parte da etapa de teste seja realizada para
durante o desenvolvimento da funcionalidade, diminuindo assim o custo de tempo para entrega
do software, já que no formato padrão o teste apenas poderia começar ao fim do desenvolvi-
mento.
sua vez propõe um padrão para desenvolvimentos de aplicações do lado do servidor, e para
comunicação entre as mesmas (RICHARDSON; RUBY, 2007).
Sendo assim, para realizar uma requisição a uma funcionalidade exposta por um serviço
Rest, são necessárias algumas informações, como a rota, para identificar o recurso e a sua
funcionalidade desejada, o método HTTP, que é utilizado para definir o tipo de comportamento
que se deseja acessar.
Deste modo, por exemplo, para recuperar um recurso sem alterá-lo, deve-se utilizar o mé-
todo HTTP get, já para persistir um novo recurso deve-se utilizar o método post. Além disso,
o corpo da requisição, é uma forma mais densa de passar informações que serão utilizadas pelo
serviço, outra característica do HTTP, que é importante nas comunicações são as situações das
requisições, que retornam um código representando erro ou sucesso do processo (TREVISAN,
2016).
No padrão Rest, recomenda-se que o conteúdo enviado nas requisições entre aplicações seja
formatado em Json (BARBAGLIA; MURZILLI; CUDINI, 2016), sendo o esta uma forma de
representar dados em formato chave e valor, sua vantagem quando comparado a outros padrões
de representação de dados, é o tamanho reduzido do resultado final, se tornando a melhor opção
para trafegar a informação pela rede. Desta forma, uma representação Json pode ser vista na
Figura 7, em que se tem a chave “nome” com valor igual a “Alexandre Gama”.
Para validar uma API Rest, deve-se avaliar os tipos e níveis de testes que serão aplicados,
assim podendo ser realizado de forma manual, efetuando as requisições e evidenciando o seu
retorno, ou automatizada, gerando os Casos de Testes (Test Case - TC) que fazem a validação
do resultado esperado, para facilitar a criação desses cenários existem diversas ferramentas que
buscam facilitar o processo.
(TREVISAN, 2016). Tais automações podem ser aplicadas submetendo o serviço a um cenário,
representado como a entrada enviada, e comparando se o retorno ou comportamento se da con-
forme o esperado. Após desenvolvidos os cenários, a automação fica disponível para posteriores
execuções, e caso necessário para realizar possíveis testes regressivos.
O framework disponibiliza então ferramentas para realizar a requisição ao serviço a ser
testado, e obter o retorno para que o mesmo seja submetido as devidas validações, como por
exemplo, verificar se a situação retornada é a esperada, ou se há um determinado valor no corpo
retornado. Estas regras devem ser construídas conforme os critérios de aceite informados no
documento de requisitos do software, com os cenários automatizados é então composto o grupo
de critérios que definirão se o sistema está conforme os requisitos (TREVISAN, 2016).
Conforme pode ser visto na Figura 6, o método when representa a preparação dos dados, ou
o cenário, é utilizado na sequência o comando get, que representa o verbo HTTP a ser requi-
sitado, e como parâmetro é informado a rota, contendo o identificador do recurso de interesse.
Para validação após o then é requisitado as informações retornadas pelo serviço, no caso sendo
o código de retorno 200 representando sucesso, e ainda é verificado se o valor da chave "lottoId"
da entidade "lotto" é igual a 5, caso essas asserções sejam verdadeiras o teste e encerrado com
sucesso.
Deste modo, para modelar uma ferramenta capaz de compreender toda essa diversidade das
linguagens humanas, tradicionalmente o conteúdo é submetido à uma série de etapas, conforme
ilustrado na Figura 9, com objetivo de filtrar e corrigir possíveis conflitos de forma granular em
cada etapa (BARBOSA; VIEIRA, 2017).
2.7.1 Tokenização
Ao contrário da etapa anterior, em que se preocupava com a estrutura das frases, na fase
de análise semântica, é analisado então o contexto da frase, para se extrair o significado do
que de fato deseja-se passar com o texto em questão. Sendo essa a etapa mais complexa do
processamento, devido a necessidade de resolver ambiguidades, que são conflitos no sentido de
uma palavra dependendo de sua utilização.
2.7.5 SpaCy
Deste modo, para implementar as etapas do PLN, existem diversas bibliotecas que dispo-
nibilizam abstrações para facilitar o uso destes algorítimos, sendo uma delas, o Python SpaCy
(VASILIEV, 2003), uma biblioteca para a linguagem Python. O SpaCy disponibiliza algorit-
mos para realizar a Tokenização de frases e comparação de similaridade entre palavras. Além
disso, é disponibilizado pela biblioteca um vasto dicionário de palavras reconhecidas em di-
versas linguagens, como Português e Inglês, dicionários estes que também são disponibilizadas
pela ferramenta.
O algoritmo de cálculo da similaridade entre palavras, fornecido pela biblioteca SpaCy, é a
chave para o processo thanoS e será abordado posteriormente na seção 5, este utiliza interna-
mente de algoritmos que possibilitam a geração de um valor, interpretado como a similaridade
entre as palavras, sendo estes principalmente o Word2vec e a Distância Euclidiana.
O Word2vec, é um algoritmo de incorporação de palavras, que no contexto da ferramenta, é
responsável por transformar as palavras em vetores, com valores que representam suas caracte-
rísticas. Sendo assim, este algoritmo utiliza de uma rede neural previamente treinada, utilizando
método SkipGram, no qual a rede é treinada para receber uma frase, omitindo uma palavra e
tenta-se elencar probabilidades para possíveis palavras serem a que foi omitida originalmente
(CHUAN; AGRES; HERREMANS, 2018).
Deste modo, com os vetores gerados pelo Word2Vec, é utilizado do algoritmo de Distância
Euclidiana para delimitar a distância entre os vetores representantes das palavras que estão a
ser comparadas, a distância normalizada entre os dois gera um número, sendo este o valor
interpretado como a similaridade das palavras.
15
3 METODOLOGIA DE PESQUISA
A elaboração deste estudo, foi baseada na metodologia de pesquisa exploratória, com ob-
jetivo de evidenciar pontos de relevantes para o estudo como, o estado da arte, as soluções e
problemas existentes no processo de teste de software, assim como, esclarecer conceitos para
melhor entendimento da proposta do trabalho. Explorando estes conceitos busca-se apresentar
e validar hipóteses, que poderão contribuir para área de desenvolvimento de software em geral.
Para embasar a pesquisa, foi realizado uma revisão da literatura, conforme descrito na seção
2, em que foram realizas buscas por referências em literaturas e artigos, priorizando pela sua
data de publicação e relevância ao tema do trabalho, conforme proposto em (MARCONI; LA-
KATOS, 2010), para que seja possível identificar e propor possíveis melhorias para o processo
de teste de software.
Desta forma, a partir deste estudo, será desenvolvido processo, e um protótipo de ferramenta
o implementando, que utilizando de algorítimos de PLN, será capaz de processar artefatos de
requisitos, como as Histórias de Usuário propostas pelo Scrum, e com base nestas gerar códigos
de testes de forma automatizada, validando os requisitos descritos no artefato.
Além disso, para a construção do protótipo, serão realizadas integrações com ferramentas
preexistentes, que disponibilizem recursos de interesse para facilitar o processo, tais como, a
biblioteca Python SpaCy, que fornece algoritmos de PLN, o Cucumber (SMART, 2014), para
integração de critérios escritos em Gherkin, com o seu devido código representante, bem como,
o TestNG (GRAHAM; VANS; BLACK, 2016) para execução dos códigos de teste gerados, a
utilização específica destas é descrita na Seção 5.
Para validação da viabilidade do processo e protótipo, serão submetidos a testes quantita-
tivos, a fim de medir seu desempenho, quando comparado ao processo manual de escrita de
códigos, a partir dos mesmos artefatos de requisitos.
4 TRABALHOS RELACIONADOS
Devido a necessidade constante de tornar o processo de teste de software mais ágil, diversos
estudos foram realizados buscando propor tecnologias, métodos e técnicas para otimizar o pro-
cesso de testes. A seguir, são apresentados os estudos e pesquisas relacionados ao tema, bem
como, uma análise comparativa com a solução proposta neste trabalho.
Em (SINGH; SHARMA, 2015), foi proposta uma ferramenta para geração de testes auto-
matizados com base a partir de requisitos descritos em diagramas de Caso de Uso UML (Use
Case - UC). Porém, uma das limitações da ferramenta proposta pelo autor, refere-se ao esforço
e conhecimento adicional para criar os Casos de Uso, a partir dos quais são gerados os cenários
de testes automatizados. Além disso, diferentemente do processo thanoS, a solução proposta
pelo autor não utiliza PLN e algoritmos de Inteligência Artificial para a geração automática de
testes.
16
Uma abordagem similar ao processo thanoS é apresentada em (FARIAS, 2008), a qual apre-
senta uma técnica que utiliza PLN para classificar automações previamente escritas e, posterior-
mente, realizar consultas por palavras-chave a fim de reutilizar o código dos testes (Test Script
- TS). Entretanto, a proposta do autor exige a interação do testador para modelar o teste resul-
tante, sendo assim, é um processo parcialmente automatizado.
A partir desta técnica, o autor também desenvolveu uma ferramenta denominada NLScripts,
a qual foi classificada como composição assistida de testes, sendo assim, uma solução limitada
por ser um processo parcialmente automatizado, já que exige interação e esforço dos testadores
para escolher e modelar o código de teste resultante. Outra limitação do trabalho proposto pelo
autor, diz respeito a não utilização de um artefato da metodologia ágil descrever os requisitos
do sistema, como as Histórias de Usuário. Além disso, o autor não utiliza Inteligência Artificial
para determinar quais casos de teste são mais adequados a serem gerados.
Em (REOLON, 2020), foi proposto um método alternativo para testar páginas web utili-
zando o framework Selenium (BIRMINGHAM, 2014) para a geração de testes frontend. Neste
trabalho, foi desenvolvido um protótipo de ferramenta que utiliza PLN no processamento de
Histórias de Usuário. O protótipo foi nomeado TFA e é uma solução mais eficiente do que a
execução manual doe teste. Entretanto, diferentemente do processo thanoS, esta ferramenta não
pode ser aplicada para testes automatizados de APIs backend.
A partir dos cenários de testes já especificados, (SALMAN, 2020) propõe uma abordagem
utilizando PLN e algoritmos de Inteligência Artificial, para geração automatizada de códigos de
teste. Entretanto, esta abordagem se limita a composição de testes utilizando apenas códigos de
automações previamente desenvolvidas, as quais são utilizadas no treinamento da Inteligência
Artificial. Uma das limitações deste trabalho, é que todo o processo de geração de códigos de
teste, inicia a partir de cenários de teste que necessitam ser previamente criados pelo testador
a partir de uma especificação funcional. Tal limitação não existe no processo thanoS, uma vez
que a automação da escrita de códigos de teste é iniciada a partir de um artefato que descrevem
requisitos funcionais, tais como Histórias de usuário.
Com base nos estudos analisados, foram evidenciadas algumas lacunas, e.g., a não utiliza-
ção de PLN e algoritmos de inteligência artificial para a geração de testes de APIs backend.
Além disso, estes trabalhos fornecem uma automação parcial, i.e., necessitam da interação dos
testadores para a geração de cenário de teste, ou mesmo a seleção de termos utilizados para
posterior geração dos testes. Por outro lado, o processo thanoS prove uma automação mais
completa, sendo capaz de gerar os códigos de teste, utilizando o framework Rest Assured, a
partir de requisitos descritos em Histórias de Usuário.
A Tabela 1 apresenta uma comparação das principais características entre as abordagens
e metodologias propostas pelos trabalhos supracitados. Essas comparações fornecem alguns
indicadores relacionados à eficácia e vantagens do processo thanoS em relação a outras me-
todologias. No entanto, esta é uma proposta experimental e um estudo aprofundado deve ser
considerado para comprovar essas supostas vantagens.
17
5 PROCESSO THANOS
O processo thanoS propõe uma forma automática para a geração de testes para APIs Rest,
com base nos cenários definidos nas Histórias de Usuários, escritas na linguagem Gherkin, na
qual pode-se descrever os cenários a serem validados de modo humanamente compreensível.
As Histórias de Usuário são processadas por algoritmos de PLN, a fim de gerar testes automa-
tizados em Java, que representam a necessidade a ser verificada. As etapas específicas deste
processo são apresentadas na Figura 10 e detalhadas nas subseções seguintes.
A primeira etapa, inicia com o recebimento de uma História de Usuário, escrita em lingua-
gem natural, seguindo o padrão Gherkin, conforme exemplificado na Figura 11. As palavras
Cenário, Dado, Quando e Então, são palavras reservadas da linguagem e identificam o
objetivo de cada frase do cenário. Portanto, cada frase deve ser iniciada por uma das palavras
reservadas, e cada palavra é classificada entre configuração e validação.
Por exemplo, as frases iniciadas com a palavra reservada Quando, são classificadas como
comandos de configuração, e os dados contidos nesta frase (“nome” e “pablo”), estão repre-
sentados entre aspas, uma vez que se trata de um padrão da linguagem Gherkin para identifica-
ção de dados parametrizáveis. Por fim, estes dados são utilizados posteriormente para a geração
da requisição HTTP da API a ser testada.
Por outro lado, as frases que iniciam com Então e E, são classificadas como comandos
de validação, sendo utilizadas posteriormente para validar o retorno obtido na requisição. Por
exemplo, o dado parametrizável “200” corresponde ao valor esperado do status da requisi-
ção HTTP. É importante destacar, que as frases iniciadas por outras palavras reservadas são
ignoradas, pois não são necessárias no processo thanoS, uma vez que as palavras supracitadas
satisfazem o objetivo de geração automatizada dos testes.
Deste modo, para gerar os tokens, o processo thanoS pode utilizar diversas bibliotecas para
geração automática de tokens. Neste trabalho foi utilizada a biblioteca Pyhon SpaCy, um
vez que ela provê algoritmos de PLN treinados com bases de dados em diversas linguagens,
como o Português Brasileiro, proporcionando um vasto dicionário de palavras reconhecidas
pelo mesmo.
Após definidas as palavras de interesse a serem analisadas em cada frase, é necessário re-
alizar a correlação entre uma palavra em um verbo HTTP específico. Por exemplo, a palavra
cadastrar representa o verbo HTTP POST, enquanto a palavra consultar é representada
pelo verbo GET (ver Tabela 3).
Para realizar esta correlação entre uma palavra e um verbo HTTP, no processo thanoS,
realiza-se uma análise de similaridade, em que uma palavra é comparada com um grupo de
palavras que melhor representam os verbos HTTP. Este grupo de palavras foi definido a partir
de testes com diversas combinações de palavras. Por exemplo, consulta e busca corres-
pondem ao grupo de palavras que melhor representa o verbo GET. Assim como, as palavras
cria e cadastra correspondem ao grupo de palavras que melhor representa o verbo POST.
20
Os demais grupos de palavras e seus respectivos verbos HTTP são apresentados na Tabela 3.
A análise de similaridade é realizada a partir de uma funcionalidade disponibilizada pela
biblioteca SpaCy, que realiza comparações de similaridades entre palavras tokenizadas. Para o
funcionamento desta funcionalidade, o SpaCy utiliza internamente algoritmos como o Word2vec.
Este algoritmo gera vetores que representam características chave das palavras sendo compara-
das. Além disso, o SpaCy também utiliza o algoritmo chamado Distância Euclidiana, o qual é
responsável pelo cálculo da distância entre os vetores resultantes, retornando um valor entre 0
e 1, este valor é interpretado como o coeficiente de similaridade das palavras. Maiores detalhes
sobre o funcionamento destes algoritmos são apresentados na subseção 2.7.5.
Nesta etapa, após correlacionar as palavras tokenizadas com os seus respectivos verbos
HTTP, inicia-se a geração do código de teste automatizado. Estes testes são gerados através da
21
correlação entre determinados trechos de código Rest Assured, verbos HTTP e adjetivos que
correspondem aos métodos de validação.
Na prática, os dados parametrizáveis definidos na História de Usuário, são utilizados nos
trechos de código Rest Assured. Por exemplo, os dados parametrizados “nome” e “pablo”,
definidos na História de Usuário da Figura 11, são agora utilizados como parâmetros de re-
quisição HTTP (i.e., GET, POST, PACTH e DELETE) nos trechos de código Rest Assured (ver
Tabela 5).
Da mesma forma, os dados parametrizados “nome” e “pablo” são utilizados como parâ-
metros para os códigos dos métodos de validação (i.e., IGUAL, MAIOR e MENOR) do retorno
do teste (ver Tabela 6).
Por fim, com os códigos de testes automatizados gerados na etapa anterior pelo processo
thanoS, é possível seguir para sua execução. Os testes são executados usando o software In-
telliJ e podem ser reexecutados repetidas vezes conforme demanda. O resultado de cada teste
apresenta um status de sucesso ou falha, conforme as regras definidas na História de Usuário.
6 EXEMPLO DE APLICAÇÃO
Para avaliar o processo thanoS, foi criado um protótipo de ferramenta para a geração auto-
mática de códigos teste para APIs Rest, o thanoS Tool o qual implementa as etapas do processo
thanoS.
22
O thanoS Tool foi desenvolvido na ferramenta Pycharm (ISLAM, 2015), utilizando a lin-
guagem Python 3 (PERKINS, 2012), e a biblioteca SpaCy, que disponibiliza algoritmos de
PLN. O protótipo recebe como entrada um arquivo de texto com a História de Usuário escrita
na linguagem Gherkin, a qual descreve as funcionalidades a serem testadas.
A saída gerada pela thanoS Tool corresponde ao código de teste gerado para a linguagem
Java, utilizando framework Rest Assured. Os códigos de teste gerados podem ser vinculados
a História de Usuário, integrando a execução com a ferramenta Cucumber para execução inte-
grada com JUnit (HUNT; THOMAS, 2020) ou TestNG (GRAHAM; VANS; BLACK, 2016).
Deste modo, a execução do thanoS Tool se dá a partir de uma linha de comando utilizando
Python, onde os parâmetros são, respectivamente, o arquivo da História de Usuário e o diretório
onde será gerado o código de testes automatizado na linguagem Java.
a) Cadastrar uma pessoa por nome e número de documento, esperando retorno de sucesso.
b) Consultar uma pessoa por nome e número de documento, esperando retorno de sucesso.
A partir desta História de Usuário, foram gerados os códigos de testes em Rest Assured
utilizando a abordagem automatizada e manual e obtidos os tempos de execução de cada abor-
dagem. Para isso, conforme descrito anteriormente, foi utilizada para ambas as abordagens a
mesma História de Usuário.
23
Após a geração e execução dos testes utilizando as abordagens manual e automatizada, foi
possível obter os dados quantitativos de tempo de criação dos códigos de teste.
Desta forma, conforme apresentado na Tabela 7, o tempo para geração do código de teste
utilizando o thanoS Tool foi igual a 15 segundos. Um exemplo de código de teste gerado
pelo protótipo de ferramenta pode ser observado na Figura 13. Por outro lado, o tempo de
geração dos códigos de teste utilizando a abordagem manual e realizada por um profissional
com experiencia nas tecnologias utilizadas foi de 20 minutos.
É importante destacar, que o conhecimento necessário em tecnologias de teste para o pro-
fissional escrever o código de teste manualmente, não é demasiado relevante quando utilizado
o thanoS Tool, uma vez que não é necessário um conhecimento aprofundado em tecnologias e
frameworks de teste para a utilização deste.
Entretanto, o tempo de geração dos códigos de testes não é a única vantagem observada do
processo thanoS. A partir do protótipo thanoS Tool, foi possível observar também vantagens
nos tempos para manutenções dos códigos de testes. Nesse caso, é necessário apenas manter a
História de Usuário com os requisitos atualizados e realizar uma nova execução do thanoS Tool
para obter os códigos de teste atualizados. Além de incentivar a cultura de manter as Histórias
de Usuário atualizadas, o thanoS Tool também contribui para os testes de regressão.
Além disso, utilizando o thanoS Tool, foi possível mitigar a possibilidade de erro humano,
bem como, pode-se observar uma cobertura total dos testes em relação aos requisitos defini-
24
dos na História de Usuário. Processo este que quando executado manualmente, frequentemente
pode estar cobrindo apenas parcialmente os requisitos. Também afetado pelo fator humano, a
qualidade do código pode ser levada em consideração, já que a o protótipo é capaz de desen-
volver um código padronizado, e o mesmo processo manual pode resultar em uma qualidade
variável dependendo do profissional que o realizar.
Deste modo, analisando os resultados obtidos a partir dos testes supracitados, evidencia-
se a relevância do processo thanoS, bem como, sua viabilidade com base no protótipo thanoS
Tool. Uma comparação direta entre as abordagem automatizada (utilizando thanoS Tool) e a
abordagem manual de geração dos códigos pode ser observada na Tabela 7.
7 CONSIDERAÇÕES FINAIS
Este estudo teve como objetivo analisar o processo de software, com foco no seu impacto
na área de testes, a partir da análise de abordagens e técnicas propostas por diversos autores
da comunidade cientifica. Portanto, com base nestes estudos, evidencia-se que a adesão dos
testes automatizados se mostra uma solução eficaz quando comparado com a execução de testes
manuais. Porém, mesmo com as vantagens oriundas da automação de testes, são necessários
profissionais capacitados e tempo para o desenvolvimento dos códigos de teste, aumentando
assim a complexidade técnica do processo.
Nesse contexto, para mitigar o custo de desenvolvimento de testes automatizados, nesse
trabalho foi proposto o processo thanoS, que utiliza algoritmos de Inteligência Artificial, para a
geração dos testes de forma automatizada. Para isso, foram utilizadas técnicas de PLN, a partir
dos cenários descritos em Histórias de Usuário, previamente desenvolvidos pelos times ágeis,
para criar automaticamente o código de teste, utilizando o framework Rest Assured para testes
de APIs backend.
Deste modo, a partir das etapas definidas para o processo thanoS, foi desenvolvido um
protótipo de ferramenta para validação do processo, com base em algoritmos de Inteligência
Artificial preexistentes, disponibilizados pelo Python SpaCy, que realizam o processamento de
Histórias de Usuário e, posteriormente, a geração de código de teste automatizado. Portanto,
com o thanoS Tool, foi possível evidenciar sua eficácia por meio de uma análise quantitativa,
onde mediu-se os tempos para a geração de códigos de teste utilizando a ferramenta proposta
neste trabalho e uma abordagem manual.
d) Melhorar a usabilidade do protótipo de ferramenta, não foi o foco desse estudo, mas está
aberta para modificação a fim de melhorar a experiência do usuário.
Referências
BARBAGLIA, G.; MURZILLI, S.; CUDINI, S. Definition of rest web services with json
schema. SPE, 2016.
BECK, K.; BEEDLE, M.; BENNEKUM, A. Manifesto for Agile Software Development.
[S.l.: s.n.], 2001.
CHUAN, C.-H.; AGRES, K.; HERREMANS, D. From context to concept: exploring semantic
relationships in music with word2vec. Springer, 2018.
COHN, M. User Stories Applied-For Agile Software Development. [S.l.: s.n.], 2004.
GRAHAM, D.; VANS, I.; BLACK, R. Next Generation Java Testing: TestNG and
Advanced Concepts. [S.l.]: Cédric Beust and Hani Suleiman, 2016.
MOULINIER, J. Natural language processing for online applications: Text retrieval, extraction
and categorization. John Benjamins Publishing, 2nd edition, 2007.
REOLON, C. Tfa: Um método para geração automática de scripts de teste funcional baseado
em userstories. Porto Alegre, 2020.
RICHARDSON, L.; RUBY, S. RESTful Web Services. [S.l.]: O’Reilly Media, 2007.
SALMAN, A. Test case generation from specifications using natural language processing.
KTH ROYAL INSTITUTE OF TECHNOLOGY, 2020.
SCHWABER, K.; BEEDLE, M. Agile software development with scrum. Prentice-Hall, 2002.
SINGH, A.; SHARMA, S. Functional test cases generation based on automated generated use
case diagram. International Journal of Innovative Research in Advanced Engineering,
2015.