Executando testes pelo neovim, utilizando vim-test e localrc.vim

Utilizar Docker para provisionamento do ambiente de desenvolvimento, é algo bem comum no dia a dia de pessoas desenvolvedoras. Além do Docker, uma parte considerável destas pessoas utilizam algum sistema operacional Linux. Este ambiente, em geral, é composto por:

  1. um editor de texto ou IDE, para manipulação do código-fonte.
  2. um terminal, aonde é possivel interagir com o Docker, acessar os containers criados, acompanhar o log das aplicações, entre outras atividades.

Quando falamos de aplicações que rodam em containers, o comum é que os testes destas aplicações também sejam executadas em um container. O fluxo de trabalho, de modo geral, funciona assim:

  1. a pessoa faz uma alteração no código-fonte, em sua IDE/editor de preferência;
  2. a pessoa acessa o container da aplicação;
  3. a pessoa roda os testes, ou do projeto inteiro, ou dos arquivos que alterados;

Quando a pessoa desenvolvedora utiliza neovim como ferramenta para edição de texto, existem algumas formas de simplificar esse fluxo de execução dos testes. Uma forma bastante utilizada, é abrir um :terminal em um split . Dessa forma é possível visualizar o código e executar os testes, sem sair do editor.

testes no terminal

Uma alternativa mais elegante, é executar os testes a partir do neovim, automatizando o acesso ao container e a execução dos testes, a partir de uma combinação do plugin vim-test e da funcionalidade localrc.vim.

vim-test

vim-test é um plugin para vim/neovim que permite executar testes diretamente pelo editor. O plugin identifica automaticamente a linguagem de programação, e a partir disso utiliza estratégias específicas para execução dos testes. Para um arquivo python, por exemplo, o vim-test irá utilizar bibliotecas como pytest e poetry. O plugin permite executar testes de arquivos específicos, ou da suite completa. Para mais informações, acesse a documentação do plugin.

localrc.vim

localrc.vim é um script nativo para vim/neovim, que permite ao usuário definir configurações especificas por projeto. Ao criar um arquivo .local.vimrc na raiz do repositório, o neovim irá carrega-lo, e utilizar suas configurações para o projeto em questão. Caso você trabalhe em diferentes projetos e precise que o vim se comporte de maneira diferente em cada um deles, este plugin pode ser uma boa opção.

Executando testes diretamente no Docker

Com o vim-test podemos definir uma estratégia para executar testes a partir do neovim, e com o localrc.vim podemos definir como o neovim deve se conectar ao Docker, e executar os testes definidos pelo vim-test. Você pode instalar o vim-test utilizando algum gerenciador de pacotes, como o Plug.

O primeiro passo, é informar ao vim-test que a nossa estratégia de testes será a opção neovim. Essa estratégia executa o teste utilizando o terminal imbutido do editor.

let test#strategy = "neovim"

O segundo passo, é adicionar uma configuração específica para o projeto, que irá executar o teste selecionado pelo vim-test dentro do container do projeto. Para alterar como o vim-test executa um teste, podemos utilizar o conceito de transformation. Uma transformation permite customizar o comando padrão gerado pelo vim-test, para executar os testes. O interessante aqui, é que podemos implementar esta customização no arquivo .local.vimrc. Ou seja, podemos customizar como o vim-test executa os testes conforme as necessidades do projeto. No meu caso, eu estou executando os testes de um projeto django, que é disponibilizado localmente via Docker-compose up.

function! DockerTransform(cmd) abort
  return "docker exec --user=root -it  server /bin/bash ".'-c "source /root/.bashrc && "'.shellescape(a:cmd)
endfunction

let g:test#custom_transformations = {'docker': function('DockerTransform')}
let g:test#transformation = 'docker'

Para customizar o comando de teste, precisamos declarar uma função em vimL. Esta função recebe como argumento a variável cmd, que é o comando gerado pelo vim-test para executar os testes. A nossa função irá conectar no container e executar os testes. A implementação da função de transformação vai depender das particularidades do projeto. Com tudo configurado, podemos executar o comando TestFile ou TestSuite, e os testes serão executados no container definido na função de transformação.

testes com vim-test

Para simplificar ainda mais a execução dos testes, podemos mapear os comandos TestFile e TestSuite. No meu caso eu utilizo o tecla virgula, como <LEADER>. Defini então dois maps para executar os testes:

map <LEADER>tf :TestFile<CR>
map <LEADER>ts :TestSuite<CR>

Dessa forma, se quisermos executar os testes de um único arquivo, basta digitar ,tf, e para executar todos os testes do projeto, ,ts. Lembre-se de incluir o arquivo .local.vimrc no .gitignore do repositório.