segunda-feira, 27 de outubro de 2008

Teste unitário para dispositivos móveis (SmartDevices)

O desenvolvimento de aplicativos para dispositivos móveis está cada vez mais difundido no mundo todo. Com essa onda de desenvolvimento nos deparamos com algumas situações novas, como, por exemplo, teste unitário de aplicações para dispositivos móveis. As aplicações para dispositivos móveis tem se tornado cada vez mais ricas em termos de utilização de recursos dos dispositivos. Antes o que parecia impraticável, hoje já é trivial, como utilizar uma base de dados local (SQLCe por exemplo). Com esses novos recursos e funcionalidades torna-se praticamente imprescindível utilizarmos testes unitários. E para facilitar nossa vida o Visual Studio 2008 tem suporte para testes unitários. É possível rodar o teste unitário tanto no dispositivo quanto no emulador.

Testes unitários

Como a audiência deste blog é bem variada, para quem não sabe o que é, teste unitário é uma forma de verificar se pequenas unidades de código estão funcionando corretamente. É a menor porção testável de uma aplicação. Idealmente, os testes unitários são independentes entre si e geralmente são desenvolvidos por programadores para garantir que o código elaborado por eles se enquadra nos requisitos do software e se esse código se comporta como o esperado.  Em termos de orientação a objetos, a menor porção possível para ser testada é um método. Caso tenha dúvidas a respeito de orientação a objetos, recomendo os excelentes post publicados pelo Eduardo Klein que falam dos aspectos básicos da orientação a objetos.

Pré-requisitos para os testes

Primeiro, além do Visual Studio 2008 Professional naturalmente, é necessário também um SDK para desenvolvimento de aplicações móveis, como Windows Mobile 5 SDK ou o Windows Mobile 6 SDK. O Visual Studio 2008 Pro vem com o SDK do PocketPC 2003 e do Windows CE pré-instalados. Nos testes que eu realizei, optei pelo Windows Mobile 6 SDK com um projeto para Windows Mobile 6 Professional (para .NET Framework 3.5).

Criando um projeto de testes

Os testes unitários podem ser criados a partir de um código fonte ou a partir de um assembly .NET. Nos testes que eu realizei, gerei os testes unitários a partir dos códigos fontes. Para criar os testes de uma maneira facilitada é só utilizar o Unit Test Wizard (Test - New Test). Neste processo é possível criar um novo projeto de teste unitário ou adicionar testes em um projeto de teste unitário já existente (verifique a opção Add to Test Project). Lembre-se de selecionar a opção Create a new Smart Device Visual C# Test Project..., ou adicione em um projeto de teste de Smart Device, caso contrário não irá aparecer os fontes da solução. Não vou entrar em muitos detalhes sobre isso aqui porque este processo é bem trivial. Após a geração dos testes você observará que foi criado um projeto que testa todas os métodos que foram selecionados. É possível executar todos os testes unitários ou selecionar os desejados, bem como clicar com o botão direito em cima de um método e pedir para ser executado. Outra observação que vale ser colocada aqui é que, além de gerar testes de todos os métodos públicos, o Wizard também gera testes para os métodos privados. Para acessar o método privado, é criado uma classe Acessor (com o nome <Classe a ser testada>_Acessor). Através dessa classe o teste unitário acessa e testa o método privado.

Debug do teste unitário

Ao tentar depurar o código dos testes unitários, notei que os breakpoints não eram atingidos. Com um pouco de pesquisa percebi que não era possível depurar testes unitários para Smart Devices. Porém, na documentação do próprio Visual Studio, encontrei um "contorno operacional", vulgo "gambiarra", para fazer o teste unitário funcionar em modo debug. Os passos são os seguintes:
  1. Habiltar o debug no dispositivo: Acesse a ferramenta Visual Studio Remote Registry Editor (que está dentro da pasta Visual Studio Remote Tools). Crie uma nova key em HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETCompactFramework de nome Managed Debugger. Adicione a esta chave um valor do tipo DWORD de nome AttachEnabled e com o valor 1.
  2. Coloque breakpoints no código: Coloque um breakpoint no ponto em que deseja parar a execução do teste. Mas não os breakpoints usuais, e sim coloque breakpoints com
    System.Diagnostics.Debugger.Break();
    Após este código, os breakpoints normais também serão atingidos.
  3. Inicie o teste unitário
  4. Espere o programa parar: Depois que o breakpoint é atingido, aparecerá uma janela de warning no dispositivo.
  5. Anexe (Attach) o processo do dispositivo ao Debugger do Visual Studio: No menu Debug do Visual Studio clique em Attach to Process, depois mude o Transport para Smart Device. Mude também o Qualifier para o dispositivo que está rodando o teste unitário e selecione SmartDeviceTestHost.exe na lista de processos (Avaliable Processes). Finalmente, clique em Attach.
Por último clique em continue no dispositivo e o código poderá ser depurado passo a passo.

Links

0 Comments: