A construção de software é um processo complexo. Além de dominar as várias ferramentas e linguagens de programação, há também a compreensão de várias funções de desenvolvimento de software. Como a maioria de nós sabe, grandes projetos não envolvem apenas a codificação. Grandes projetos também envolvem outros recursos para levantamento de requisitos, prototipagem e testes.
O processo de validação de código é frequentemente referido como Garantia de Qualidade. No entanto, a frase é um pouco enganadora. Ao invés de assegurar a qualidade do código, o verdadeiro objetivo é medi-lo – muitas vezes à medida que o projeto evolui. Também conhecido como desenvolvimento controlado por testes (por exemplo, TDD), esta diferença sutil pode ser vista ao examinar os papéis da função de qualidade. Estes incluem o seguinte:
>
PARA UNIDADES DE TESTES?
Como mostrado, a medição da qualidade é frequentemente agrupada em atividades manuais e automatizadas. Como alguém interessado em algoritmos, códigos adicionais conhecidos como testes unitários funcionam para testar o seu projeto de software principal. Os testes unitários são geralmente escritos pelos desenvolvedores e são o foco em um ambiente TDD. Por exemplo, os testes unitários são essenciais para o desenvolvimento deste livro. Usando o framework iOS XCTest, vamos rever como os testes unitários funcionam no Swift.
Trabalhando com o XCTEST
Se você se familiarizou com os conceitos Swift revistos no livro, aprender como escrever testes unitários deve ser simples. Como discutido, os testes unitários funcionam para exercitar o código que carece de uma interface de usuário final. Para ilustrar, vamos rever casos de teste que exercitam uma estrutura de dados Stack.
Embora o livro não reveja os detalhes do Xcode Integrated Development Environment (IDE), deve-se notar que os testes podem ser executados por função, classe ou alvo. Usando o Xcode, testes unitários são estabelecidos adicionando um novo Test Target ao seu projeto de código primário. Uma vez configurado, os testes unitários podem ser executados a partir do IDE ou linha de comando.
TEST RULES
Embora não seja necessário, é considerado a melhor prática se o arquivo de teste unitário corresponder de perto à convenção de nomenclatura do(s) nosso(s) arquivo(s) de implementação. No nosso caso, vamos usar o StackTest.swift. Para obter acesso aos métodos e propriedades do Stack primário do nosso projeto principal, o arquivo também incluirá uma declaração de importação testável:
Como outras estruturas de teste de unidade, o XCTest funciona integrando funcionalidades da linguagem Swift com funções específicas relacionadas a testes. Os métodos essenciais são agrupados como asserções. Ao criar testes, o compilador irá reconhecer testes unitários com funções prefixadas com a palavra-chave test.
Unlike regular funções Swift, testes unitários são intencionalmente projetados como unidades lógicas auto-contidas. Como resultado, os métodos de teste não aceitam argumentos e não retornam valores. Alternativamente, os dados de teste podem ser gerenciados através de métodos helper e seqüências de inicialização / desmontagem. Considere o seguinte:
PlANEAMENTO DE TESTE
Como discutido, a operação principal de uma estrutura de dados Stack é adicionar e remover itens. Ao invés de escrever uma única função para testar todas as operações, nosso plano de teste isola cada grande operação de Pilha com seu próprio teste. Como visto no testPushStack, a afirmação XCTAssertTrue verifica a inicialização correta da variável Stack.count. O próximo passo envolve o exercício de Stack.push, iterando através da matriz de itens da lista de números. Para verificar se cada teste emprega os mesmos dados, numberList é preenchido usando o método de configuração da classe XCTestCase.
Com o teste de unidade para adicionar itens Stack implementado, podemos escrever o próximo teste para remover itens: