Aplicação de técnicas de processamento de linguagem natural para ferramenta Pyccuracy

694 visualizações

Publicada em

Artigo que apresenta uma proposta para melhoria da ferramenta Pyccuracy

Publicada em: Tecnologia
0 comentários
1 gostou
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
694
No SlideShare
0
A partir de incorporações
0
Número de incorporações
4
Ações
Compartilhamentos
0
Downloads
16
Comentários
0
Gostaram
1
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Aplicação de técnicas de processamento de linguagem natural para ferramenta Pyccuracy

  1. 1. Aplicação de técnicas de processamento de linguagem natural para ferramenta Pyccuracy Laís Berlatto ¹, Felipe Haack Schmitz¹ 1 Curso de Ciência da Computação – ICEG – Universidade de Passo Fundo (UPF) Campus 1 – BR 285 – Bairro São José – 99.001-970 – Passo Fundo – RS – Brasil 104493@upf.br, 106696@upf.br Abstract:This article has as its main theme of approach two major areas of computer science which are: Software Engineering with focus in the area of Software Quality and Testing and the area of Artificial Intelligence, covering the field of Natural Language Processing.It is proposed to optimize the automation tool acceptance tests called Pyccuracy. To this end we suggest the use of natural language processing rather than the mechanism implemented in the tool to process and convert words in natural language using regular expressions Resumo. Este artigo tem como principal tema de sua abordagem duas grandes áreas da Ciência da Computação que são: a Engenharia de Software com foco na área de Qualidade e Testes de Software e a área da Inteligência Artificial, abordando o ramo de Processamento de Linguagem Natural. Propõe-se uma otimização da ferramenta de automação de testes de aceitação chamada Pyccuracy. Para tanto sugere-se o uso de processamento de linguagem natural ao invés do mecanismo implementado na ferramenta para processar e converter palavras em linguagem natural através de expressões regulares. 1. Introdução O filósofo Nietzsche, no século passado, alertava: "Com o aumento da competição, a qualidade se torna mera propaganda. Vence aquele que melhor engana". Esta receita é atrativa já que é muito simples e fácil de segui-la, entretanto, aquele que toma esse tipo de postura está fadado ao fracasso. Implantar um processo de garantia da qualidade de software não é uma opção a ser estudada, mas sim, parte de uma estratégia de sobrevivência em um mercado cada vez mais exigente. Conclui-se então, que as empresas mais competitivas são aquelas que trabalham sob a ótica da melhoria contínua dos processos para aumentar a qualidade dos métodos de desenvolvimento e, consequentemente, aumentar a qualidade do produto final. Neste contexto, devemos destacar a adoção crescente de ferramentas e técnicas para dar suporte ao processo de melhoria evolutiva, relativa a todas as atividades do ciclo de vida de desenvolvimento de um software, desde sua concepção à até sua implantação. Segundo a Borland, qualidade de software é a convergência entre requisitos completos, o código correto e o mínimo de defeitos – todos alinhados para atingir os objetivos do negócio, e a base de sustentação deste processo são os testes.
  2. 2. Testes de software são elementos críticos da garantia de qualidade de software e representam a última revisão de especificação, projeto e codificação, caracterizam-se por ser o processo que executa o software com a intenção de encontrar erros [Myers, 1979]. Testar um software é uma tarefa meticulosa e bastante complexa e geralmente ela não é realizada de forma sistemática, sem nenhuma base em modelos de garantia de qualidade, muitas vezes devido a uma série de fatores como limitações de tempo, recursos e qualificação técnica dos envolvidos. Outros agravantes para a realização dessa atividade são a alta complexidade dos sistemas sendo desenvolvidos atualmente e a constante necessidade de sua rápida evolução. Dentre as diversas técnicas de teste de software destacam-se os testes funcionais que tem como objetivo medir a qualidade funcional de componentes de um sistema [Molinari, 2010], avaliando-os conforme seu comportamento externo. Quando se realiza um teste funcional está na verdade confrontando com o que se espera que o sistema vá fazer, ou seja, incluindo entrada de dados, processamento e resposta. A automação de teste de software é atualmente a principal maneira para proporcionar a entrega de produtos mais confiáveis em menor tempo [Myers 2004; Fewster 1999; Dustin 2002], e consiste em repassar para o computador tarefas de teste de software que seriam realizadas manualmente, sendo feitas por meio do uso de ferramentas de automação de teste, imitando a interação do ser humano com o software. A partir desta automação, testes de regressão são realizados para verificar se manutenções realizadas no sistema introduziram efeitos colaterais indesejáveis [Pressman 2002]. Os testes de regressão automatizados, além de diminuir drasticamente o tempo total de execução do teste, viabilizam uma cobertura que, de outra forma, não poderia ser realizada em tempo compatível com a necessidade do mercado atual. Atualmente, novos paradigmas de teste surgiram para facilitar e agilizar o ciclo de desenvolvimento de um software. Um exemplo disto é a técnica behavior driven development conhecida como BDD, que possibilita o planejamento, automação, execução e documentação dos testes de forma colaborativa. Empresas como o Yahoo Brasil adotam este tipo de técnica com o uso do framework Pyccuracy. O uso desta ferramenta e técnica propicia a escrita do teste automatizado em uma linguagem próxima da humana, com poucas palavras ubíquas facilitando a automação dos testes e os próprios scripts ficam como documentação. O pyccuracci reconhece as palavras em linguagem natural dentro de um script de teste através do uso de expressões regulares. Inteligência Artificial (IA) é um ramo da ciência da computação que se propõe a elaborar dispositivos que simulem a capacidade humana de raciocinar, perceber, tomar decisões e resolver problemas, enfim, a capacidade de ser inteligente. Para muitos pesquisadores em inteligência artificial, o processamento de linguagem natural é um dos objetivos mais cruciais da IA a ser alcançado, já que possibilita ao computador a
  3. 3. compreensão direta da linguagem natural. Os obstáculos mais difíceis de transpor, nesta área, são o tamanho e a complexidade da linguagem humana [Schildt, 1989]. Entretanto, os benefícios, que uma aplicação que faça o uso de PLN possa acarretar sobrepõem-se aos desafios. A proposta deste artigo visa uma extensão, um aprimoramento da ferramenta livre Piccuraccy no que diz respeito ao reconhecimento, processamento e execução das palavras encontradas em linguagem natural nos scripts de teste, uma vez que estas são reconhecidas através do uso de expressões regulares e um vocábulo previamente definidos e sua execução através de um código-fonte fixo. Este aprimoramento consiste na substituição do uso das expressões regulares e código fixo pelo emprego de processamento de linguagem natural. 2. Qualidade de Software A busca pelo controle e garantia de qualidade é um assunto muito antigo. Egípcios a quatro mil anos atrás estabeleceram um padrão de medida de comprimento, chamado cúbito, que correspondia ao comprimento do braço do faraó reinante, com a ideia de que esta seria a medida perfeita, uma medida real. Naquela época todas as construções deviam ser realizadas utilizando o cúbito como unidade de medida. Caso houvesse um erro de medição, o responsável poderia ser punido com a morte [Juran e Gryna, 1988]. O resultado da preocupação com o rigor pode ser visto nas pirâmides, nas quais os egípcios obtiveram precisões de 0,05 % [Egyptian Organization for Standardization na Quality Control, 2005]. A história da qualidade prosseguiu com inúmeros marcos extraordinários. Fatos contemporâneos, como a criação da ABNT (Associação Brasileira de Normas Técnicas) em 1960 no Brasil e a fundação da ISO (International Standardization Organization) na mesma época, marcam o inicio de um grande movimento que tornou a qualidade hoje, como um objetivo de negócio, seja para conquistar metas como a exportação, ou para, resistir às pressões da concorrência do mercado interno. Sob a perspectiva de software, o assunto de qualidade é bastante extenso. Para cada aspecto do ciclo de vida de um produto, existem diversas técnicas, métodos e ferramentas visando apoiar o negócio. Qualidade de Software segundo a IEEE 629.12- 1990 é o grau para o qual um sistema, componente ou processo vai ao encontro dos requisitos especificados e com expectativas, ou necessidades, dos usuários ou clientes. O processo da qualidade possui três objetivos distintos: melhorar um produto de software (através da prevenção, detecção e remoção de erros), avaliar a qualidade de um produto de software (em relação a metas explicitas de qualidade) e melhorar e rentabilidade a longo prazo do processo de qualidade em si [Pezzé e Young, 2008]. Para alcançar estes objetivos a qualidade de software é apoiada sob três grandes áreas, sendo elas a gestão de configuração, gestão de requisitos e gestão de testes.
  4. 4. Gestão de Configuração: trata da gerencia, controle e registro dos artefatos que compõe o software, incluindo todo o histórico de mudança do software. Gestão de Requisitos: trata da gerencia, controle e registros das necessidades do sistema (requisitos) e dos usuários em todos os níveis, incluindo também a rastreabilidade das necessidades e suas mudanças. Gestão de testes: trata da gerencia, planejamento, controle e execução dos testes em todos os níveis, de modo a garantir a implementação (projeto, desenvolvimento e entrega) das necessidades especificadas. Este trabalho tem por foco a gestão de testes. 3. Testes de Software Segundo a nomenclatura da IEEE, o processo de testes consiste em operar um sistema ou componente sob condições especificadas, observando ou registrando os resultados e avaliando algum aspecto desse sistema ou componente [Paula Filho, 2009]. Conclui-se então que teste é uma atividade na qual um produto, sistema ou componente é executado sob um cenário especificado, com observação e registro dos resultados e avaliação de um ou mais aspectos. Testes são mais do que meios para detecção e correção de erros, são indicadores da qualidade de um produto. Segundo [Glass, 2003], a remoção de defeitos é a parte que mais consome tempo do ciclo de vida de um software. Portanto é importante que testes sejam realizados e de uma forma correta, sendo bem planejados e desenhados, para conseguir o melhor proveito possível dos recursos alocados para ele. Existem muitas maneiras de se testar um software. Apesar dos diversos paradigmas de desenvolvimento completamente diferentes, o objetivo principal destas técnicas continua a ser o mesmo, encontrar falhas no software. Algumas das técnicas mais conhecidas são o teste de caixa-branca e o teste de caixa-preta. O teste de caixa- branca é uma técnica de teste que usa a perspectiva interna do sistema para modelar os casos de teste uma perspectiva interna significa basicamente o código fonte, um exemplo deste tipo de teste seria o teste de sistema. Já o teste de caixa-preta serve para verificar a saída dos dados usando entradas de vários tipos, exemplo deste tipo de teste seriam os testes funcionais, foco deste trabalho. 3.1 Testes Funcionais Teste funcional é uma técnica utilizada para se projetar casos de teste nos quais o programa ou sistema são considerados como uma caixa preta e, para testá-lo, são fornecidas entradas e avaliadas as saídas geradas para verificar se estão em conformidade com os objetivos especificados [Delamaro, Maldonado e Jino, 2007].
  5. 5. O teste funcional avalia o comportamento da aplicação. Dados de entrada são fornecidos, o teste é executado e o resultado obtido é comparado a um resultado esperado previamente conhecido. Quanto mais entradas são fornecidas, mais rico será o teste. Numa situação ideal, todas as entradas possíveis seriam testadas, mas na ampla maioria dos casos isso é impraticável. Uma abordagem mais realista para o teste funcional é escolher um subconjunto de entradas que maximize a riqueza do teste. 3.2 Testes de aceitação O teste de aceitação é a última ação de teste antes da implantação do software e é um tipo de teste funcional. A meta do teste de aceitação é verificar se o software está pronto e pode ser usado pelos usuários finais para executar as funções e as tarefas para as quais foi criado. Este tipo de teste valida a utilidade e satisfação com o produto, sendo executado pelo grupo de testes com o envolvimento do usuário final para verificar a adequação com as necessidades do usuário [Pezzé e Young, 2008]. 4. Automação de testes O teste automatizado aumenta a produtividade e atinge em tempo menor aquilo que é em geral rotineiro no teste, sendo esta a maior razão do uso e disseminação da automação dos testes de software [Molinari, 2010]. Segundo [Grahan e Fewster,1999], existe uma diferença clara entre testes e automação de testes. No primeiro realiza-se a tarefa de testar e na segunda, usa-se um software para imitar a interação humana com o software a ser testado. Sendo assim, [Pezzé e Young, 2008] afirmam que a automação pode melhorar a eficiência de algumas atividades de qualidade e é uma necessidade para a implantação de outras. Afirmam também, que um grau de automação não pode substituir um processo racional e bem organizado de qualidade e que se deve investir em um processo continuo e racional de identificação e instalação de automações visando obter o melhor resultado á medida que a organização , o processo e a tecnologia evoluem. O maior poder da automação de testes está na regressão, pois no momento em que ocorre alguma mudança no software a partir do teste automatizado se é capaz através da regressão assegurar a integridade do sistema, garantindo que aquilo que estava funcionando, continua funcionando. A aplicação dos testes de regressão verifica falhas introduzidas durante a evolução do software. 5. Behavior Driven Development Behavior Driven Development (BDD) é uma técnica de desenvolvimento ágil que visa integrar regras de negocio com linguagens de programação, criada em 2003 por Dan North e tem se expandido bastante nos últimos anos. Possui como foco a linguagem e interações usadas no processo de desenvolvimento de software, fazendo uso de sua língua nativa combinadas com a linguagem ubíqua usada no processo de
  6. 6. desenvolvimento de software. Isso permite que os desenvolvedores foquem em por quê o código deve ser criado, ao invés de detalhes técnicos, e minimiza traduções entre linguagem técnica na qual o código é escrito possibilitando assim que os scripts sirvam também como documentação. No BDD, os testes de aceitação são descritos em linguagens naturais próximas do domínio do negócio usando DSL (Domain Specific Language). Para testes de aceitação usamos DSTL (Domain Specific Test Language). E se estes possuírem formalidade suficiente podem ser interpretados e executados por uma ferramenta especializada. Os testes descritos em linguagem natural são interpretados por ferramentas especializadas que, por sua vez, exercitam o código/API do sistema para demonstrar se o comportamento foi atendido. Figura 1. Exemplificação do funcionamento da técnica BDD Fonte:http://www.slideshare.net/cristianocaetano/tdc-2011-automaode-testes-com-bdd-e- atdd 5. Pyccuracy Pyccuracy é uma ferramenta Behavior-Driven Development escrita em Python usando o Selenium, que visa tornar a escrita de testes de aceitação automatizados mais fácil. Ele melhora a legibilidade dos testes, usando uma linguagem estruturada natural tornando assim os scripts de testes de fácil compreensão, de modo que desenvolvedores e clientes acabam podendo colaborar com os testes. Pyccuracy atualmente suporta múltiplos idiomas, sendo esta uma das maiores metas do Pyccuracy desde o primeiro lançamento, atualmente suporta apenas Inglês e Português. Os testes desenvolvidos nesta ferramenta apresentam características, como facilidade em se escrever e manter os testes, rápida execução e
  7. 7. facilidade de redimensionar os testes. A ferramenta usa expressões regulares para processar e converter a "linguagem natural" para comandos da máquina, sem nenhum tratamento semântico. Um teste Pyccuracy típico seria algo como: As a Google User I want to search Google So that I can test Pyccuracy Scenario 1 - Searching for Hello World Given I go to "http://www.google.com" When I fill "q" textbox with "Hello World" And I click "btnG" button and wait Then I see "Hello World - Google Search" title Figura 2. Exemplo de testes de aceitação escrito com Pyccuracy Fonte:https://github.com/heynemann/pyccuracy/wiki/ 6. Expressões Regulares Segundo [Isidoro, 2008], as expressões regulares (ER) são conceitos abstratos da Teoria da Computação amplamente utilizados nas tarefas de processamento de texto e casamento de padrão e são aplicadas em diversas áreas, tais como, biologia computacional, processamento de sinais, recuperação de textos, reconhecimento de escrita a mão, reconhecimento de padrões, entre outras. Como o próprio nome diz regular vem de algo que não foge a regra, regra no caso definida pelas expressões. Algo que é regular só retorna dois valores, verdadeiro ou falso, não existindo o padrão de meio-termo. Sendo assim podemos fazer verificações utilizando expressões regulares para saber se determinado texto condiz com determinado padrão especificado anteriormente. Entretanto o grande poder das Expressões Regulares pode custar muito caro na performance de uma solução pois consome bastante tempo e memória, tornando a navegação lenta, sendo ideal evitar seu uso se existirem alternativas disponíveis, ainda mais em um contexto que envolve outros tipos de processamento como a execução de
  8. 8. um comando utilizando o framework pyccuracy, sem falar na restrição do vocabulário, que limita os cenários de teste. 7. Inteligência Artificial A inteligência artificial é o estudo de como fazer os computadores realizarem coisas que, no momento, as pessoas fazem melhor [Rich e Knight, 1994]. Segundo [Luger, 2004], a inteligência artificial é advinda do desafio de criar máquinas que possuíssem a capacidade de pensar. E esta seria inteligente se exibisse um comportamento similar ao de um ser humano quando confrontado com um problema análogo [Schildt, 1989]. Com passar do tempo, enquanto explorava os mecanismos do pensamento, a inteligência artificial tornou-se mais pragmática, usando estratégias diferentes para resolver problemas práticos complexos que surgem na aplicação da tecnologia da computação, pelo fato de que se referem a domínios dinâmicos e são difíceis de ser abordados através de uma computação tradicional. Percebeu-se também, que a inteligência é muito mais complexa para ser descrita por uma única teoria. Em vez disso, uma constelação de teorias caracterizam o tema a partir de diferentes níveis de abstração. Em níveis mais baixos, as redes neurais, os algoritmos genéticos e outras formas de computação ajudam o entendimento da adaptação, percepção, corporificação e interação com o mundo físico. Em um nível mais abstrato, projetistas de sistemas especialistas, de agentes inteligentes, de modelos estocásticos e de programas de compreensão de linguagem natural refletem o papel do conhecimento e dos processos sociais na criação, transmissão e sustentação do conhecimento. 8. Processamento de Linguagem Natural A compreensão da linguagem natural é dita como a principal característica de um ser que se diz inteligente, pois ela permite a comunicação entre seres da mesma espécie e consequentemente o seu convívio como uma sociedade o que leva ao aprendizado em conjunto. Essa característica é fundamental em seres inteligentes, pois permite um dos fenômenos de maior complexidade que faz parte da natureza e o qual se tornou um dos principais objetivos dentro da Inteligência Artificial que é a evolução. A linguagem natural é uma das formas mais humanas de manifestação externa da atividade mental [Savadovsky,1988]. No momento em que estudamos a linguagem passamos conhecer mais o mundo. Segundo [Rich e Knight, 1994] podemos testar nossas teorias sobre o mundo se soubermos que sustentação elas dão a nossa tentativa de compreender a linguagem. E, se conseguirmos criar uma modelo computacional de linguagem, teremos uma ferramenta poderosa para comunicação. Entretanto, a compreensão da linguagem natural de forma artificial é algo que envolve grande complexidade visto que esta compreensão não aborda somente a
  9. 9. transmissão das palavras e sim a interpretação de seus significados em relação a contexto geral. 8.2. Princípios de Analisadores Morfológicos e Sintáticos No que diz respeito à implementação de um programa de PLN é preciso analisar os aspectos da linguagem em questão, será analisada a compreensão textual. Por tanto é necessária a utilização de analisadores sintáticos e morfológicos para realização de comparações com as palavras armazenadas na base de conhecimento do programa e organizar as sentenças semanticamente de acordo com os graus de importância de cada expressão. Através da gramática da linguagem a ser analisada e das informações do analisador morfológico, o analisador sintático procura construir árvores de derivação para cada sentença, mostrando como as palavras estão relacionadas. A análise morfológica deve identificar palavras e expressões que estejam isoladas em uma sentença por meio de delimitadores como pontuações e espaços em branco. Dessa forma essas palavras após serem analisadas devem ser classificadas dentro de uma categoria gramatical. Fica claro que o emprego de um analisador morfológico torna-se de grande importância, pois para que um programa possa processar a linguagem natural é necessário que ele compreenda cada uma dessas palavras. A análise sintática depende diretamente da análise morfológica, pois ela fará todo o processo de identificação dos principais aspectos de uma frase, tais como identificar sujeito e predicado, complemento verbal e nominal, termos acessórios, composição e por fim a classificação das orações. Este processo é melhor realizado fazendo uso de expressões livres de contexto, pois são muito úteis no que tange à descrição de gramáticas em linguagem natural. Em geral, são mais poderosas que as regulares, permitindo a representação de linguagens com certo grau de complexidade. O analisador semântico analisa o sentido das estruturas das palavras que foram reagrupadas pelo analisador sintático, uma vez que o analisador morfológico permitiu identificar estas palavras individualmente. A análise pragmática consiste em fazer uma interpretação do todo e não mais analisar o significado de suas partes, do ponto de vista léxico e gramatical. As ligações anafóricas e de outros fenômenos de referência merecem resolução, comentários sarcásticos, crenças e contextos são fatores que interferem uma resolução semântica. 9. Considerações Finais O Pyccuracy é uma ferramenta desenvolvida para melhorar legibilidade, desempenho, reuso e capacidade de refatoração dos testes de aceitação. Dentro da perspectiva de
  10. 10. processamento de linguagem natural poderia ser otimizada fazendo uso de gramáticas livres de contexto para processar e converter a linguagem natural, isto em relação a sua análise sintática, e adotando também, métodos de análise semântica, adquirindo assim uma melhor capacidade de representação e aumento das possibilidades dos cenários de teste. 10. Referências GEORGE F. LUGER, Inteligência Artificial Estruturas e Estratégias Para a Solução de Problemas Complexos, 4.ed. Porto Alegre: Bookmann 2004, tradução Paulo Engel. FABIO ABREU DIAS DE OLIVEIRA, Processamento de linguagem natural: princípios básicos e a implementação de um analisador sintático de sentenças da língua portuguesa, UFRGS Instituto de Informática. KOSCIANSKI, A., Soares, M. S.. Qualidade de Software. Editora Novatec, Segunda Edição, 2007. SAVADOVSKY, P. A construção de interpretadores para linguagem natural. Edição EBAI, 1988. MOLINARI, Leonardo. Gerência de Configuração - Técnicas e Práticas no Desenvolvimento do Software, Editora Visual Books, 2007, Florianópolis, 85-7502- 210-5. MOLINARI, Leonardo. Testes de Software - Produzindo Sistemas Melhores e Mais Confiáveis, Editora Èrica, 2006, 3a Edição, São Paulo. PRESSMAN, R. S. Engenharia de Software. McGraw Hill, 2002 MOLINARI, Leonardo. Teste de Software. Produzindo Sistemas Melhores e Mais Confiáveis. 1. ed. São Paulo: Érica, 2003. [RIC 93] RICH, E.; KNIGHT, K. Inteligência Artificial. Makron Books, 1993, 722p. ISIDORO, C.R.G. Uma abordagem quântica para o uso de expressões regulares. Campina Grande, 2008. BARTIÉ, A. Garantia da Qualidade de Software. Elsevier, 2002. MOLINARI, Leonardo. Inovação e Automação de Testes de Software. São Paula: Editora Érica LTDA, 2010. PEZZÉ, M.; YOUNG, M. Teste e Análise de Sofware: processos, princípios e técnicas. Porto Alegre: Bookman, 2008.
  11. 11. ROCHA, A. R., MALDONADO, J. C., WEBER, K. C. Qualidade de Software Teoria e Prática. São Paulo: Pearson, 2004. PRESSMAN, R. S. Engenharia de Software. McGraw Hill, 2002.

×