Teste de Python com pytest. Simples, rápido, eficiente e escalável. Prefácio e Introdução

Mais longe


O teste sistemático de software, especialmente na comunidade Python, geralmente é completamente ignorado ou executado de uma maneira especial. Muitos programadores de Python desconhecem completamente a existência de pytest. Brian Ocken se esforça para provar que o teste de software com pytest é fácil, natural e até interessante.

Dmitry Zinoviev
Autor do Data Science Essentials em Python



Os exemplos deste livro foram escritos usando Python 3.6 e pytest 3.2. O pytest 3.2 suporta Python 2.6, 2.7 e Python 3.3+.


O código-fonte do projeto Tarefas, bem como todos os testes mostrados neste livro, estão disponíveis no link na página da Web do livro em pragprog.com . Você não precisa fazer o download do código-fonte para entender o código de teste; o código de teste é apresentado de forma conveniente nos exemplos. Mas, para acompanhar as tarefas do projeto ou adaptar exemplos de teste para testar seu próprio projeto (suas mãos estão desamarradas!), Você deve acessar a página da Web do livro e fazer o download do trabalho. Lá, na página da web do livro, há um link para mensagens de errata e um fórum de discussão .

Sob o spoiler, há uma lista de artigos desta série.



Agradecimentos


Primeiro tenho que agradecer a Michelle - minha esposa e melhor amiga. É uma pena que você não veja a sala em que estou escrevendo. Em vez de uma mesa, tenho uma mesa de jantar quadrada de carvalho antiga, na qual há espaço suficiente para que o papel seja colocado. Uma linda estante de vidro com meus brinquedos retroespaciais que coletamos ao longo dos anos, além de livros técnicos, placas de circuito e bolas de malabarismo. Caixas de alumínio antigas para guardar papel até o topo preenchidas com notas, cabos e até os adesivos restantes para foguetes. Uma parede está coberta de veludo, que compramos há muitos anos, quando a loja de tecidos decidiu fechar definitivamente. O tecido deve acalmar o eco quando eu gravar podcasts.


Eu gosto de escrever aqui não apenas porque é conveniente e consistente com o meu mundo interior, mas também porque é o espaço que Michel criou comigo e para mim. Ela e eu sempre fomos uma equipe, e ela incrivelmente apoiou minhas idéias malucas de escrever um blog, iniciar um ou dois podcasts e agora, ao longo do último ano, escrever este livro. Ela garantiu que eu tivesse tempo e espaço para escrever. Quando me canso e penso se ainda tenho forças para escrever, ela me oferece apenas para continuar por vinte minutos e ver como me sentirei então, ela fez o mesmo quando me ajudou a noites de faculdade. Eu realmente, realmente não poderia ter feito isso sem ela.


Eu também tenho duas filhas surpreendentemente incríveis, curiosas e brilhantes, Gabriella e Sofia, que são duas das minhas maiores fãs. Ella oferece a todos que falam sobre programação para ouvir meus podcasts, e Phia ostentou um adesivo para o código de teste em sua mochila, que ela tirou na segunda série.


Há muito mais pessoas para agradecer.


Minha editora, Katherine Dvorak, me ajudou a reunir um monte de idéias e tópicos aleatórios em uma progressão coesa, e é por isso que este é um livro, não uma série de posts mantidos juntos. Entrei nesse projeto como blogueiro e me apeguei demais às muitas manchetes, subtítulos e itens da lista, e Katie pacientemente me guiou para que eu pudesse me tornar uma escritora melhor.


Agradeço a Suzanne Davidson Palatinate, Andy Hunt e o resto da Pragmatic Bookshelf por me darem a chance.


Os revisores técnicos me mantiveram honesto no pytest, mas também no estilo Python, e são a razão pela qual os exemplos de código seguem o PEP 8. Agradecimentos a Oliver Bestwalter, Florian Bruhin, Floris Bruinog, Mark Goody, Peter Hampton, Peter Hampton, Dave Hunt, Al Crinker e Lokesh. Kumaru Makani, Bruno Oliveira, Ronnie Pfannschmidt, Rafael Pierzine, Luciano Ramallo, Frank Ruiz e Dmitry Zinoviev. Muitos desta lista também são desenvolvedores de kernel pytest e / ou suportam plugins pytest incríveis.


Agradecimentos especiais a Luciano. Depois de escrever este livro, enviei os quatro primeiros capítulos para vários revisores. Luciano era um deles, e sua crítica foi a mais difícil de ler. Eu não acho que segui todos os seus conselhos, mas por causa de suas observações, revisei e reescrevi a maioria dos três primeiros capítulos e mudei algo no restante do livro.


Obrigado a toda a equipe pytest-dev por criar uma ferramenta de teste tão legal. Agradeço a Oliver Bestwalter, Florian Bruhin, Floris Bruinoh, Dave Hunt, Holger Krekel, Bruno Oliveira, Ronnie Pfannschmidt, Rafael Pierzine e muitos outros por responderem minhas perguntas sobre a vida ao longo dos anos.


E por último, mas não menos importante, preciso agradecer às pessoas que me agradeceram. Eles aproveitaram a oportunidade para me informar por e-mail que meu trabalho economizava tempo e tornava o trabalho mais fácil. Isso é legal e me faz feliz! Obrigada


Brian okken


setembro 2017


Prefácio


O uso do Python está aumentando não apenas no desenvolvimento de software, mas também em áreas como análise de dados, pesquisa, teste e medição, bem como em outros setores. O desenvolvimento do Python em muitas áreas críticas também é acompanhado pelo desejo de realizar testes de software corretamente, de forma eficiente e eficaz, para garantir que os programas funcionem corretamente e dê os resultados corretos. Além disso, mais e mais projetos de software abrangem a integração contínua e incluem uma fase de teste automatizada, à medida que os ciclos de liberação são encurtados e o teste manual cuidadoso de projetos cada vez mais complexos simplesmente não é viável. As equipes devem poder confiar nos testes realizados pelos servidores de integração contínua que informam se podem confiar no software o suficiente para liberá-lo.


Digite pytest.


O que é pytest?


Uma ferramenta de teste confiável do Python, o pytest pode ser usado para todos os tipos e níveis de teste de software. O pytest pode ser usado por equipes de desenvolvimento, equipes de controle de qualidade, grupos de teste independentes, indivíduos praticando TDD e projetos de código aberto. De fato, projetos na Internet mudaram de unittest ou nose para pytest , incluindo Mozilla e Dropbox. Porque Porque o pytest oferece recursos avançados, como reescrever "afirmar", modelos de plug-in de terceiros e um modelo de acessório poderoso, porém simples, incomparável em qualquer outra estrutura de teste.


pytest é uma plataforma de teste de software, o que significa que pytest é um programa de linha de comando. Uma ferramenta que encontra automaticamente testes escritos, executa testes e escreve relatórios com o resultado. Possui uma biblioteca de loções que você pode usar em testes para ajudá-lo a testar com mais eficiência. Pode ser expandido escrevendo seus próprios plug-ins ou instalando plug-ins de terceiros. Pode ser usado para testar distribuições Python. E integra-se perfeitamente a outras ferramentas, como integração contínua e automação da web.


Aqui estão algumas razões pelas quais o pytest se destaca entre muitos outros testes de sistema integrado:


  • Testes simples são fáceis de escrever em pytest.
  • Testes complexos são ainda mais fáceis de escrever.
  • Os testes são fáceis de ler.
  • Os testes são fáceis de ler. (É tão importante que isso seja indicado duas vezes.)
  • Você pode começar em segundos.
  • assert usado para falhar no teste, não self.assertEqual() ou self.assertLessThan() . Apenas afirme !
  • Você pode usar o pytest para executar testes escritos para unittest ou nose.

O pytest é desenvolvido e apoiado ativamente por uma comunidade apaixonada e crescente. É tão expansível e flexível que cabe facilmente no seu fluxo de trabalho. E como ele é instalado separadamente da sua versão do Python, você pode usar a mesma versão mais recente do pytest no Python 2 herdado (2.6 e superior) e Python 3 (3.3 e superior).


Aprendendo pytest ao testar um aplicativo de exemplo


Você gostaria de aprender pytest testando exemplos tolos que você nunca verá na vida real? Eu também Não vamos fazer isso neste livro. Em vez disso, vamos escrever testes para um projeto que, espero, tenha muito em comum com os aplicativos que você testará depois de ler este livro.


Projeto Tarefas


O aplicativo que examinaremos se chama Tarefas. Tarefas é um aplicativo mínimo de rastreamento de tarefas com uma interface de linha de comando. Ele tem bastante em comum com muitos outros tipos de aplicativos, os quais, espero, você pode ver facilmente como os conceitos de teste aprendidos ao desenvolver testes contra problemas são aplicáveis ​​aos seus projetos agora e no futuro.


Embora o Tasks tenha uma interface de linha de comando (CLI), a CLI interage com o restante do código por meio de uma interface de programação de aplicativos (API). Uma API é a interface para a qual direcionaremos a maioria dos nossos testes. A API interage com a camada de gerenciamento de banco de dados, que interage com o banco de dados de documentos - MongoDB ou TinyDB . O tipo de banco de dados é configurado quando o banco de dados é inicializado. Antes de focar na API, vejamos as próprias tarefas, uma ferramenta de linha de comando que fornece uma interface de usuário para tarefas.


Aqui está uma sessão de exemplo:


 $ tasks add 'do something' --owner Brian $ tasks add 'do something else' $ tasks list ID owner done summary -- ----- ---- ------- 1 Brian False do something 2 False do something else $ tasks update 2 --owner Brian $ tasks list ID owner done summary -- ----- ---- ------- 1 Brian False do something 2 Brian False do something else $ tasks update 1 --done True $ tasks list ID owner done summary -- ----- ---- ------- 1 Brian True do something 2 Brian False do something else $ tasks delete 1 $ tasks list ID owner done summary -- ----- ---- ------- 2 Brian False do something else $ 

Nota do tradutor: No caso de usar a plataforma Windows, tive vários problemas ao testar esta sessão.
  1. Uma pasta deve ser criada para o banco de dados do TinyDB denominado tasks_db na pasta do usuário. Por exemplo c:\Users\User_1\tasks_db\
  2. Use aspas em vez de apóstrofos. Caso contrário, obteremos esse erro.

    $ tasks adiciona 'faça outra coisa'
    Uso: tarefas adicionam [OPTIONS] RESUMO

    Erro: obtive argumentos extras inesperados (outra coisa ')

Esse não é o aplicativo de gerenciamento de tarefas mais difícil, mas complexo o suficiente para ser usado no estudo de testes.


Estratégia de teste


Embora o pytest seja adequado para teste de unidade, teste de integração, teste de sistema ou teste de ponta a ponta e teste funcional, a estratégia de teste do projeto Tarefas se concentra principalmente em testes funcionais subcutâneos. A seguir estão algumas definições úteis:


  • Teste de unidade : teste que testa um pequeno pedaço de código, como uma função ou classe, isoladamente do resto do sistema. Reviso os testes no Capítulo 1, Introdução ao pytest, na página 1, para realizar testes de unidade.A estrutura de dados das tarefas.
  • Teste de integração : um teste que testa um pedaço maior de código pode incluir várias classes ou subsistemas. Principalmente o rótulo usado para alguns testes é maior que um teste de unidade, mas menor que um teste de sistema.
  • Teste do sistema (ponta a ponta) : um teste que testa todo o sistema em teste em um ambiente o mais próximo possível do ambiente do usuário final.
  • Teste funcional : um teste que testa uma parte da funcionalidade do sistema. Um teste que testa quão bem adicionamos, removemos ou atualizamos um item de tarefa no Tasks é um teste funcional.
  • Teste subcutâneo : um teste executado não para a interface do usuário final, mas para uma interface localizada logo abaixo da superfície. Como a maioria dos testes deste livro é testada no nível da API, não na CLI, eles se qualificam como testes subcutâneos.

Como é organizado este livro?


No Capítulo 1, “Introdução ao pytest” na página 1, você instala o pytest e se prepara para usá-lo. Em seguida, você participa de uma parte do projeto Tarefas - uma estrutura de dados que representa uma única tarefa (denominada dupla chamada Tarefa) e a utiliza para testar exemplos. Você aprenderá como executar o pytest com vários arquivos de teste. Você verá muitas opções de linha de comando populares e extremamente úteis para o pytest, como a capacidade de reiniciar falhas de teste, interromper a execução após a primeira falha, controlar o rastreamento de pilha e a versão de várias páginas da execução de teste e muito mais.


No capítulo 2, “Criando funções de teste”, na página 23, você instala tarefas localmente com o pip e vê como estruturar testes em um projeto Python. Você deve fazer isso para começar a escrever testes para um aplicativo real. Todos os exemplos neste capítulo executam testes para o aplicativo instalado, incluindo a gravação no banco de dados. As funções reais de teste são o foco deste capítulo e você aprenderá como usar a assert efetivamente nos testes. Você também aprenderá sobre marcadores. Uma função que permite marcar muitos testes que serão executados simultaneamente, marcar testes que serão ignorados ou informar ao pytest que já sabemos que alguns testes falharão. Vou falar sobre como executar apenas alguns testes, não apenas com marcadores, mas também estruturando nosso código de teste em diretórios, módulos e classes, e como executar esses subconjuntos de testes.


Nem todos os códigos de teste estão incluídos nas funções de teste. No capítulo 3, “pytest Fixtures”, na página 49, você aprenderá a inserir dados de teste em fixtures de teste, além de configurar e quebrar o código. Definir o estado de um sistema (ou subsistema ou unidade individual) é uma parte importante dos testes de software. Você aprenderá esse aspecto dos equipamentos pytest para ajudar a inicializar o banco de dados do projeto Tarefas e preencher previamente os dados de teste para alguns testes. As luminárias são uma parte incrivelmente poderosa do pytest, e você aprenderá como usá-las efetivamente para reduzir ainda mais a duplicação do código de teste e ajudar a tornar seu código de teste incrivelmente legível e sustentável. Os equipamentos Pytest também são parametrizáveis, semelhantes às funções de teste, e você usará essa função para poder executar todos os seus testes com o TinyDB e o MongoDB, as partes do servidor de banco de dados suportadas pelo Tasks.


No capítulo 4, “Acessórios embutidos”, na página 71, você verá alguns dos acessórios internos fornecidos pelo pytest. Você aprenderá como os acessórios internos do pytest podem rastrear diretórios e arquivos temporários para você, ajudá-lo a verificar a saída do código de teste, usar patches de macacos, verificar avisos e muito mais.


No capítulo 5, “Plugins”, na página 95, você aprenderá como adicionar opções de linha de comando ao pytest, alterar a saída do pytest e compartilhar configurações do pytest, incluindo acessórios, com outros usuários por meio da escrita, empacotamento e distribuição ( distribuição) próprios plugins. O plug-in que desenvolvemos neste capítulo é usado para criar os erros de teste que vemos ao testar tarefas, um pouco melhor. Você também aprenderá como testar os Plugins corretamente. Que tipo de meta? E, caso você não tenha se inspirado o suficiente neste capítulo para escrever seus próprios plug-ins, peguei vários ótimos plug-ins para mostrar o que é possível no Apêndice 3, “Pacote de Sampler de Plug-in”, na página 163.


Falando em customização, no capítulo 6, “Configuração”, na página 113, você aprenderá como configurar o lançamento do pytest padrão para o seu projeto usando arquivos de configuração. Com o arquivo pytest.ini , você pode fazer coisas como armazenar parâmetros da linha de comando para não precisar digitá-los o tempo todo, dizer ao pytest para não procurar em diretórios específicos arquivos de teste, especificar a versão mínima do pytest que seu testes e muito mais. Esses itens de configuração podem ser colocados em tox.ini ou setup.cfg .


No capítulo final, Capítulo 7, usando o pytest com outras ferramentas, na página 125, você verá como pode fazer o pytest já poderoso e sobrecarregar seu teste com ferramentas adicionais. Você executará o projeto Tarefas em várias versões do Python com tox. Você testará as tarefas da CLI sem executar o resto do sistema com simulação. Você usará o license.py para verificar se o código-fonte do projeto da tarefa está sendo testado. Você usará o Jenkins para executar suítes de teste e exibir resultados ao longo do tempo. E, finalmente, você verá como o pytest pode ser usado para executar testes unittest, bem como para trocar acessórios do estilo pytest por testes unittest.


O que você precisa saber


Python


Você não precisa ser um guru do Python. Exemplos não fazem nada sobrenatural ou bizarro.


pip


Você deve usar o pip para instalar os plugins pytest e o próprio pytest. Se você deseja atualizar o pip, consulte o Apêndice 2, pip, na página 159.


Linha de comando


Escrevi este livro e capturei exemplos de resultados usando o bash em um laptop Mac. No entanto, os únicos comandos que uso no bash são o cd para ir para um diretório específico e, claro, o pytest. Como o cd existe no Windows cmd.exe e em todos os shells unix que eu conheço, todos os exemplos devem estar disponíveis para execução em qualquer aplicativo de terminal que você decidir usar.


Isso é tudo. Você não precisa ser um especialista em programação para começar a escrever testes automatizados com o pytest.


Exemplos de código e recursos da Internet


Os exemplos deste livro foram escritos usando Python 3.6 e pytest 3.2. O pytest 3.2 suporta Python 2.6, 2.7 e Python 3.3+.


O código-fonte do projeto Tarefas, bem como todos os testes mostrados neste livro, estão disponíveis no link na página da Web do livro em pragprog.com . Você não precisa fazer o download do código-fonte para entender o código de teste; o código de teste é apresentado de forma conveniente nos exemplos. Mas, para acompanhar as tarefas do projeto ou adaptar exemplos de teste para testar seu próprio projeto (suas mãos estão desamarradas!), Você deve ir à página do livro para baixar o trabalho. Lá, na página do livro, há um link para o post da errata e o fórum de discussão .


Faço programação há mais de vinte e cinco anos e nada me fez gostar de escrever código de teste tanto quanto o pytest. Espero que você aprenda muito com este livro e espero que, no final, você ame o código de teste como eu.


Mais longe

Source: https://habr.com/ru/post/pt426699/


All Articles