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 dentro do container a partir do neovim. Para isso precisamos combinar o plugin vim-test com o script 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

Sabemos que o vim-test indentifica automaticamente a linguagem de programação e a partir dela define a estratégia para executar os testes. Essa estratégia precisa ser executada dentro de um container Docker, o que será feito pelo localrc.vim. 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 embutido do editor. Para mais opções de estratégia, acesse a documentação do vim-test.

let test#strategy = "neovim"

O segundo passo é criar o arquivo .local.vimrc, que irá executar a estratégia definida pelo vim-test dentro do container. Para alterar aonde o vim-test executa os testes podemos utilizar o conceito de transformation. Uma transformation permite customizar o comando gerado pelo vim-test. Essa customização deve ser implementada no arquivo .local.vimrc. Ou seja, podemos customizar aonde o vim-test executa os testes conforme as necessidades do projeto, já que cada projeto pode ter um .local.vimrc diferente. No meu caso, eu estou executando os testes de um projeto django, que é disponibilizado localmente via docker-compose up. Nossa transformation ficará da seguinte forma:

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.