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:
- um editor de texto ou IDE para manipulação do código-fonte.
- 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:
- a pessoa faz uma alteração no código-fonte em sua IDE/editor de preferência;
- a pessoa acessa o container da aplicação;
- 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.
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.
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.