iatest
Version:
Ferramenta de terminal para gerar testes automatizados usando OpenAI.
234 lines (171 loc) • 6.76 kB
Markdown
# Ferramenta para geração de testes automatizados usando IA 🚀
**iatest** é uma ferramenta de terminal que gera testes automatizados para seu código JavaScript usando **OpenAI** ou **Groq**. Basta fornecer um arquivo JavaScript, e o iatest criará um arquivo de teste correspondente, pronto para ser usado com **Jest**.
Atualmente, o iatest suporta apenas **Node.js** e gera testes usando o framework **Jest**. No entanto, nosso objetivo é expandir a ferramenta para suportar mais bibliotecas de teste (como Mocha, Ava, etc.) e outras plataformas (como Python, Java, etc.). Contribuições são bem-vindas! Se você quiser ajudar, confira as orientações no final deste README.
---
## Instalação
Instale o globalmente via npm:
```markdown
npm install -g iatest
```
---
## Como Usar
### 1. Configure suas Chaves de API
Crie um arquivo `.env` no diretório onde você deseja usar a ferramenta e adicione sua chave da **OpenAI** ou **Groq**:
```env
OPENAI_API_KEY=sua_chave_aqui
# OU
GROQ_API_KEY=sua_chave_aqui
```
> **Nota:** Se você não tem uma chave da OpenAI, crie uma em [OpenAI](https://platform.openai.com/).
> Se você não tem uma chave da Groq, crie uma em [Groq](https://console.groq.com/).
### 2. Execute a Ferramenta
Use o comando `iatest` passando o caminho do arquivo JavaScript que deseja testar:
```bash
iatest ./caminho/para/seu/arquivo.js
```
### 3. Resultado
Um arquivo de teste será gerado no mesmo diretório do arquivo original. Por exemplo, se o arquivo for `crud.js`, o arquivo de teste será `crud.test.js`.
---
## Exemplo Prático
### Arquivo de Entrada (`crud.js`)
```javascript
let dados = []; // Array para armazenar os dados em memória
let proximoId = 1; // Contador para gerar IDs únicos
// Função para criar um novo item
function criar(nome) {
if (!nome) {
throw new Error('O nome é obrigatório.');
}
const novoItem = { id: proximoId++, nome };
dados.push(novoItem);
return novoItem;
}
// Função para ler um item pelo ID
function ler(id) {
const item = dados.find(item => item.id === id);
if (!item) {
throw new Error('Item não encontrado.');
}
return item;
}
// Função para atualizar um item pelo ID
function atualizar(id, novosDados) {
const item = dados.find(item => item.id === id);
if (!item) {
throw new Error('Item não encontrado.');
}
if (novosDados.nome) {
item.nome = novosDados.nome;
}
return item;
}
// Função para deletar um item pelo ID
function deletar(id) {
const index = dados.findIndex(item => item.id === id);
if (index === -1) {
throw new Error('Item não encontrado.');
}
const [itemRemovido] = dados.splice(index, 1);
return { ...itemRemovido, status: 'deletado' };
}
// Função para listar todos os itens
function listar() {
return dados;
}
// Função para buscar itens por nome
function buscarPorNome(nome) {
return dados.filter(item => item.nome.toLowerCase().includes(nome.toLowerCase()));
}
module.exports = { criar, ler, atualizar, deletar, listar, buscarPorNome };
```
### Comando no Terminal
```bash
iatest ./src/crud.js
```
### Arquivo de Saída (`crud.test.js`)
```javascript
const { criar, ler, atualizar, deletar, listar, buscarPorNome } = require('./crud');
const { describe, it, expect } = require('@jest/globals');
describe('CRUD Operations', () => {
describe('criar', () => {
it('deve criar um novo item com um nome válido', () => {
const item = criar('Item 1');
expect(item).toHaveProperty('id');
expect(item.nome).toBe('Item 1');
});
it('deve lançar um erro ao criar um item sem nome', () => {
expect(() => criar('')).toThrow('O nome é obrigatório.');
});
});
describe('ler', () => {
it('deve retornar um item existente pelo id', () => {
const itemCriado = criar('Item 2');
const itemLido = ler(itemCriado.id);
expect(itemLido).toEqual(itemCriado);
});
it('deve lançar um erro ao tentar ler um item não existente', () => {
expect(() => ler(999)).toThrow('Item não encontrado.');
});
});
describe('atualizar', () => {
it('deve atualizar um item existente com dados válidos', () => {
const itemCriado = criar('Item 3');
const itemAtualizado = atualizar(itemCriado.id, { nome: 'Item 3 Atualizado' });
expect(itemAtualizado.nome).toBe('Item 3 Atualizado');
});
it('deve lançar um erro ao tentar atualizar um item não existente', () => {
expect(() => atualizar(999, { nome: 'NaoExistente' })).toThrow('Item não encontrado.');
});
});
describe('deletar', () => {
it('deve deletar um item existente pelo id', () => {
const itemCriado = criar('Item 4');
const itemDeletado = deletar(itemCriado.id);
expect(itemDeletado.status).toBe('deletado');
});
it('deve lançar um erro ao tentar deletar um item não existente', () => {
expect(() => deletar(999)).toThrow('Item não encontrado.');
});
});
describe('listar', () => {
it('deve listar todos os itens', () => {
criar('Item 5');
const lista = listar();
expect(lista.length).toBeGreaterThan(0);
});
});
describe('buscarPorNome', () => {
it('deve retornar itens que correspondem ao nome fornecido', () => {
criar('BuscaTeste');
const resultados = buscarPorNome('Busca');
expect(resultados.length).toBeGreaterThan(0);
});
it('deve retornar uma lista vazia se nenhum item corresponde ao nome', () => {
const resultados = buscarPorNome('NaoExistente');
expect(resultados.length).toBe(0);
});
});
});
```
---
## Expansão Futura e Contribuições
Atualmente, o **iatest** suporta apenas **Node.js** e gera testes usando o framework **Jest**. No entanto, nosso objetivo é expandir a ferramenta para suportar:
- **Mais bibliotecas de teste:** Mocha, Ava, Tape, Junit, etc.
- **Mais plataformas:** Python, Java, Ruby, etc.
Se você quiser contribuir para o projeto, confira as orientações abaixo na seção **Contribuindo**. Sua ajuda é muito bem-vinda! 🚀
---
## Contribuindo
Contribuições são bem-vindas! Siga os passos abaixo:
1. Faça um fork do repositório.
2. Crie uma branch com sua feature (`git checkout -b feature/nova-feature`).
3. Commit suas mudanças (`git commit -m 'Adiciona nova feature'`).
4. Faça push para a branch (`git push origin feature/nova-feature`).
5. Abra um Pull Request.
---
## Licença
Este projeto está licenciado sob a **MIT License**. Veja o arquivo [LICENSE](LICENSE) para mais detalhes.
---
## Contato
Se tiver dúvidas, sugestões ou quiser reportar um problema, entre em contato:
- **Email:** bruno.contatododev@gmail.com
- **GitHub:** [odevbruno](https://github.com/odevbruno)