CherryPy - Teste

O teste é um processo durante o qual a aplicação é conduzida de diferentes perspectivas para -

  • Encontre a lista de problemas
  • Encontre diferenças entre o resultado esperado e real, produção, estados, etc.
  • Compreenda a fase de implementação.
  • Encontre o aplicativo útil para fins realistas.

O objetivo do teste não é colocar o desenvolvedor em falta, mas fornecer ferramentas e melhorar a qualidade para estimar a integridade do aplicativo em um determinado momento.

O teste deve ser planejado com antecedência. Isso exige definir a finalidade do teste, entender o escopo dos casos de teste, fazer a lista de requisitos de negócio e estar ciente dos riscos envolvidos nas diferentes fases do projeto.

O teste é definido como uma gama de aspectos a serem validados em um sistema ou aplicativo. A seguir está uma lista doscommon test approaches -

  • Unit testing- Isso geralmente é feito pelos próprios desenvolvedores. O objetivo é verificar se uma unidade de código funciona conforme o esperado ou não.

  • Usability testing- Os desenvolvedores geralmente podem esquecer que estão escrevendo um aplicativo para usuários finais que não têm conhecimento do sistema. O teste de usabilidade verifica os prós e contras do produto.

  • Functional/Acceptance testing - Enquanto o teste de usabilidade verifica se um aplicativo ou sistema é utilizável, o teste funcional garante que cada funcionalidade especificada seja implementada.

  • Load and performance testing- Isso é realizado para entender se o sistema pode se ajustar aos testes de carga e desempenho a serem realizados. Isso pode levar a mudanças no hardware, otimização de consultas SQL, etc.

  • Regression testing - Verifica que os sucessivos lançamentos de um produto não quebram nenhuma das funcionalidades anteriores.

  • Reliability and resilience testing - O teste de confiabilidade ajuda a validar a aplicação do sistema com a quebra de um ou vários componentes.

Teste de Unidade

Os aplicativos de fotoblog usam constantemente testes de unidade para verificar o seguinte -

  • Novas funcionalidades funcionam corretamente e conforme o esperado.
  • As funcionalidades existentes não são interrompidas pelo lançamento de um novo código.
  • Os defeitos são corrigidos e permanecem corrigidos.

Python vem com um módulo de teste de unidade padrão que oferece uma abordagem diferente para o teste de unidade.

Teste de unidade

unittest é baseado em JUnit, um pacote de teste de unidade Java desenvolvido por Kent Beck e Erich Gamma. Os testes de unidade simplesmente retornam dados definidos. Objetos de simulação podem ser definidos. Esses objetos permitem o teste em uma interface de nosso design sem ter que depender do aplicativo geral. Eles também fornecem uma maneira de executar testes em modo de isolamento com outros testes incluídos.

Vamos definir uma classe fictícia da seguinte maneira -

import unittest

class DummyTest(unittest.TestCase):
def test_01_forward(self):
dummy = Dummy(right_boundary=3)
   self.assertEqual(dummy.forward(), 1)
   self.assertEqual(dummy.forward(), 2)
   self.assertEqual(dummy.forward(), 3)
   self.assertRaises(ValueError, dummy.forward)

def test_02_backward(self):
dummy = Dummy(left_boundary=-3, allow_negative=True)
   self.assertEqual(dummy.backward(), -1)
   self.assertEqual(dummy.backward(), -2)
   self.assertEqual(dummy.backward(), -3)
   self.assertRaises(ValueError, dummy.backward)

def test_03_boundaries(self):
dummy = Dummy(right_boundary=3, left_boundary=-3,allow_negative=True)
   self.assertEqual(dummy.backward(), -1)
   self.assertEqual(dummy.backward(), -2)
   self.assertEqual(dummy.forward(), -1)
   self.assertEqual(dummy.backward(), -2)
   self.assertEqual(dummy.backward(), -3)

A explicação do código é a seguinte -

  • O módulo unittest deve ser importado para fornecer recursos de teste de unidade para a classe fornecida.

  • Uma classe deve ser criada pela subclasse de unittest.

  • Cada método no código acima começa com um teste de palavras. Todos esses métodos são chamados pelo manipulador de teste de unidade.

  • Os métodos assert / fail são chamados pelo caso de teste para gerenciar as exceções.

Considere isso como um exemplo para executar um caso de teste -

if __name__ == '__main__':
unittest.main()

O resultado (saída) para executar o caso de teste será o seguinte -

----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK

Teste funcional

Uma vez que as funcionalidades do aplicativo começam a tomar forma de acordo com os requisitos, um conjunto de testes funcionais pode validar a exatidão do aplicativo em relação à especificação. No entanto, o teste deve ser automatizado para melhor desempenho, o que exigiria o uso de produtos de terceiros, como Selenium.

CherryPy fornece classes auxiliares como funções integradas para facilitar a escrita de testes funcionais.

Teste de carga

Dependendo do aplicativo que você está escrevendo e de suas expectativas em termos de volume, pode ser necessário executar testes de carga e desempenho para detectar possíveis gargalos no aplicativo que o estão impedindo de atingir um determinado nível de desempenho.

Esta seção não detalha como conduzir um teste de desempenho ou carga, pois está fora do pacote FunkLoad.

O exemplo básico de FunkLoad é o seguinte -

from funkload.FunkLoadTestCase 
import FunkLoadTestCase

class LoadHomePage(FunkLoadTestCase):
def test_homepage(self):

server_url = self.conf_get('main', 'url')
nb_time = self.conf_getInt('test_homepage', 'nb_time')
home_page = "%s/" % server_url

for i in range(nb_time):
self.logd('Try %i' % i)
self.get(home_page, description='Get gome page')
if __name__ in ('main', '__main__'):

import unittest

unittest.main()

Aqui está uma explicação detalhada do código acima -

  • O caso de teste deve ser herdado da classe FunkLoadTestCase para que o FunkLoad possa fazer seu trabalho interno de rastrear o que acontece durante o teste.

  • O nome da classe é importante porque FunkLoad irá procurar um arquivo baseado no nome da classe.

  • Os casos de teste projetados têm acesso direto aos arquivos de configuração. Os métodos get () e post () são simplesmente chamados no servidor para obter a resposta.