Como mover os exemplos de doctest do Python para outra estrutura de teste de unidade?

5

Anos atrás, AFAIK, o matemático e desenvolvedor de software Tim Peters, descobriu que muitas vezes a documentação de APIs tende a ficar desatualizada durante o ciclo de vida do software, porque os comentários documentando a API são frequentemente ignorados quando os recursos são adicionados ou assinaturas de chamadas de funções ou métodos mudam.

Para resolver este problema, ele inventou o módulo doctest, que introduz de alguma forma " documentação executável " ou " teste alfabetizado " (veja também: documentação doctest ).

Como já foi apontado em outro lugar , colocando uma enorme quantidade de testes de unidade nas strings de doc de todos os módulos, funções, classes e métodos do Python iria sobrecarregar muito a documentação da API.

Então, estou procurando uma maneira elegante e inteligente de mover os casos de testes que costumavam ser exemplos mais atestados para algum outro local onde eles ainda pudessem ser encontrados por algum driver de teste de unidade.

    
por pefu 18.12.2015 / 15:16
fonte

1 resposta

6

How to move Python doctest examples into another unit test framework?

Os documentos são da seguinte forma:

def testable_func():
    """
    >>> testable_func()
    'foo'
    """

E os testes unitários, usando o módulo unittest incorporado, são da seguinte forma:

def test_testable_func(self):
    self.assertEquals(testable_func(), 'foo')

Há uma seção na documentação sobre a reutilização do código de teste antigo que diz:

In some cases, the existing tests may have been written using the doctest module. If so, doctest provides a DocTestSuite class that can automatically build unittest.TestSuite instances from the existing doctest-based tests.

Mas isso só executa os doctests como testes unitários. Não cria um scaffold de código de teste unitário pré-escrito. Se você quiser deixar seus doctests no lugar, você pode usar isso para executá-los em conjunto com outros testes de unidade.

Mantendo os doctests

Você pode usar os doctests preexistentes, se quiser mantê-los como estão, com o módulo unittest, ( veja a documentação ), você só precisa colocar esta função onde você executa seus testes unitários. Claro que você precisará importar o módulo no qual os doctests estão:

import my_module_with_doctests

def load_tests(loader, tests, ignore):
    tests.addTests(doctest.DocTestSuite(my_module_with_doctests))
    return tests

Você pode omitir o argumento my_module_with_doctests se os objetos ou funções com doctests forem importados para o módulo de teste (isso deve ser um código funcional recortar e colar, basta colá-lo no módulo de teste):

def load_tests(loader, tests, ignore):
    tests.addTests(doctest.DocTestSuite())
    return tests

Mover os doctests para os testes unitários

Mas eu acho que, porque você está perguntando sobre "mover" eles, você deseja migrar seus doctests para serem usados como testes de unidade.

Recomendamos enfaticamente que você faça a conversão manualmente para garantir que suas suposições sobre os doctests estejam corretas, tomando notas sobre os testes que você deseja adicionar no futuro, se pensar em alguma, para que você tenha uma conversão de uma para a outra. uma conversão e pode resolver quaisquer erros com alterações mínimas. Você pode optar por deixar os doctests como documentação útil sobre o uso.

Depois de ter certeza de que você obteve êxito na conversão um para um dos testes, volte para suas anotações / comentários e adicione mais testes.

Se você precisar de andaimes:

Se você precisar criar um scaffolding (talvez o tempo alocado seja muito pequeno para a conversão manual), é possível iterar os objetos e / ou funções, verificar seus __doc__ atributos, fornecê-los a

example_list = doctest.DocTestParser().get_examples(a__doc__)

E para cada exemplo na lista, insira na chamada assertEquals o atributo ' source e want de cada objeto. Esse modelo pode ter esta aparência:

'self.assertEquals({0}, {1})'.format(x.source, x.want)

Conclusão:

De agora em diante, esteja ciente dos doctests como uma maneira de fornecer excelente documentação, mas eles não substituem a escalabilidade dos testes unitários.

    
por 18.12.2015 / 16:43
fonte