- OCPJD 6, OCPWCD 5 - Programador iOS desde 2014 - Graduado em Sistemas de Informação pela FRB (2008) - Pós-Graduado em Desenvolvimento de Aplicativos e Games para Dispositivos Móveis pela FIAP (2015) - Contribuinte Open Source - Autor do POD York
código é inversamente proporcional ao percentual de cobertura por testes unitários. Não é um mero preciosismo. 70% de cobertura por testes unitários parece alto, porém, resulta em 30% de chance de se causar mudança não intencional que só será percebida posteriormente (geralmente, quando o código está em produção). Apesar de parecer irreal, 100% de cobertura por testes unitários veda alterações indesejadas em produção.
comportamento não foi alterado. Assegura que alterações feitas no código não causaram impacto indesejado em quem o utiliza. Idealmente, testa pontualmente um método. Porém, na realidade é comum agrupar pequenos conjuntos comuns de funcionalidade e as testar em conjunto.
não estão prontos. Possibilita que as demais funcionalidades dependentes do objeto sejam feitas antes do objeto final estar completo. Utilizado em testes para simplificar os cenários. Ao invés de utilizar uma grande quantidade de código para montar o cenário de testes - muitas vezes composto de uma grande quantidade de objetos auxiliares, que não são o interesse do cenário - estes objetos são trocados para facilitar o cenário de interesse. Existem mocks parciais (partial mock), mocks completos (full mock), e mocks para protocolos (protocol mock).
um protocolo para fins de teste, nos casos em que apenas se precisa verificar se o método foi chamado (verify). Mocks parciais alteram a classe do objeto “mockado”. Chamadas com referência ao objeto original serão afetadas também. Mocks completos facilitam o uso de classes com métodos de init estáticos (ex: Singletons). Deve-se usar o mock parcial sempre que possível.
swizzling para substituir uma implementação (IMP) pela desejada. Este objeto é um stub. Funcões em C são chamadas “através” do runtime e, portanto, não podem ser trocadas com swizzling. Desta forma, elas não podem ser “mockadas”. Neste caso, deve-se trocar a lib como um todo. Estudos em andamento. Deve-se desativar o mock ao fim do teste.
Substitui os testes feitos diretamente com XCTest. Segue o modelo “Given”, “When”, “Then" “AAA" : “Arrange”, “Act”, “Assert”: Preparar o Cenário. Execute o método a ser testado. Verifique o resultado esperado.
criar o objeto do tipo x", ^{ __block id mockObj = nil; beforeEach(^{ mockObj = OCMPartialMock([MyRealObject new]); }); it(@“ele deve definir x como 1", ^{ expect(mockObj.x).to.equal(1); }); }); }); SpecEnd
rede. Possibilita que uma chamada a um endpoint específico utilizando um verbo HTTP específico retorne imediatamente um conteúdo definido pelo teste em questão. Este conteúdo pode ser criado a partir de um “fixture" local ou pode ser composto utilizando clojures. Possibilita definir todos os parâmetros da requisição HTTP retornada.
o que é comum se fazer é definir a @property ou @selector diretamente no arquivo de implementação - .m. Porém, para que elas sejam acessíveis ao teste, que é uma classe externa, elas precisam estar visíveis ao mesmo. Uma categoria pode ser criada para expor aos testes funcionalidades não-públicas. Use com bom senso.
e legibilidade. Agrupar os cenários em contextos permitem que beforeEach, beforeAll, afterEach e afterAll compartilhem código que seria repetido para todos os teste de um determinado contexto. O Contexto que criar o mock deve finalizar o uso do mesmo. Idealmente, testes devem apontar de forma inequívoca para o que foi quebrado.
agregam complexidades aos cenários de teste: Estados compartilhados influenciam em pontos não previstos - Um teste pode quebrar por valores modificados por outros testes não relacionados, mas que compartilham um estado global. Valores alterados em um teste serão propagados a todos os demais testes.