Passos para se ter um projeto com
Qualidade
Visão do cliente
- Bonito
- Tudo Funcionando
- Barato
Visão do chefe
- Não demora muito
- Gera lucros
- Cliente feliz
Visão do programador
Qualidade de Software
McCall
Operação
- Corretitude - Ele faz o que foi pedido?
- Confiabilidade - Ele é preciso?
- Eficiência - Ele tem boa performance?
- Integridade - Oferece segurança?
- Usabilidade - Fácil de usar?
- Adaptabilidade - Ele se adapta as necessidades do usuário?
Transição
- Portabilidade - Consigo movê-lo facilmente?
- Reusabilidade - Posso utilizar parte dele?
- Interoperabilidade - Ele trabalha com outros sofwares em conjunto?
Revisão
- Manutenibilidade - Fácil de corrigir?
- Flexibilidade - Fácil de mudar?
- Testabilidade - Posso testar seu funcionamento?
Como atingir esses fatores no Desenvolvimento?
Escrita do código - variáveis
- Utilize nomes semânticos. - Nada de variável "a"
- Nomes fáceis de escrever e ler. - Muito menos "xkttfjzyal"
- Use substantivos para classes e objetos. - User, Product
- Use verbos para métodos. - getUser, deleteProduct
Escrita do código - métodos
- Devem ser pequenos.
- Possuir uma única responsabilidade.
- Permitir reuso.
- Fácilmente testáveis.
#2
Don't comment bad code, rewrite it.
P. J. Plaugher
#3
Deixe a área de acampamento mais limpa do que encontrou.
#4
Tenha carinho no início
Ou
Conviva com os débitos técnicos.
Por que testar?
- Reduz o tempo gasto em análise e correção de bugs
- Facilita refatoração.
- Gera documentação.
- Melhora o design do código.
- Garante que o trabalho tenha qualidade.
TDD
Fluxo do teste
- Escrever o teste
- Escrever o código para o teste passar
- Escrever um segundo caso de teste
- Corrigir o código para que passe
- Escrever um terceiro caso de teste (se necessário)
- Refatorar o código
Pensando como testar
- O que o código precisa fazer?
- Que dados ele recebe?
- Que dados ele precisa retornar?
- Que ações precisam acontecer para o código rodar?
Padrão do teste
"Ele deve fazer isso quando aquilo"
"It should do that when this"
it('should return 4 when receive 2,2') {
expect(sum(2,2)).to.equal(4);
}
Tipos de Teste
Teste Unitário
É um simples e pequeno teste automatizado que prova o comportamento
de um único método.
- Evite ruído entre os testes (Isolamento).
- Escolha os melhores asserts para cada momento.
- Procure usar Mocks para chamadas externas.
- Utilize dele para organizar o design de seu código.
Testes de Integração
É um teste para validar se os componentes estão funcionando em conjunto.
- Cuidado para não criar um teste inútil.
- Isole o máximo possível dos ambientes.
Testes de Aceitação (E2E)
O teste de aceitação é realizado com o propósito de avaliar a qualidade externa do produto e, na medida do possível, também a qualidade em uso.
- Valide apenas o fluxo de funcionamento do projeto.
Spies
Como o nome sugere, spies são usados para vigiar informações sobre chamadas de funções (métodos). Um spy vai nos dizer se o método foi chamado, quantas vezes, quais argumentos foram passados, etc.
Quando usar spies?
São muito úteis para testar callbacks e como métodos são usados dentro do sistema. Os spies te permitem verificar se um outro método foi chamado dentro do método que você estáa testando.
it("should inspect jQuery.getJSON's usage of jQuery.ajax", function () {
sinon.spy(jQuery, "ajax");
jQuery.getJSON("/some/resource");
assert(jQuery.ajax.calledOnce);
});
Stubs
Stubs são como os spies, exceto por eles substituirem a função alvo. Podendo inclusive mudar o comportamento, assim como os valores e exceções levantadas.
Quando usar stubs?
- Controlar comportamento de um teste. Ex.: forçar uma exceção
- "Pular" uma parte não necessária do código. Ex.: execução de db
- Simplificar o teste de código assíncrono
Mocks
Mocks são métodos falsos (similares aos spies) com comportamento pré-programado (similar ao stub) e respostas/expectations pré-programados.
Quando usar mocks?
Mocks devem ser primariamente utilizados quando você precisa de um stub, mas precisa verificar múltiplos comportamentos num específico ponto.
it('should pass object with correct values to save only once', function() {
var info = { name: 'test' };
var expectedUser = { nameLowercase: info.name.toLowerCase() };
var database = sinon.mock(Database);
database.expects('save').once().withArgs(expectedUser);
setupNewUser(info, function() { });
database.verify();
database.restore();
});