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.