Testes de unidade vs testes funcionais

Respostas:

254

Teste de unidade - teste de uma unidade individual, como um método (função) em uma classe, com todas as dependências simuladas.

Teste Funcional - AKA Integration Test, testando uma fatia da funcionalidade em um sistema. Isso testará muitos métodos e pode interagir com dependências como bancos de dados ou serviços da Web.

bpapa
fonte
170
Deixe-me discordar de "AKA Integration Test". Um teste de integração, verifica a integração entre 2 ou mais sistemas / subsistemas no seu código. Por exemplo, verificar uma consulta SQL por meio de um ORM, verifica se o ORM e o banco de dados funcionam bem juntos. Testes funcionais AKA End to End IMHO.
graffic 26/03
7
Concordo com @graffic Functional Test! = Teste de integração Você deve confundir a "integração" dos subcomponentes do sistema entre si, como o estado persistente, etc. Mas, em geral, o teste de integração tem um escopo muito mais amplo.
Nabster 13/03/2015
4
Não, não estava confuso sobre nada.
Bpapa 5/06/2015
3
Teste de integração Teste funcional IS-A. Mas não vice-versa. Google "teste funcional e não funcional" e verifique as "Imagens".
Andrejs
4
Esta resposta é simplesmente ERRADA! Teste funcional não está sequer perto de teste de integração ..
SOTN
517

Os testes de unidade informam ao desenvolvedor que o código está fazendo as coisas corretamente; testes funcionais informam ao desenvolvedor que o código está fazendo as coisas certas .

Você pode ler mais em Teste de unidade versus Teste funcional


Uma analogia da vida real bem explicada dos testes de unidade e testes funcionais pode ser descrita a seguir,

Muitas vezes o desenvolvimento de um sistema é comparado à construção de uma casa. Embora essa analogia não esteja correta, podemos estendê-la com o objetivo de entender a diferença entre testes unitários e funcionais.

O teste de unidade é análogo a um inspetor de construção que visita o canteiro de obras de uma casa. Ele está focado nos vários sistemas internos da casa, na fundação, na estrutura, na eletricidade, no encanamento e assim por diante. Ele garante (testa) que as partes da casa funcionem corretamente e com segurança, ou seja, cumpram o código de construção.

Os testes funcionais neste cenário são análogos ao proprietário que visita este mesmo canteiro de obras. Ele supõe que os sistemas internos se comportarão adequadamente, que o inspetor de obras esteja realizando sua tarefa. O proprietário está focado em como será viver nesta casa. Ele está preocupado com a aparência da casa, os quartos são de tamanho confortável, a casa atende às necessidades da família, as janelas em um bom local para apanhar sol da manhã.

O proprietário está realizando testes funcionais na casa. Ele tem a perspectiva do usuário.

O inspetor de obras está realizando testes de unidade na casa. Ele tem a perspectiva do construtor.


Como resumo,

Os testes de unidade são escritos da perspectiva dos programadores . Eles são feitos para garantir que um método específico (ou uma unidade ) de uma classe execute um conjunto de tarefas específicas.

Os testes funcionais são escritos da perspectiva do usuário . Eles garantem que o sistema esteja funcionando como os usuários esperam.

Anthony Forloney
fonte
18
A citação é um pouco vaga para alguém novo no conceito.
2
@ fig-gnuton, tentei elaborar para não tornar a descrição tão vaga. Dentro do link, eles fornecem um bom exemplo, eu poderia atualizar a resposta com a citação, se você acha que isso pode ajudar o OP.
Anthony Forloney
148
Talvez outra maneira de dizer que seria: "O teste de unidade garante que o código faça o que o programador deseja; os testes funcionais garantem que o programador esteja fazendo o que o cliente deseja"?
JS.
3
Eu gosto disso, mas o ajustaria. Um teste funcional garante que o aplicativo permita que o usuário execute uma ação. Um teste de unidade garante que o código se comporte como o programador espera.
Adam
2
Não é o que o programador deseja adere ao que o usuário final deseja? Por que escrever um teste que não atende ao que o cliente espera?
O.Badr
140
  • Um teste de unidade testa uma unidade de comportamento independente . O que é uma unidade de comportamento? É a menor parte do sistema que pode ser testada independentemente. (Esta definição é realmente circular, IOW não é realmente uma definição em tudo , mas parece funcionar muito bem na prática, porque você pode classificar-de compreendê-lo intuitivamente.)

  • Um teste funcional testa uma parte independente da funcionalidade.


  • Uma unidade de comportamento é muito pequena: embora eu absolutamente não goste desse mantra estúpido de "um teste de unidade por método", de uma perspectiva de tamanho , é quase certo. Uma unidade de comportamento é algo entre uma parte de um método e talvez alguns. No máximo, um objeto, mas não mais que um.

  • Uma parte da funcionalidade geralmente compreende muitos métodos e corta vários objetos e, muitas vezes, várias camadas da arquitetura.


  • Um teste de unidade seria algo como: quando eu chamo a validate_country_code()função e passo o código do país, 'ZZ'ele deve retornar false.

  • Um teste funcional seria: quando eu preencher o formulário de remessa com um código de país ZZ, eu deveria ser redirecionado para uma página de ajuda que me permita escolher meu código de país em um menu.


  • Os testes de unidade são escritos por desenvolvedores, para desenvolvedores, da perspectiva do desenvolvedor.

  • Os testes funcionais podem ser voltados para o usuário; nesse caso, eles são escritos pelos desenvolvedores juntamente com os usuários (ou talvez com as ferramentas e os usuários certos, mesmo pelos próprios usuários), para os usuários, da perspectiva do usuário. Ou eles podem estar enfrentando desenvolvedores (por exemplo, quando descrevem alguma parte interna da funcionalidade com a qual o usuário não se importa); nesse caso, eles são escritos por desenvolvedores, para desenvolvedores, mas ainda da perspectiva do usuário.


  • No primeiro caso, os testes funcionais também podem servir como testes de aceitação e como uma codificação executável de requisitos funcionais ou uma especificação funcional; no último caso, eles também podem servir como testes de integração.

  • Os testes de unidade mudam frequentemente, os testes funcionais nunca devem mudar em uma versão principal.


Jörg W Mittag
fonte
excelente resposta! uma coisa - "testes funcionais nunca devem mudar em uma versão principal" por que isso?
Lazer
5
@Lazer, @cdeszaq: Em muitos projetos, uma alteração no número da versão principal é usada para indicar incompatibilidade com versões anteriores e OTOH se a versão principal não for alterada, a compatibilidade com versões anteriores é garantida . O que significa "compatibilidade com versões anteriores"? Significa "não altera o comportamento visível do usuário". E os testes funcionais são uma codificação executável da especificação do comportamento visível do usuário. Assim, se o número principal não muda, então os testes funcionais não estão autorizados a alteração, quer e, inversamente, se os tets funcionais fazer mudança, então o número principal deve mudar também.
Jörg W Mittag
2
Nota: Eu não disse nada sobre a adição de testes funcionais! A inclusão ou não de funcionalidades que não existiam antes constitui uma alteração incompatível com versões anteriores, depende do projeto. Para o software do usuário final, provavelmente não. Mas para uma linguagem de programação? Talvez: a introdução de uma nova palavra-chave, por exemplo, torne os programas atualmente em funcionamento que usam essa palavra-chave como um nome de variável inválidos e, portanto, é uma alteração incompatível com versões anteriores.
Jörg W Mittag
3
@ JörgWMittag adora essa idéia: 'testes funcionais são uma codificação executável da especificação do comportamento visível do usuário' ... se outros super especialistas realmente concordam ou não, isso me ajuda com a pergunta original, com "a diferença entre -los"
Mike roedor
1
"Um teste funcional seria: quando eu preencher o formulário de remessa com um código de país ZZ, devo ser redirecionado para uma página de ajuda que me permita escolher meu código de país em um menu". Isso é meio exigente, mas eu chamaria isso de "teste de aceitação". O teste funcional testaria se a inserção de ZZ no formulário de envio encaminhava o usuário para o URL correto ou gerava uma exceção ou erro específico.
Bob Ray
98

TLDR:

Para responder à pergunta: O teste de unidade é um subtipo de teste funcional.


Existem dois grandes grupos: testes funcionais e não funcionais . A melhor ilustração (não exaustiva) que encontrei é esta (fonte: www.inflectra.com ):

insira a descrição da imagem aqui

(1) Teste de unidade: teste de pequenos trechos de código (funções / métodos). Pode ser considerado como teste funcional (caixa branca).

Quando as funções são reunidas, você cria um módulo = uma peça independente, possivelmente com uma interface do usuário que pode ser testada (teste do módulo). Depois de ter pelo menos dois módulos separados, cole-os e depois vem:

(2) Teste de integração: quando você junta duas ou mais partes de (sub) módulos ou (sub) sistemas e verifica se eles funcionam bem juntos.

Então você integra o 3º módulo, depois o 4º e o 5º, em qualquer ordem que você ou sua equipe entenderem, e quando todas as peças do quebra-cabeças estiverem juntas, vem

(3) Teste do sistema: teste do SW como um todo. Isso é basicamente "Teste de integração de todas as peças".

Se estiver tudo bem, então vem

(4) Teste de aceitação: construímos o que o cliente realmente pediu? Obviamente, o Teste de aceitação deve ser realizado durante todo o ciclo de vida , não apenas na última etapa, em que você percebe que o cliente queria um carro esportivo e você construiu uma van.

insira a descrição da imagem aqui

Andrejs
fonte
2
Vi muitas fotos como essa no google, que descrevem "Teste de unidade" como uma espécie de "Teste funcional". Mas por que outras respostas aqui descrevem um conceito absolutamente diferente: o "teste funcional" é um teste de ponta a ponta e o teste de unidade não é um teste funcional? Eu confundi. Existem duas "religiões" diferentes que definem o termo "Teste funcional" de maneira diferente ou o quê?
Ruslan Stelmachenko
Respostas (mesmo os altamente upvoted) pode estar errado também;)
Andrejs
1
Eu gosto da imagem, mas para o System Integration Testing, o quebra-cabeça deve parecer "completo", sem mais lugares para outras peças se conectarem.
Jonathon Reinhart
4
@ JonathonReinhart - não necessariamente. As arestas abertas podem representar fácil extensibilidade do sistema com novos recursos, o que é especialmente útil se você usar uma abordagem de desenvolvimento como o Agile.
Myles
Das várias respostas conflitantes acima, obviamente, não Functional Testé um termo padronizado e tem um significado diferente para pessoas diferentes.
Penghe Geng
12

"Teste funcional" não significa que você está testando uma função (método) no seu código. Significa, geralmente, que você está testando a funcionalidade do sistema - quando eu corro foo file.txtna linha de comando, as linhas file.txtficam invertidas, talvez. Por outro lado, um único teste de unidade geralmente cobre um único caso de um único método - length("hello")deve retornar 5 e length("hi")retornar 2.

Veja também a opinião da IBM na linha entre teste de unidade e teste funcional .

Mark Rushakoff
fonte
Bem, interessante, mas o link que você mostra significa algo diferente: funcional é sobre a função a ser executada durante a implementação, ou seja, testar do ponto de vista do usuário, que é uma função para o usuário.
Stefano Scarpanti
8

A distinção básica, no entanto, é que os testes funcionais testam o aplicativo de fora, do ponto de vista do usuário. Os testes de unidade testam a aplicação por dentro, do ponto de vista do programador. Os testes funcionais devem ajudá-lo a criar um aplicativo com a funcionalidade correta e garantir que você nunca o interrompa acidentalmente. Os testes de unidade devem ajudá-lo a escrever um código limpo e sem erros.

Extraído do livro "Python TDD" de Harry Percival

Humoyun Ahmad
fonte
8

Segundo o ISTQB, esses dois não são comparáveis. Teste funcional não é teste de integração.

O teste de unidade é um dos níveis de teste e o teste funcional é o tipo de teste.

Basicamente:

A função de um sistema (ou componente) é 'o que ele faz'. Isso geralmente é descrito em uma especificação de requisitos, uma especificação funcional ou em casos de uso.

enquanto

O teste de componentes, também conhecido como teste de unidade, módulo e programa, procura defeitos e verifica o funcionamento do software (por exemplo, módulos, programas, objetos, classes, etc.) que podem ser testados separadamente.

De acordo com o ISTQB, o teste de componente / unidade pode ser funcional ou não funcional:

O teste de componentes pode incluir testes de funcionalidade e características não funcionais específicas, como comportamento de recursos (por exemplo, vazamentos de memória), teste de desempenho ou robustez, bem como testes estruturais (por exemplo, cobertura de decisão).

Citações das Fundações de teste de software - certificação ISTQB

Dominik
fonte
Eu concordo com muitos fluff, mas de qualquer maneira eles são o maior jogador lá e essa pergunta foi sobre teoria, então eu acho que o ISTQB deve ser bom o suficiente.
Dominik
6

No Rails, a pasta unit destina-se a realizar testes para seus modelos, a pasta funcional destina-se a realizar testes para seus controladores e a pasta de integração destina-se a realizar testes que envolvem qualquer número de controladores interagindo. As luminárias são uma maneira de organizar dados de teste; eles residem na pasta de acessórios. O arquivo test_helper.rb mantém a configuração padrão para seus testes. você pode visitar isso .

Bhimasen Rautaray
fonte
3

A maneira como penso é assim: Um teste de unidade estabelece que o código faz o que você pretendia que ele fizesse (por exemplo, você queria adicionar os parâmetros aeb, na verdade você os adiciona e não os subtrai), Os testes funcionais testam que todo o código trabalha em conjunto para obter um resultado correto, de modo que o que você pretendia que o código realmente obtivesse o resultado certo no sistema.

Yishai
fonte
3

AFAIK, teste de unidade NÃO é teste funcional. Deixe-me explicar com um pequeno exemplo. Você deseja testar se a funcionalidade de login de um aplicativo Web de email está funcionando ou não, exatamente como um usuário faria. Para isso, seus testes funcionais devem ser assim.

1- existing email, wrong password -> login page should show error "wrong password"!
2- non-existing email, any password -> login page should show error "no such email".
3- existing email, right password -> user should be taken to his inbox page.
4- no @symbol in email, right password -> login page should say "errors in form, please fix them!" 

Nossos testes funcionais devem verificar se podemos fazer login com entradas inválidas? Por exemplo. O e-mail não possui o símbolo @, o nome de usuário possui mais de um ponto (somente um ponto é permitido), .com aparece antes de @ etc.? Geralmente não! Esse tipo de teste entra nos seus testes de unidade.

Você pode verificar se entradas inválidas são rejeitadas dentro dos testes de unidade, conforme mostrado nos testes abaixo.

class LoginInputsValidator
  method validate_inputs_values(email, password)
    1-If email is not like [email protected], then throw error.
    2-If email contains abusive words, then throw error.
    3-If password is less than 10 chars, throw error.

Observe que o teste funcional 4 está realmente fazendo o que o teste unitário 1 está fazendo. Às vezes, os testes funcionais podem repetir alguns (não todos) os testes realizados por testes de unidade, por diferentes razões. Em nosso exemplo, usamos o teste funcional 4 para verificar se uma mensagem de erro específica aparece ao inserir uma entrada inválida. Não queremos testar se todas as entradas incorretas são rejeitadas ou não. Esse é o trabalho dos testes de unidade.

MasterJoe2
fonte
1
Bom ponto sobre testes funcionais geralmente com um escopo muito mais restrito do que testes unitários (em termos de testes funcionais serem mais focados em provar essencialmente que a função esperada é alcançada), mas eu diria que eles meio que descrevem dimensões diferentes ( composição em testes unitários vs finalidade em testes funcionais); alguns testes de unidade são testes funcionais, e alguns testes funcionais são testes unitários, mas também há muitos Venn que não se sobrepõem.
Myles
Bons exemplos do que está ou não no escopo de testes funcionais.
Myles
2

TESTE DA UNIDADE

O teste de unidade inclui o teste da menor unidade de código que geralmente são funções ou métodos. O teste de unidade é feito principalmente pelo desenvolvedor da unidade / método / função, porque eles entendem o núcleo de uma função. O principal objetivo do desenvolvedor é cobrir o código por testes de unidade.

Tem uma limitação de que algumas funções não podem ser testadas através de testes de unidade. Mesmo após a conclusão bem-sucedida de todos os testes de unidade; não garante a operação correta do produto. A mesma função pode ser usada em poucas partes do sistema enquanto o teste de unidade foi gravado apenas para um uso.

TESTE FUNCIONAL

É um tipo de teste de caixa preta em que o teste será realizado nos aspectos funcionais de um produto sem examinar o código. O teste funcional é feito principalmente por um testador de software dedicado. Incluirá técnicas positivas, negativas e BVA, usando dados não padronizados para testar a funcionalidade especificada do produto. A cobertura do teste é realizada de maneira aprimorada por testes funcionais do que por testes de unidade. Ele usa a GUI do aplicativo para teste, portanto, é mais fácil determinar pelo que exatamente uma parte específica da interface é responsável, em vez de determinar pelo que um código é responsável pela função.

Ashish Gupta
fonte
2

muito simplesmente podemos dizer:

  • caixa preta: teste da interface do usuário como teste funcional
  • caixa branca: teste de código como teste de unidade

leia mais aqui .

Alireza Rahmani Khalili
fonte
@fafl Sinto muito meu mau
Alireza Rahmani Khalili
1

Teste de unidade : - O teste de unidade é particularmente usado para testar o componente do produto por componente, especialmente enquanto o produto está em desenvolvimento. As ferramentas Junit e Nunit também ajudarão você a testar o produto conforme a Unidade. ** Em vez de resolver os problemas após a integração, é sempre confortável resolvê-lo no início do desenvolvimento.

Teste funcional: - No que diz respeito ao teste, existem dois tipos principais de teste como 1. Teste funcional 2. Teste não funcional.

Teste Não-Funcional é um teste em que um Testador testará que O produto executará todos os atributos de qualidade que o cliente não menciona, mas esses atributos de qualidade devem estar lá. Como: -Desempenho, Usabilidade, Segurança, Carga, Estresse, etc., mas no Teste Funcional : - O cliente já está presente com seus requisitos e aqueles devidamente documentados. A tarefa dos testadores é verificar cruzadamente se a Funcionalidade do Aplicativo está executando de acordo com ao sistema proposto ou não. Para esse propósito, o Testador deve testar a funcionalidade Implementada com o Sistema proposto.

mohit sarsar
fonte
0

O teste de unidade geralmente é feito pelos desenvolvedores. O objetivo de fazer o mesmo é garantir que o código funcione corretamente. A regra geral é cobrir todos os caminhos no código usando o teste de unidade.

Teste funcional : Esta é uma boa referência. Explicação do Teste Funcional

automationuser
fonte
6
Cole o texto mais importante na sua resposta, você nunca sabe quando a página pode ser removida, tornando o link inválido.
Andrejs