Gerais


Fato importante das linguagem de programação é a  do tipo dos dados. Segundo [1] há quatro tipagem:
  • Estática são fixados no momento da compilação.
  • Dinâmica são descobertos no momento da execução.
  • Forte são estritamente respeitados.
  • Fraca podem ser ignorados.
Um modelo [2] é uma abstração de alguma coisa, cujo propósito é permitir que se conheça essa coisa antes de se construí-la.

A modelagem de sistemas apoia-se na tripode de modelos que são:
  • modelo funcional
  • modelo dinâmico
  • modelo objetos
O modelo funcional descreve os relacionamentos funcionais entre os valores.

O modelo dinâmico descreve os relacionamentos concernentes ao tempo.

O modelo objetos descreve a estrutura estática.

Em [3] um projeto de programa há dois principais aspectos que devem ser estudados que são:
  • procedimentos
  • dados

Estrutra de dados
Os tipos de dados são divididos em três grupos:
  • primitivo
  • estático
  • dinâmico

Considera-se como dados primitivos os:
  • inteiros
  • reais
  • caracteres
  • lógicos
  • ponteiros

Para cada tipo há operações associadas assim como representam aspectos próprios ao tipo.

Os tipos de dados estáticos são estruturas completamente definidas antes de começarmos a efetuar as operações.

Os tipos de dados dinâmicos são estruturas que sofrem alterações quando estão sendo manipuladas.

Técnica da busca rápida
Na árvore binária de busca pode-se melhorar o algoritmo com a combinação de percurso com a a técnica de costura.
Para garantir que o elemento sempre seja encontrado, cria-se um nó auxiliar (parada) que não pertence à árvore, o qual é apontado por todos as ligações que antes possuíam o símbolo # como final.

Nesse nó é colocada a chave procurada, de tal forma que se o endereço do nó encontrado for o endereço do nó parada. podemos afirmar que a chave procurada não existe na árvore.

Testes de unidade

Lendo alguns livros vi sobre teste de unidade e desenvolvimento em [5] são apresentados características:

unidade, integração e sistema
carga e desempenho
confiabilidade e recuperação
aceitação e usabilidade

unidade e integração
para cada entrada --> definir saída esperada
testar uma entrada por vez
testar entradas válidas e inválidas

As características  em testes devem ser:

sem interação humana na entrada de dados
verificar os resultados sem interação humana
rodar de forma independente sem efeitos colaterais em outros

A biblioteca unittest suporta automação de teste, compartilhamento de código de configuração e de encerramento de testes, a agregação de testes em coleções, e a independência dos testes a partir da estrutura de relatório. O módulo unittest fornece classes que tornam mais fácil para apoiar essas qualidades para um conjunto de testes [7]. Para conseguir isso, unittest suporta alguns conceitos importantes:

teste de ensaio
caso de teste
suite de testes
corredor de teste


Baseado em testes a pesquisa na rede internacional de computadores - RIC, na linguagem Phyton e surgiu as bibliotecas docTest e unitTest [6 e 7] .

Test
TestFixture
TestCase
TestSuite
TestRunner

Instalação de ensaio
     A instalação de ensaio representa a preparação necessária para realizar um ou mais testes, e quaisquer ações de limpeza associados. Isto pode envolver, por exemplo, a criação de bancos de dados temporários ou proxy, diretórios, ou iniciar um processo de servidor.
caso de teste
     Um caso de teste é a menor unidade de teste. Ele verifica por uma resposta específica para um determinado conjunto de entradas. unittest fornece uma classe base, TestCase, que podem ser usadas para criar novos casos de teste.
suíte de testes
     Um conjunto de testes é uma coleção de casos de teste, conjuntos de testes, ou ambos. É usado para testes de agregação que devem ser executadas em conjunto.
corredor de teste
     Um corredor de teste é um componente que orquestra a execução de testes e proporciona o resultado para o utilizador. O corredor pode usar uma interface gráfica, uma interface textual, ou retornar um valor especial para indicar os resultados da execução dos testes.

Os casos de teste e teste de ensaio são suportados através das classes Testcase e FunctionTestCase; a primeira deve ser usado durante a criação de novos testes, e este último pode ser utilizado quando se integra o código de teste existente com uma estrutura orientada por unittest. Quando a construção de dispositivos de teste usando TestCase, os  métodos setup() e tearDown() podem ser substituídos para fornecer inicialização e limpeza dos dispositivos. Com FunctionTestCase, funções existentes podem ser passados para o construtor para esses propósitos. Quando o teste é executado, a inicialização do dispositivo é executado em primeiro lugar; se for bem sucedido, o método de limpeza é executado após o teste tiver sido executado, independentemente do resultado do teste. Cada exemplo do TestCase só irá ser utilizado para executar um método de ensaio simples, de modo que uma nova fixação é criada para cada teste [7].


Um corredor de teste é um objeto que fornece um único método, run (), que aceita um objeto TestCase ou TestSuite como um parâmetro e retorna um objeto de resultado. O TestResult classe é fornecida para uso como objeto de resultado. unittest fornece a TextTestRunner como um corredor de teste exemplo que relata os resultados dos testes no fluxo de erro padrão por padrão. Corredores alternativos podem ser implementados para outros ambientes (tais como ambientes gráficos) sem qualquer necessidade de derivar de uma classe específica.

Suites de testes são implementados pela classe TestSuite. Esta classe permite que testes individuais e suites de teste passam ser agregadas; quando a suite é executada, todos os testes adicionados diretamente pela suite e na "child" suites de teste são executados.

Um corredor - runner, de teste é um objeto que fornece um único método, run(), que aceita um objeto TestCase ou TestSuite como um parâmetro e retorna um objeto de resultado. A classe TestResult é fornecida para uso como objeto de resultado. A classe unittest fornece a TextTestRunner como um exemplo do corredor de teste que relata os resultados dos testes no fluxo de erro padrão por padrão.Corredores alternativos podem ser implementadas para outros ambientes (tais como ambientes gráficos) sem qualquer necessidade de derivar de uma classe específica.



O módulo unittest fornece um rico conjunto de ferramentas para a construção e execução de testes. Esta secção demonstra que um pequeno subconjunto das ferramentas suficiente para satisfazer as necessidades da maioria dos utilizadores.

A testcase é criado pela subclasse unittest.TestCase. Os três testes individuais são definidos com métodos cujos nomes começam com as letras "test". Essa convenção de nomenclatura informa o executor de testes sobre quais métodos representam testes.

O cerne de cada teste é uma chamada para assertEqual() para verificar se há um resultado esperado; assertTrue() ou assertFalse() para verificar uma condição; ou assertRaises() para verificar se uma exceção específica começa levantado. Esses métodos são usados em vez da instrução assert então o corredor de teste - runner, pode acumular todos os resultados do teste e produzir um relatório.

O setup() e tearDown() métodos permitem definir instruções que serão executadas antes e depois de cada método de teste.

A classe TestCase fornece uma série de métodos para verificar e reportar falhas [7].


MethodChecks that
assertEqual(a, b)a == b
assertNotEqual(a, b)a != b
assertTrue(x)bool(x) is True
assertFalse(x)bool(x) is False
assertIs(a, b)a is b
assertIsNot(a, b)a is not b
assertIsNone(x)x is None
assertIsNotNone(x)x is not None
assertIn(a, b)a in b
assertNotIn(a, b)a not in b
assertIsInstance(a, b)isinstance(a, b)
assertNotIsInstance(a, b)not isinstance(a, b)

Instâncias Testcase fornecer três grupos de métodos: um grupo usado para executar o teste, o segundo grupo usado pela implementação de teste para verificar as condições e reportar falhas, e o terceiro grupo com alguns métodos de inquérito que permitam obter informações sobre o teste em si a ser recolhida [7].

class NomeTests(unittest.TestCase):
   '''
   '''
   def test_xxx(self):


É necessário que a classe tenha o nome Test pois informa ao compilador que este é um arquivo de teste. E que a classe herde de unittest.TestCase pois um dado de teste necessáriamente deve estender essa classe [4].

self.assertEqual(para1, para2)

O ponto crucial do teste, chamado assertEqual() é o método que realizando essa comparação entre o resultado experado (primeiro parâmetro) e o resultado obtido (segundo parâmetro) [4].



Os métodos do primeiro grupo (a execução do teste) são:

O método setUp() é chamado para preparar o suporte de ensaio. Isso é chamado imediatamente antes de chamar o método de ensaio; exceto AssertionError ou SkipTest, qualquer exceção gerada por esse método será considerado um erro em vez de uma falha no teste. A implementação padrão não faz nada [8].

O método tearDown() chamada imediatamente após o método de ensaio foi chamado e o resultado registado. Isso é chamado mesmo se o método de ensaio levantou uma exceção, para a implementação em subclasses pode precisar de ser particularmente cuidadosos sobre como verificar o estado interno. Qualquer exceção, exceto AssertionError ou SkipTest, levantadas por este método será considerado um erro em vez de uma falha no teste. Este método só será chamado se o setup () for bem sucedida, independentemente do resultado do método de ensaio. A implementação padrão não faz nada [9].


 Código dos testes sem erros. A importação na função setUp não funcionou.
 Introdução de erro no teste 2:
 Introdução de erro no teste 1:




Referências
[1] Mergulhando no Python - O guia rápido e prático para dominar o Python.; 2005; Mark Pilgrim; Ed. Alta Books.

[2] Modelagem e projetos baseados em objetos;  James Rumbaugh - Michael Blaha - William Premerlani - Frederich Eddy - William Lorensen; 1997; Ed. Campus.

[3] Estruturas de dados - Conceitos e técnicas de implementação. Marcos Vianna Villas - Andréa Gomes de Mattos Ferreira - Patrick Georges Leroy - Claudio Miranda - Christine Lefévre Bockman; 1993; Ed. Campus.

[4] https://gustavopinto.wordpress.com/2010/03/24/ferramentas-para-teste-de-software-em-python-parte-1/

[5] http://pt.slideshare.net/dorneles/testes-e-depuracao-de-codigo-com-python

[6] http://docs.python.org/library/unittest.html

[7] https://docs.python.org/2/library/unittest.html

[8] https://docs.python.org/2/library/unittest.html#unittest.TestCase.setUp

[9] https://docs.python.org/2/library/unittest.html#unittest.TestCase.tearDown

.

Nenhum comentário:

Postar um comentário