Use este identificador para citar ou linkar para este item: http://repositorio.utfpr.edu.br/jspui/handle/1/38992
Título: Vocabulário de testes instáveis entre linguagens de programação
Título(s) alternativo(s): Vocabulary of flaky tests across programming languages
Autor(es): Soratto, Rafael Rampim
Orientador(es): Silva, Marco Aurélio Graciotto
Palavras-chave: Inovações tecnológicas
Engenharia de software
JavaScript (Linguagem de programação de computador)
Python (Linguagem de programação de computador)
Java (Linguagem de programação de computador)
Technological innovations
Software engineering
JavaScript (Computer program language)
Python (Computer program language)
Data do documento: 4-Abr-2025
Editor: Universidade Tecnológica Federal do Paraná
Câmpus: Campo Mourao
Citação: SORATTO, Rafael Rampim. Vocabulário de testes instáveis entre linguagens de programação. 2025. Dissertação (Mestrado em Ciência da Computação) - Universidade Tecnológica Federal do Paraná, Campo Mourão, 2025.
Resumo: Contexto: O teste de regressão é uma atividade de verificação e validação de sistemas presente na engenharia de software moderna. Nesta atividade, testes podem falhar sem nenhuma alteração de implementação, caracterizando-se como testes instáveis (flaky test). Este tipo de instabilidade pode atrasar o lançamento do software e reduzir a confiança dos testes. Uma forma de identificar tais testes instáveis é pela reexecução dos testes, mas isso possui um custo computacional elevado. Uma alternativa à reexecução é a análise estática do código dos casos de teste, identificando padrões relacionados à instabilidade. Nesse contexto, por enquanto observam-se apenas trabalhos de vocabulário que abordam aplicações de linguagens únicas (Java, Python, Javascript). Para conhecer os limites e possibilidades dessa abordagem, é interessante verificar a intersecção de vocabulários instáveis entre diferentes linguagens. Objetivo: O objetivo deste trabalho foi avaliar a técnica de vocabulário para predição de testes instáveis de aplicações Javascript, Java e Python. Método: Para atingir tal objetivo foi construído um conjunto de dados com casos de teste instáveis presentes em projetos de código aberto no Github que utilizam Javascript, e também foram utilizados conjuntos de dados de trabalhos anteriores para Python e Java. A seguir foram criados modelos de classificação, considerando o vocabulário de instabilidade entre diferentes projetos e linguagens. Após avaliar a precisão dos modelos, verificamos as palavras com maior ganho de informação para predição de instabilidade entre linguagens. Resultados: Criamos a ferramenta ShakerJS que conseguiu identificar 102 flaky tests em 36% de 36 projetos relevantes em JavaScript utilizando o estresse de CPU e memória. Os termos com maior ganho de informação para predição de flaky tests neste conjunto foram: await, async, if e path. Em JavaScript, semelhantemente ao Java, o modelo Random Forest (RF) teve a melhor precisão (0,96), enquanto o modelo Decision Tree (DT) superou ligeiramente o RF em termos de recall (0,77 vs 0,63). Os resultados são melhores quando o modelo é treinado e testado no mesmo escopo de projeto e linguagem. Alguns projetos chegam a alcançar resultados de 100% de precisão e recall. Verificamos que a qualidade dos modelos em relação às falhas intermitentes totalmente desconhecidas é baixa. Verificamos a baixa qualidade dos modelos em relação às falhas intermitentes de diferentes linguagens de programação: JavaScript, Java e Python. O melhor resultado foi para o modelo treinado na linguagem JavaScript e testado na linguagem Java, que apresentou o F1-Score (F1) de 0.63. Porém, no que diz respeito ao vocabulário instável entre linguagens os resultados são positivos. Entre as linguagens de programação Python e JavaScript podemos verificar termos relacionados com as seguintes causas raízes de flaky tests: comunicação assíncrona (await, 400, data), concorrência, eventos de interface gráfica do Usuário (plot, page, button, click e width, dependência de Tempo (time), vazamentos de Recursos (source, data, args). Entre as linguagens Java e JavaScript, podemos verificar a intersecção de termos relacionados a concorrência (manager), espera assíncrona (await) e vazamentos de Recursos (new, class). Entre as linguagens Python e Java, podemos verificar termos relacionados com comunicação assíncrona (waitFor), concorrência (get, select), dependência de Tempo (date), vazamentos de recursos (evaluate, catch). Conclusões: Este trabalho apresenta resultados relevantes para uma identificação mais eficiente de testes instáveis em projetos que utilizam Javascript, Java e Python. Existe uma intersecção entre contextos e causas raízes de instabilidades de diferentes projetos e linguagens. Porém, utilizar somente o conteúdo puro do código-fonte pode reduzir o desempenho dos modelos de predição em um cenário com diferentes projetos e linguagens.
Abstract: Context: Regression testing is a verification and validation activity of systems present in modern software engineering. In this activity, tests may fail without any implementation changes, characterizing them as unstable tests (flaky test). This type of instability can delay software release and reduce confidence in the tests. One way to identify such unstable tests is through test re-execution, but this comes with a high computational cost. An alternative to re-execution is static code analysis of the test cases, identifying patterns related to instability. In this context, so far, only vocabulary-based works focusing on single language applications (Java, Python, JavaScript) have been observed. To understand the limits and possibilities of this approach, it is interesting to check the intersection of unstable vocabularies across different languages. Objective: The objective of this work was to evaluate the vocabulary technique for predicting unstable tests in JavaScript, Java, and Python applications. Method: To achieve this objective, a dataset was constructed with unstable test cases present in open-source projects on GitHub that utilize JavaScript and the dataset from previous works for Python and Java was used. Classification models were then created, considering the instability vocabulary between different projects and languages. After evaluating the models’ accuracy, we examined the words with the highest information gain for predicting instability across languages. Results: We created the ShakerJS tool, which managed to identify 102 flaky tests in 36% of 36 relevant projects in JavaScript using CPU and memory stress. The terms with the highest information gain for predicting flaky tests in this set were: await, async, if, and path. In JavaScript, similarly to Java, the RF model had the best accuracy (0.96), while the DT model slightly surpassed RF in terms of recall (0.77 vs 0.63). The results are better when the model is trained and tested within the same project scope and language. Some projects achieve results of 100% accuracy and recall. We noted that the quality of the models concerning completely unknown intermittent failures is low. We observed the low quality of the models regarding intermittent failures across different programming languages: JavaScript, Java, and Python. The best result was for the model trained in JavaScript and tested in Java, which presented an F1 of 0.63. However, regarding the unstable vocabulary across languages, the results are positive. Between the programming languages Python and JavaScript, we can find terms related to the following root causes of flaky tests: asynchronous communication (await, 400, data), concurrency, graphical user interface events (plot, page, button, click, and width), time dependency (time), and resource leaks (source, data, args). Between the Java and JavaScript languages, we can verify the intersection of terms related to concurrency (manager), asynchronous waiting (await), and resource leaks (new, class). Between the Python and Java languages, we can find terms related to asynchronous communication (waitFor), concurrency (get, select), time dependency (date), and resource leaks (evaluate, catch). Conclusions: This work presents relevant results for a more efficient identification of unstable tests in projects that utilize JavaScript, Java, and Python. There is an intersection between contexts and root causes of instabilities from different projects and languages. However, using only the pure content of the source code may reduce the performance of prediction models in a scenario with different projects and languages.
URI: http://repositorio.utfpr.edu.br/jspui/handle/1/38992
Aparece nas coleções:CM - Programa de Pós-Graduação em Ciência da Computação

Arquivos associados a este item:
Arquivo Descrição TamanhoFormato 
vocabulariotesteslinguagensprogramacao.pdf1,26 MBAdobe PDFThumbnail
Visualizar/Abrir


Este item está licenciada sob uma Licença Creative Commons Creative Commons