Test Metrics.

Python Code Coverage

Python é uma das linguagens de programação mais populares atualmente disponíveis. Devido à sua natureza de propósito geral, Python encontra aplicação em vários casos de desenvolvimento de software, desde simples scripts a servidores web e frameworks como Django.

No entanto, tal como acontece com outras linguagens de programação, o teste continua a ser um dos aspectos mais importantes do desenvolvimento de software em Python.

Neste post, veremos poucas ferramentas para medir e escrever a cobertura de casos de teste para código Python.

Unittest

Python biblioteca padrão é pré-construída com um módulo chamado unittest. Inspirado pelo JUnit e outras estruturas de teste de unidades das principais linguagens de programação, o unittest é uma estrutura de teste que permite automatizar testes, configurar código de configuração compartilhado e desligar para testes e mais.

Uma das características importantes do unittest é a fixação de teste, ou seja, a configuração necessária para executar um ou mais testes, e quaisquer ações de limpeza associadas. Com a correção de texto, atividades como a criação de bancos de dados temporários ou proxy, diretórios ou iniciar um processo de servidor, podem ser realizadas em um único local.

Deixe-nos pegar alguns exemplos de casos de teste e ver como eles são implementados usando unittest:

importar unittest

classe TestStringMethods(unittest.TestCase):

def test_upper(self):
self.assertEqual(‘foo’.upper(), ‘FOO’)

def test_isupper(self):
self.assertTrue(‘FOO’.isupper())
self.assertFalse(‘Foo’.isupper())

def test_split(self):
s = ‘hello world’
self.assertEqual(s.split(), )
# verifique isso s.split falha quando o separador não é uma string
com self.assertRaises(TypeError):
s.split(2)

if __name__ == ‘__main__’:
unittest.main()

Criar um caso de teste por subclassificação unittest.TestCase. Em seguida, você pode definir testes individuais com métodos. Note que os nomes dos casos de teste devem começar com a palavra teste. Esta convenção de nomenclatura informa o test runner sobre quais métodos representam testes.

test runner é o componente que orquestra a execução dos testes e fornece o resultado ao utilizador. Sua implementação varia e pode usar uma interface gráfica, uma interface textual, ou retornar um valor especial para indicar os resultados da execução dos testes.

Pytest

Pytest é uma estrutura de testes Python de terceiros. Ele visa fornecer um framework para escrever seus testes de forma eficiente, removendo todas as despesas gerais para a criação de testes. Pytest é suportado pelo Python 2.7, 3.4, 3.5, 3.6, Jython, PyPy-2.3 em Unix/Posix e Windows.

Vamos dar uma olhada em como começar com Pytest.Primeiro, baixe a última versão e instale-a via pip:

pip install -U pytest

Pode verificar a versão instalada por:

pytest -version

Agora, vamos pegar uma função de amostra e um caso de teste relacionado.

# conteúdo do test_sample.py
def func(x):
retorno x + 1def test_answer():
asserir func(3) == 5

A função func pega uma entrada x e retorna um valor x + 1. No caso do teste, nós afirmamos se a função func pega a entrada 3 e retorna o valor 5. Este caso de teste é esperado que falhe. Para executar o teste simplesmente digite pytest no diretório que tem o arquivo test_sample.py.

$ pytest
=========================== test session starts ============================
platform linux – Python 3.x.y, pytest-3.x.y, py-1.x.y, pluggy-0.x.y
rootdir: $REGENDOC_TMPDIR, inifile:
collected 1 itemtest_sample.py F ================================= FAILURES =================================
_______________________________ test_answer ________________________________

def test_answer():
>asserir func(3) == 5
Easserir 4 == 5
E + onde 4 = func(3)

test_sample.py:5: AssertionError
========================= 1 falhou em 0.12 segundos =========================

Coverage.py

Coverage.py é uma das ferramentas de cobertura de código mais populares para Python. Utiliza ferramentas de análise de código e ganchos de rastreamento fornecidos na biblioteca padrão Python para medir a cobertura. Ele roda nas principais versões do CPython, PyPy, Jython e IronPython. Você pode usar Coverage.py com unittest e Pytest.

Você pode baixar a última versão do Coverage e instalá-lo manualmente, ou pode instalá-lo com pip como:

$ pip install coverage

Agora execute seu programa com cobertura como

$ coverage execute meu_programa.py arg1 arg2

Próximo para obter dados de cobertura, execute

relatório de cobertura -m

>

Aqui está um exemplo de saída de dados de cobertura

relatório de cobertura -m
Nome Stmts Falta cobertura
——————-
my_program.py 20 4 80% 33-35, 39
my_other_module.py 56 6 89% 17-23
——————-
TOTAL 76 10 87%

Gerar relatório em arquivo html:

$ cobertura html

Este é um relatório HTML de exemplo como gerado por Coverage.py. Inclui Module, statements, missing, excluded, branches, partial and coverage.

Pytest-cov

Pytest-cov é um plugin Python para gerar relatórios de cobertura. Além das funcionalidades suportadas pelo comando coverage, ele também suporta testes centralizados e distribuídos. Ele também suporta cobertura de subprocessos.

Após você ter escrito casos de teste como requerido com o Pytest, você pode usar Pytest-cov para executar todos os testes e relatar a cobertura.

Para começar, instale Pytest-cov como:

$ pip install pytest-cov

Testes centralizados

Testes centralizados relatam a cobertura combinada do processo principal e de todos os seus subprocessos. Você pode executar testes centralizados usando,

$ py.test -cov= tests/

Testes distribuídos

Instalar Pytest-xdist, para suporte a sistemas distribuídos:

$ pip install pytest-xdist

Testes distribuídos podem ser feitos em dois modos, dist definido para carregar e cada um deles. Quando configurada para carregar, a cobertura combinada de todos os escravos é relatada durante os testes distribuídos. Os escravos podem estar espalhados por qualquer número de hosts e cada escravo pode estar localizado em qualquer lugar do sistema de arquivos. Cada escravo terá seus subprocessos medidos.

Para testes distribuídos em cada modo, o pytest-cov também reporta a cobertura combinada de todos os escravos. Como cada escravo está executando todos os testes, isto permite gerar um relatório de cobertura combinada para múltiplos ambientes

Resumo

Neste post, aprendemos sobre vários testes de unidades Python e frameworks de cobertura de código. Embora esses frameworks facilitem o processo de teste, você ainda precisa escrever os testes. Aqui estão algumas das melhores práticas a considerar ao escrever testes unitários.

  • Utilizar nomes longos e descritivos. Isto muitas vezes evita a necessidade de doutrinas nos métodos de teste.
  • Testes devem ser isolados. Não interaja com uma base de dados ou rede real. Use um banco de dados de teste separado que seja derrubado ou use objetos simulados.
  • Focalize em uma pequena funcionalidade.
  • Deve ser rápido, mas um teste lento é melhor do que nenhum teste.
  • Faz sentido ter uma classe de caso de teste para uma única classe ou modelo.

Deixe uma resposta

O seu endereço de email não será publicado.