Escrevendo testes de unidade em Python: Como eu começo? [fechadas]

534

Concluí meu primeiro projeto adequado em Python e agora minha tarefa é escrever testes para ele.

Como essa é a primeira vez que eu faço um projeto, é a primeira vez que eu escrevia testes para ele.

A questão é: como eu começo? Eu não tenho absolutamente nenhuma idéia. Alguém pode me indicar alguma documentação / tutorial / link / livro que eu possa usar para começar a escrever testes (e acho que o teste de unidade em particular)

Qualquer conselho será bem-vindo neste tópico.

user225312
fonte
4
Nunca é tarde para escrever testes, se é essa a sua intenção. Melhor ter algum que nada por tudo o que reclamar ...
Asken
1
Aqui está um bom livro de desenvolvimento orientado a testes que está disponível gratuitamente on-line: chimera.labs.oreilly.com/books/1234000000754/index.html
Será
4
bom recurso deparei com https://www.jeffknupp.com/blog/2013/12/09/improve-your-python-understanding-unit-testing/ . Como um novato em python, achei compreensível.
ferry
2
O Guia do Mochileiro para Python tem uma visão geral breve de ferramentas para teste de unidade: python-guide-pt-br.readthedocs.io/en/latest/writing/tests
Anton Tarasenko
O comentário anterior deve ter uma classificação mais alta, já que o guia também possui um repositório de código de exemplo no github.com/kennethreitz/samplemod, que também é um ótimo lugar para começar.
Setempler

Respostas:

101

Se você é novo no uso de unittests, a abordagem mais simples de aprender geralmente é a melhor. Nessa base, recomendo usar o módulo padrãopy.test em vez do padrãounittest .

Considere estes dois exemplos, que fazem o mesmo:

Exemplo 1 (unittest):

import unittest

class LearningCase(unittest.TestCase):
    def test_starting_out(self):
        self.assertEqual(1, 1)

def main():
    unittest.main()

if __name__ == "__main__":
    main()

Exemplo 2 (pytest):

def test_starting_out():
    assert 1 == 1

Supondo que os dois arquivos sejam nomeados test_unittesting.py, como executamos os testes?

Exemplo 1 (unittest):

cd /path/to/dir/
python test_unittesting.py

Exemplo 2 (pytest):

cd /path/to/dir/
py.test
Tim McNamara
fonte
7
Ouvi falar da simplicidade do py.test em vários locais ( docs.python-guide.org/en/latest/writing/tests/#py-test , docs.python.org/3.5/library/unittest.html#module -unittest , jeffknupp.com/blog/2013/12/09/… ) Por que unit-testainda está incluído na biblioteca padrão, se py.teste nosefornece a mesma funcionalidade com uma interface muito mais simples? É apenas para fornecer compatibilidade com versões anteriores, ou que unittesttêm algumas vantagens que py.teste nosetestnão pode fornecer?
alpha_989
@ alpha_989 A biblioteca python padrão não se destina a conter as melhores ferramentas disponíveis. É para isso que serve o PyPI. O unittestpacote padrão ainda é bom o suficiente. É padrão, o que significa que é garantido que funcione bem. Por fim, quem usa seu código não precisa instalar pacotes extras.
Jeyekomon
72

O livro grátis do Python Dive Into Python possui um capítulo sobre teste de unidade que você pode achar útil.

Se você seguir práticas modernas, provavelmente deverá escrever os testes enquanto estiver escrevendo seu projeto, e não espere até que seu projeto esteja quase pronto.

Um pouco tarde agora, mas agora você sabe da próxima vez. :)

Mark Byers
fonte
13
Eu ainda diria que se você quiser código refactor que não tem testes de unidade, você deve testes unitários primeira gravação para ele
Hubert Kario
9
Sim, muitas pessoas que vêm a unittests ouvem pela primeira vez o que parece "bem, é meio tarde demais para o seu projeto atual" de mãos antigas: mesmo que não seja isso que elas realmente quisessem dizer, é o que os novatos ouvem . É como o provérbio chinês sobre o plantio de uma árvore: o melhor momento para iniciar os testes é no início de um projeto; o segundo melhor momento para iniciar os testes é agora!
JP
4
Mergulhe no link do Python está quebrado ... :-(
Scott Skiles
40

Existem, na minha opinião, três ótimas estruturas de teste de python que são boas de verificar.
O unittest - módulo é padrão com todas as distribuições python do
nariz - pode executar testes unittest e possui menos clichê.
pytest - também executa testes mais unittest, tem menos clichê, melhores relatórios, muitos recursos extras interessantes

Para obter uma boa comparação de tudo isso, leia as introduções de cada um em http://pythontesting.net/start-here .
Também há artigos estendidos sobre acessórios e muito mais.

Okken
fonte
35

Os documentos para unittest seria um bom lugar para começar.

Além disso, é um pouco tarde agora, mas, no futuro, considere escrever testes de unidade antes ou durante o próprio projeto. Dessa forma, você pode usá-los para testar à medida que avança e (em teoria) você pode usá-los como testes de regressão, para verificar se as alterações no seu código não quebraram nenhum código existente. Isso lhe daria todos os benefícios de escrever casos de teste :)

Justin Ethier
fonte
Isso se você quiser um desenvolvimento orientado a testes, o que não é algo ruim de se ter. No meu caso, estou analisando o código existente e tentando entendê-lo escrevendo e aprimorando os testes para passar, e isso me levou a começar unittest. Depois que eu pegar o jeito, vou usá-lo mais para o desenvolvimento, além de aumentar o número de casos de teste para cada unidade.
Icedwater
27

unittest vem com a biblioteca padrão, mas eu recomendo que você nosetests .

" nariz se estende mais unido para facilitar os testes. "

Eu também recomendo você pylint

" analisa o código fonte do Python procurando bugs e sinais de baixa qualidade. "

ssoler
fonte
8

Como outros já responderam, é tarde para escrever testes de unidade, mas não é tarde demais. A questão é se seu código é testável ou não. Na verdade, não é fácil colocar o código existente em teste, há até um livro sobre isso: Trabalhando efetivamente com o código legado (consulte os principais pontos ou o PDF precursor ).

Agora, escrever ou não os testes de unidade é sua decisão. Você só precisa estar ciente de que poderia ser uma tarefa tediosa. Você pode resolver isso para aprender o teste de unidade ou considerar primeiro escrever testes de aceitação (de ponta a ponta) e começar a escrever testes de unidade quando alterar o código ou adicionar novos recursos ao projeto.

filante
fonte
2
+1 em "Trabalhando efetivamente com o código herdado". É tudo sobre código que não possui testes.
David
3

nosetests é uma solução brilhante para testes de unidade em python. Ele suporta casos de teste e documentos com base mais unittest, e o inicia com apenas um arquivo de configuração simples.

Daniel Kluev
fonte
O link de seus testes finais está obsoleto. Parece que o novo local é: nose.readthedocs.org/en/latest
odigity
1
De acordo com a documentação no github e no site da nosetest, nosee nose2está no modo maintanance. É melhor começar com py.testcomo ele tem muito mais apoio
alpha_989