Passos para se ter um projeto com


Qualidade

O que é 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?

#1

Tenha bom senso!

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.

#5

Faça testes!

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

  1. Escrever o teste
  2. Escrever o código para o teste passar
  3. Escrever um segundo caso de teste
  4. Corrigir o código para que passe
  5. Escrever um terceiro caso de teste (se necessário)
  6. 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, Stubs e Mocks

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();
});