O TestPilot é uma ferramenta para geração automaticamente de testes de unidade para pacotes NPM escritos em JavaScript/TypeScript usando um modelo de idioma grande (LLM).
Observe que o TestPilot representa uma exploração precoce no uso do LLMS para geração de testes e foi disponibilizada em código aberto como base para pesquisa e exploração. Para o dia-a-dia, o uso dos recursos de geração de testes no copiloto é provável que produza melhores resultados.
O Testpilot gera testes para uma determinada função f , solicitando o LLM com um esqueleto de um teste para f , incluindo informações sobre f incorporadas em comentários de código, como sua assinatura, o corpo de f e exemplos de usos de f extraídos automaticamente a partir da documentação do projeto. A resposta do modelo é então analisada e traduzida em um teste de unidade executável. Opcionalmente, o teste é executado e, se falhar, o modelo é solicitado novamente com informações adicionais sobre o teste com falha, dando -lhe a chance de refinar o teste.
Diferentemente de outros sistemas para geração de testes baseada em LLM, o TestPilot não requer nenhum treinamento adicional de treinamento ou reforço, e não são necessários exemplos de funções e seus testes associados.
Um artigo de pesquisa que descreve o TestPilot em detalhes está disponível no ARXIV e IEEEXPLORE.
Em geral, para poder executar o TestPilot, você precisa acessar um LLM no estilo Codex com API de conclusão. Defina a variável de ambiente TESTPILOT_LLM_API_ENDPOINT no URL do ponto de extremidade da API LLM que você deseja usar e TESTPILOT_LLM_AUTH_HEADERS em um objeto JSON que contém os cabeçalhos necessários para se autenticar com a API.
Os valores típicos para essas variáveis podem ser:
TESTPILOT_LLM_API_ENDPOINT='https://api.openai.com/v1/engines/code-cushman-001/completions'TESTPILOT_LLM_AUTH_HEADERS='{"Authorization": "Bearer <your API key>", "OpenAI-Organization": "<your organization ID>"}'Observe, no entanto, que você pode executar o TestPilot no modo de reprodução sem acesso à API LLM, onde as respostas do modelo são retiradas da saída de uma execução anterior; Veja abaixo para obter detalhes.
Você pode instalar o TestPilot a partir de um pacote pré-construído ou a partir da fonte.
O TestPilot está disponível como um pacote NPM pré-criado, embora atualmente não seja publicado no Registro da NPM. Você pode baixar um tarball do repositório e instalá -lo da maneira usual. Observe que essa distribuição contém apenas a parte central do testpilot, não o chicote de benchmarking.
O diretório src/ contém o código -fonte do TestPilot, que está escrito no TypeScript e é compilado no dist/ Diretório. Os testes estão em test/ ; O benchmark/ diretório de benchmark contém um chicote de benchmarking para executar o teste de teste em vários pacotes NPM; e ql/ contém as consultas CodeQL usadas para analisar os resultados.
No diretório raiz de uma compra deste repositório, execute npm build para instalar dependências e criar o pacote.
Você também pode usar npm run build:watch para criar automaticamente sempre que fizer alterações no código. Observe, no entanto, que isso não instalará automaticamente dependências e também não criará o arnês de benchmarking.
Use npm run test para executar os testes. Por conveniência, isso também instalará dependências e executará uma construção.
Se você instalar o TestPilot a partir da fonte, poderá usar o chicote de benchmarking para executar o testpilot em vários pacotes e analisar os resultados. Atualmente, isso não está disponível se você instalar o TestPilot a partir de um pacote pré-construído.
O uso básico é o seguinte:
node benchmark/run.js --outputDir < report_dir > --package < package_dir > Isso gera testes para todas as funções exportadas pelo pacote em <package_dir> , os valida e grava os resultados para <report_dir> .
Observe que isso pressupõe que as dependências do pacote sejam instaladas e quaisquer etapas de construção foram executadas (por exemplo, usando a compilação npm i e npm run build ). O TestPilot também depende do mocha ; portanto, se o pacote em teste ainda não depender, você deverá instalá-lo separadamente, por exemplo, usando o comando npm i --no-save mocha .
O fluxo de trabalho run-experiment.yml executa um experimento sobre ações do GitHub, produzindo o relatório final como um artefato que você pode baixar. O artefato results-all contém os resultados de todos os pacotes, enquanto os outros artefatos contêm os resultados individuais de cada pacote.
Os resultados do testPilot não são determinísticos, portanto, mesmo se você o executar do mesmo pacote na mesma máquina várias vezes, você obterá resultados diferentes. No entanto, o chicote de benchmarking registra dados suficientes para poder reproduzir uma referência em muitos casos.
Para fazer isso, use as opções --api e --responses para reutilizar as listagens e respostas da API de uma execução anterior:
node benchmark/run.js --outputDir < report_dir > --package < package_dir > --api < api.json > --responses < prompts.json >Observe que, por padrão, a reprodução falhará se algum dos prompts não for encontrado no arquivo de respostas. Isso normalmente acontece se o testpilot estiver refinando os testes de falha, pois neste caso o prompt para o modelo depende da mensagem de falha exata, que pode ser específica do sistema (por exemplo, contendo caminhos do sistema de arquivo local) ou depender da versão node.js ou outros fatores.
Para contornar essas limitações, você pode passar o --strictResponses false Flag Handle Treat O tratamento de promotos ausentes, tratando -os como não obtendo resposta do modelo. Em geral, isso não produzirá os mesmos resultados da execução inicial, mas é suficiente em muitos casos.
As consultas CodeQL em ql/queries podem ser usadas para analisar os resultados da execução de um experimento. Consulte ql/CodeQL.md para obter instruções sobre como configurar o CodeQL e executar as consultas.
Este projeto está licenciado nos termos da licença de código aberto do MIT. Consulte o MIT para os termos completos.
O TestPilot é um protótipo de pesquisa e não é oficialmente apoiado. No entanto, se você tiver dúvidas ou comentários, registre um problema e faremos o possível para responder.
Agradecemos a Aryaz Eghbali (@aryaze) por seu trabalho na versão inicial do TestPilot.