Por que o teste do MVC Views é desaprovado?

23

Atualmente, estou preparando as bases para um aplicativo ASP.Net MVC e estou analisando que tipo de testes de unidade devo estar preparado para escrever. Eu já vi em vários lugares pessoas dizendo essencialmente 'não se incomode em testar seus pontos de vista, não há lógica e é trivial e será coberto por um teste de integração'.

Não entendo como isso se tornou a sabedoria aceita. Os testes de integração têm uma finalidade totalmente diferente dos testes de unidade. Se eu quebrar alguma coisa, não quero saber meia hora depois, quando meus testes de integração forem interrompidos, quero saber imediatamente.

Cenário de exemplo: digamos que estamos lidando com um aplicativo CRUD padrão com uma entidade do Cliente. O cliente tem um nome e um endereço. Em cada nível de teste, desejo verificar se a lógica de recuperação do Cliente obtém o nome e o endereço corretamente.

Para testar o repositório da unidade, escrevo um teste de integração para acessar o banco de dados. Para testar as regras de negócios, eu zombei do repositório, alimentei os dados apropriados das regras de negócios e verifiquei se meus resultados esperados foram retornados.

O que eu gostaria de fazer: Para testar a unidade da interface do usuário, zombei das regras de negócios, configurei minha instância esperada do cliente, renderize a exibição e verifique se a exibição contém os valores apropriados para a instância especificada.

O que estou parado de fazer: Para testar o repositório da unidade, escrevo um teste de integração, configuro um login apropriado, crie os dados necessários no banco de dados, abra um navegador, navegue até o cliente e verifique se a página resultante contém as informações apropriadas. valores para a instância que especifiquei.

Percebo que há sobreposição entre os dois cenários discutidos acima, mas a principal diferença é o tempo e o esforço necessários para configurar e executar os testes.

Se eu (ou outro desenvolvedor) remover o campo de endereço da exibição, não quero esperar que o teste de integração descubra isso. Eu quero é descoberto e sinalizado em um teste de unidade que recebe várias vezes ao dia.

Tenho a sensação de que não estou entendendo algum conceito-chave. Alguém pode explicar por que é ruim desejar um feedback imediato do teste sobre a validade de uma exibição do MVC? (ou se não for ruim, não é a maneira esperada de obter esse feedback)

Peter Bernier
fonte
1
"To unit-test the repository, I write an integration test"Espere o que? Isso não é um teste de unidade do repositório. Você está automatizando o teste, mas o código em teste ainda inclui o DAL e o banco de dados. Para testar o repositório por unidade, você o isola como nas regras de negócios.
StuperUser
O teste de unidade da exibição renderizada conforme o esperado é apenas um teste de unidade que seu mecanismo de modelagem funciona. É como se o teste de unidade do seu C compilado contivesse certos blocos de código da máquina, sua unidade testando o compilador e não o seu código.
Raynos 12/10
2
@ Raynos Respeitosamente, vou ter que discordar. Se eu (ou outro desenvolvedor) instalar a interface do usuário por engano para renderizar um atributo de dados no campo da interface do usuário para outro (por exemplo, 'Nome' no 'Sobrenome', isso não tem nada a ver com o mecanismo de modelo, nem é uma DAL ou emissão BR .. é claramente um problema que só seriam expostos na visão.
Peter Bernier
1
@ PeterBernier, você tem um bom argumento, mas acho difícil definir a linha entre "testar se o compilador funciona" e "testar se meu código funciona". Sem mencionar que os testes para a interface do usuário estão fortemente acoplados à interface do usuário. Qualquer alteração na interface do usuário faz com que os testes falhem. Você não pode realmente refatorar a interface do usuário sem causar falha no teste.
Raynos 12/10

Respostas:

9

O teste simples da interface do usuário é bastante fácil no ASP.NET MVC. Basicamente, tudo o que você precisa fazer é afirmar que o HTML retornado contém os elementos necessários. Embora isso garanta que a página HTML esteja estruturada da maneira esperada, ela não testa completamente a interface do usuário.

O teste adequado da interface do usuário da web requer uma ferramenta como o Selenium, que usa navegadores em sua máquina e garante que o JavaScript e o HTML estejam funcionando corretamente em todos os navegadores. O Selenium possui um modelo de cliente / servidor para que você possa ter um conjunto de máquinas virtuais com clientes Unix, Mac e Windows e o conjunto de navegadores comuns a esses ambientes.

Agora, um aplicativo MVC bem projetado (padrão, não estrutura) coloca a lógica importante nos modelos e controladores. Em resumo, a funcionalidade do aplicativo é testada quando você testa esses dois aspectos. As visualizações tendem a ter apenas lógica de exibição e são facilmente verificadas com inspeção visual. Devido ao fino processamento na visualização e a maior parte do aplicativo ser bem testada, muitas pessoas não pensam que a dor de testar a camada de visualização supera os benefícios obtidos por ela.

Dito isto, o MVC possui algumas boas instalações para verificar o DOM retornado pela solicitação. Isso reduz bastante a dor ao testar a camada de visualização.

Berin Loritsch
fonte
1
"Essencialmente, tudo o que você precisa fazer é afirmar que o HTML retornado contém os elementos necessários." É exatamente isso que estou tentando fazer e está se tornando não trivial. Você pode apontar para um link em que funcione com uma ação específica do controlador, em vez de simplesmente renderizar um controle? (Eu tenho trabalhado através de um par de write-ups, mas RenderPartial não está conseguindo o que eu quero fazer, sem sobrecarga significativa ..)
Peter Bernier
Você vai querer visitar mvccontrib.codeplex.com (MVC Contrib). Isso fornece ajuda que não foi incorporada ao idioma principal e foi recomendado no livro "Test-Drive ASP.NET MVC" (programadores pragmáticos). Ainda acho que o Selenium é uma combinação melhor para os testes do View.
Berin Loritsch
TesteHelper (MVC Contrib): mvccontrib.codeplex.com/…
Berin Loritsch
Selenium (no meu caso Selenium RC) é o que vou usar nos meus testes de integração. O que eu quero é que uma falha aconteça antes desse ponto.
Peter Bernier
2
@ Peter: Seu comentário sobre seus esforços serem "não triviais" é exatamente o motivo pelo qual as visualizações de teste de unidade são mal vistas. Consequentemente, uma estratégia típica é tornar as visualizações o mais finas possível (ou seja, sem lógica de negócios), para que a maioria dos testes de unidade possa ocorrer em outro lugar (geralmente no ViewModel). As visualizações em si podem ser verificadas por inspeção visual ou com uma ferramenta de teste de interface do usuário como o Selenium.
Robert Harvey
7

Eu não diria que é desaprovado. Em vez disso, esse sentimento é o resultado do fato de que as exibições MVC de teste de unidade (pelo menos da variedade aspx) são bastante difíceis, porque as exibições aspx dependem demais dos WebForms, que são bastante testáveis. Portanto, argumenta-se que não vale a pena o esforço, porque as visões tendem a não ser tão complicadas.

É claro que as visualizações podem ficar bastante complicadas, por isso é sua escolha.

marcind
fonte
3
As visualizações do ASP.NET MVC não estão vinculadas aos Webforms, até onde eu saiba. Um dos grandes pontos do ASP.NET MVC não é o Webforms?
Adam Lear
Meu ponto de vista é que é preciso mais esforço humano para escrever os testes de integração para cobrir a interface do usuário do que escrever 'testes de unidade' reais para cobrir as visualizações. É por isso que estou tentando entender um pouco da resistência que parece existir para escrever testes de unidade para as visualizações.
quer
As visualizações @Anna Aspx são criadas sobre WebForms. Eles derivam da System.Web.UI.WebControls.Pageclasse, usam <asp:ContentPlaceholder>controles etc. A maneira como o MVC os executa evita grande parte do pipeline de execução da Página normalmente associado aos WebForms, mas ainda usa muitas coisas dos WebForms nos bastidores.
marcind
Se você usar um mecanismo de exibição diferente (como o barbeador), poderá se afastar do mecanismo de Webforms.
The Muffin Man
6

Não tenho certeza de que isso seja mal visto. A testabilidade é um dos principais benefícios do uso do ASP.NET MVC. Confira o blog de Steve Sanderson para obter mais informações sobre isso.

Ele também escreveu o melhor livro ASP.MVC (IMO) do mercado. Ele não apenas ensina MVC, mas também vai além para ensinar as melhores práticas, incluindo práticas de teste.

Acho que preciso esclarecer um pouco as visualizações de teste de unidade - você pode criar testes de unidade em torno do resultado retornado do controlador (ActionResult, etc.). Você ainda precisará fazer outros testes para a interface do usuário e a interação reais.

Mark Freedman
fonte
"Você ainda precisará fazer outros testes para a interface real e a interação da interface do usuário". Esse é exatamente o meu ponto de questão. Por que os testes de interface do usuário se tornam repentinamente parte de 'outros testes' (ou seja, testes de integração). Eu já tinha visto muito do conteúdo de Steve Sanderson e foi isso que me levou a iniciar esse caminho, basicamente tentando replicar o que ele está fazendo com seu projeto 'MvcFakes' e se deparando com problemas com seu código sendo escrito para versões mais antigas do MVC. .
Peter Bernier
1

Você pode aprender como testar a Visualização retornada por uma ação do controlador, como testar os Dados da Visualização retornados por uma ação do controlador e como testar se uma ação do controlador o redireciona ou não para uma segunda ação do controlador, confira o seguinte URL, descreva neste breve artigo sobre o teste de exibição de dados no MVC .

Jaypee
fonte