thiagocosta.py

Programming, Management etc


  • mock , django , python

Mocks - Testes que passam, mas que deveriam falhar

Existe coisa pior do que não confiar na sua suite de testes? Se você não pode confiar nela nem para acusar que algo que funcionava parou de funcionar, qual o propósito de mantê-la?

O uso incorreto de mocks pode contribuir muito com a existência de testes que passam ao serem executados, mas que na verdade deveriam falhar.

Para entedermos melhor, considere o exemplo abaixo:

@mock.patch('services.foo')
def test_something(self, mock_foo):
    mock_foo.assert_called_with(arg1)

Veja que nesse teste a função "foo" está sendo mockada e há um assert para testar se ela está sendo chamada com apenas 1 argumento. Considere agora que essa função foi alterada e passou a ter 2 argumentos. Mesmo com essa diferença de número de argumentos entre o mock e a implementação real, o teste continuará passando quando na verdade deveria acusar uma falha!

A solução pra esse problema é muito simples, basta passar o parâmetro "autospec" no decorator @mock.patch. Ex:

@mock.patch('services.func', autospec=True)
def test_something(self, mock_func):
    mock_func.assert_called_with(arg1)

Se executássemos a suite de testes, veríamos que agora esse teste lança uma exception.

Regra simples então. Toda vez que precisar usar mock para testar se uma função está sendo chamada com os argumentos corretos, use o autospec=True, ok?

Thiago Costa

Desenvolvedor apaixonado orientado à melhoria contínua (kaizen), agente de mudanças e praticante de métodos ágeis, morando no Rio de Janeiro.

comments powered by Disqus