por Juan Altmayer Pizzorno e Emery Berger no laboratório PLASMA da UMass Amherst.
CoverUp gera automaticamente testes que garantem que mais código seja testado (ou seja, aumenta a cobertura do código). CoverUp também pode criar um conjunto de testes do zero, caso você ainda não tenha um. Os novos testes são baseados no seu código, o que os torna úteis para testes de regressão.
CoverUp foi projetado para funcionar em estreita colaboração com a estrutura de teste pytest. Para gerar testes, primeiro mede a cobertura da sua suíte usando SlipCover. Em seguida, ele seleciona partes do código que precisam de mais testes (ou seja, código que é descoberto). CoverUp então inicia uma conversa com um LLM, solicitando testes, verificando os resultados para verificar se eles funcionam e aumentam a cobertura (novamente usando SlipCover) e solicitando novamente ajustes conforme necessário. Por fim, o CoverUp verifica opcionalmente se os novos testes se integram bem, tentando resolver quaisquer problemas encontrados.
Para obter detalhes técnicos e uma avaliação completa, consulte nosso artigo arXiv, CoverUp: Coverage-Guided LLM-Based Test Generation (PDF).
CoverUp está disponível no PyPI, então você pode instalar simplesmente com
$ python3 -m pip install coverup
CoverUp pode ser usado com modelos OpenAI, Anthropic ou AWS Bedrock; requer que os detalhes de acesso sejam definidos como variáveis de ambiente shell: OPENAI_API_KEY
, ANTHROPIC_API_KEY
ou AWS_ACCESS_KEY_ID
/ AWS_SECRET_ACCESS_KEY
/ AWS_REGION_NAME
, respectivamente.
Por exemplo, para OpenAI você criaria uma conta, garantiria que ela tivesse um saldo positivo e então criaria uma chave de API, armazenando sua "chave secreta" (geralmente uma string começando com sk-
) em uma variável de ambiente chamada OPENAI_API_KEY
:
$ export OPENAI_API_KEY= < ...your-api-key... >
Se o seu módulo se chama mymod
, suas fontes estão em src
e os testes em tests
, você pode executar CoverUp como
$ coverup --source-dir src/mymod --tests-dir tests
CoverUp então cria testes chamados test_coverup_N.py
, onde N
é um número, no diretório tests
.
Aqui temos CoverUp para criar testes adicionais para o popular pacote Flask:
$ coverup --package src/flask --tests tests
Measuring coverage... 90.9%
Prompting gpt-4o-2024-05-13 for tests to increase coverage...
(in the following, G=good, F=failed, U=useless and R=retry)
100%|███████████████████████████████████████| 92/92 [01:01<00:00, 1.50it/s, G=55, F=122, U=20, R=0, cost=~$4.19]
Measuring coverage... 94.4%
$
Em pouco mais de um minuto, CoverUp aumenta a cobertura de teste do Flask de 90,9% para 94,4%.
Ao avaliar cada teste recém-gerado, o CoverUp o executa várias vezes na tentativa de detectar quaisquer testes instáveis; que pode ser ajustado com as opções --repeat-tests
e --no-repeat-tests
. Se o CoverUp detectar que um teste recém-gerado é instável, ele solicitará uma correção ao LLM.
CoverUp apenas adiciona testes ao conjunto que, quando executados sozinhos, passam e aumentam a cobertura. Porém, é possível que os testes “poluam” o estado, alterando-o de uma forma que faça com que outros testes falhem. Por padrão, CoverUp usa o plugin pytest-cleanslate para isolar testes, contornando qualquer poluição de teste (na memória); que pode ser desativado passando a opção --no-isolate-tests
. CoverUp também pode ser solicitado a encontrar e desabilitar o módulo ou função de teste poluente ( --disable-polluting
) ou simplesmente desabilitar quaisquer testes com falha (``--disable-failing`).
Para avaliar os testes gerados pelo LLM, o CoverUp deve executá-los. Para melhor segurança e minimizar o risco de danos ao seu sistema, recomendamos executar CoverUp com Docker.
O gráfico mostra o CoverUp em comparação com o CodaMosa, um gerador de teste baseado em pesquisa de última geração baseado no gerador de teste Pynguin. Para este experimento, tanto o CoverUp quanto o CodaMosa criaram testes “do zero”, ou seja, ignorando qualquer conjunto de testes existente. As barras mostram a diferença na porcentagem de cobertura entre CoverUp e CodaMosa para vários módulos Python; barras verdes, acima de 0, indicam que o CoverUp obteve maior cobertura.
Como mostra o gráfico, CoverUp atinge maior cobertura do que CodaMosa para a maioria dos módulos.
Este é um lançamento antecipado do CoverUp. Por favor, aproveite e perdoe quaisquer interrupções enquanto trabalhamos para melhorá-lo. Aceitamos relatórios de bugs, relatórios de experiência e solicitações de recursos (abra um problema).