Como Automatizar Testes de aplicações Android – Parte 2

Olá pessoal.  Estou de volta para dar continuidade a meu último post sobre automação de testes para aplicações Android e neste post vou detalhar como implementei a nossa calculadora fajuta do Bdb para que possamos entender os conceitos básicos de Android e depois conseguirmos automatizar o testes para esta plataforma.

Primeiramente, como falei no post anterior temos que alinhar o ambiente de desenvolvimento que estamos usando. No meu caso eu uso o Eclipse Classic 3.6.2  instalei o plugin ADT. Para mais detalhes de como configurar seu ambiente, veja aqui.

Como todo começo de projeto, vamos no menu principal do eclipse: File->New->Other… e la na janela wizard temos a opção Android Project que nos leva a seguinte tela que devemos colocar o nome do projeto (Calculadora). Depois de colocar o nome do projeto e clicarmos em Next, vamos para a tela que devemos selecionar o Build Target. Como todos devem saber o Android já evoluiu bastante desde do seu surgimento no mercado  com a versão 1.5 mais conhecida como Cupcake até o mais recente e famosa versão 4.o ou Ice Cream Sandwich que promete integrar todo o ecosistema entre smartphones e tablets, mas isso não vem ao caso aqui. No caso da nossa calculadora, ela foi implementada para a versão 2.3.1 (API Level 9)  e é o que eu recomendo para que todos usem no momento para que possamos ter um alinhamento das atividades aqui no post.

Depois que escolhermos o Build Target, vamos para a seguinte tela na qual definimos o nome do pacote no qual nossa activity principal ficará disponível  e também já vamos ter uma sugestão do nome da activity principal que é o nome do projeto + a palavra Activity no final. Nesta última tela você verá também a opção de criar um projeto de teste para este projeto que você esta criando no momento, mas vamos deixar esta opção desmarcada e no próximo post vou mostrar como criamos um projeto de teste para esta aplicação.

Assim que o  nome do projeto, o Build Target, nome do pacote e o nome da activity principal são definidos, o projeto Calculadora vai ser criado com a seguinte estrutura:

Nosso primeiro passo vai ser no arquivo main.xml dentro de res/layout que é o arquivo responsável pela interface visual da activity que vamos implementar. No Android a estrutura da aplicação é dividida em algumas camadas e a camada de interface com o usuário é mais comumente definida no xml. O primeiro passo é selecionar o layout que vamos trabalhar na nossa aplicação, no nosso projeto a layout definido não vai fazer muita diferença, portando fica de livre escolha de vocês qual usar, no nosso código, definimos o relative layout. Para mais detalhe de cada layout suportando no Android, leiam aqui. No nosso projeto de calculadora vamos trabalhar com duas activities e dois xml de layout o primeiro xml (main.xml) temos um TextView (Nome da aplicação),  dois editText (Campos para usuario digitar os operandos) e 4 buttons (um botão para cada operador básico). O segundo xml (result.xml) de layout temos apenas um textView que é para exibir o resultado da operação selecionada pelo usuário na tela anterior.Obviamente poderíamos exibir o resultado na mesma tela mas fizemos dessa forma com um próposito que veremos no próximo post quando formos falar das 2 maneiras de automatizar os testes dessa calculadora.

Para ver como ficou os arquivos xml  e também os arquivos .java que vou explicar nos parágrafos seguintes, baixe o código da nossa aplicação neste link .

Depois de definido o layout vamos para a implementação em si. Primeiramente, vamos ao básico e criamos uma classe chamada Operators.java com todos os métodos de cada operação básica da nossa calculadora, esta classe será instanciada pela activity principal e seus métodos serão chamados de acordo com os eventos que a nossa activity principal tratar.

Na primeira activity, que é a nossa activity principal (CalculadoraActivity.java) definimos qual layout vamos usar (main.xml) e definimos também alguns atributos que vamos utilizar para pegar as instancias dos Views (componentes visuais, Ex: Buttons) que definimos no main.xml e no qual vamos tratar os eventos que serão gerados pelos usuários ao interagir com estes views,  como por exemplo o clique no botão (OnClick). A nossa segunda activity (ResultActivity.java) é a tela que simplesmente pega o resultado “empacotado” pela primeira activity e exibe no textview que esta definida pelo layout result.xml.

Um último detalhe e não menos importante é o arquivo strings.xml que fica dentro da pasta res/values. Nesse arquivo definimos algumas “variáveis” no qual podemos ter acesso de várias parte do cógido, como nos arquivos de layout, no código das activities, etc…
No nosso caso definimos o o valores para todos os views utilizados pela aplicação, como por exemplo o nome na aplicação que é definido no arquivo mais.xml para o TextView esta setado no arquivo strings.xml como app_name e seu respectivo valor é Calculadora.

Após todo esse trabalho a nossa calculadora fajuta do Bdb vai ficar com essa cara como na imagem aqui abaixo:

Bem, por enquanto já temos o suficiente para nos divertimos um pouco durante a semana e no nosso próximo post eu vou finalmente revelar como podemos fazer alguns testes automáticos para esta nossa calculadora fajuta. Aproveitem o restante da semana para por em prática os conceitos básicos  passados aqui e brinquem de alterar o código para entender um pouco mais como a coisa toda funciona. Uma ótima semana para todos e até o próximo post.

Injeção de Dependência e Spring

Quem nunca ouviu falar em injeção de dependência? Ou inversão de controle? Pois bem, Inversão de Controle (IoC – Inversion of control) é uma estrategia para inverter quem está no comando de realizar determinadas operações. Quando se fala em inversão de controle, geralmente também se fala no princípio de Hollywood, que prega o seguinte “Don’t call us, we’ll call you” que signfica que a responsabilidade de chamar (ou instanciar/inicializar) alguma coisa não é (mais) sua, e sim de outro alguém.

Não precisa nem falar mas existem diversos tipos de inversão de controle, mas vamos no ater a um tipo específico que é bem conhecido, a Injeção de Dependência. A responsabilidade de instanciar/inicializar uma determinada dependência, não mais pertence a classe que a usa, mas sim a esse outro alguém que comentamos acima (no caso do java pode ser o Spring, e no casos de linguagens mais novas como ruby já existe um controle nativo de injeção).

Spring possui um container de inversão de controle, que tem um Application Context, que é uma espécie de repositório aonde o spring inicializa e guarda cada entidade que você sinalizar que o spring deve controlar (chamados de components ou beans). Uma vez explicitado quais entidades o spring deve controlar, ele já consegue gerenciar e injetar essas dependências em todas as outras entidades que as utilizam (e você explicitou)

Para iniciar, um grande facilitador do Spring são as injeções de dependência via Annotations. Tanto para você configurar quais classes vão ser controladas pelo spring ( @Component ), quanto para você configurar aonde o spring deve injetar as dependências ( @Autowired ). Antes dessas annotations, cada component e cada injeção tinham que ser configuradasem em um arquivo chamado (applicationcontext.xml), só que com essas anotações, basta colocar uma configuração no applicationContext.xml configurando o spring para scanear os pacotes do projeto procurando pelas classes anotadas com essas annotations que comentei anteriormente.

<context:annotation-config/>
<context:component-scan base-package="com.bytesdontbyte"/>
Aqui segue um exemplo de uma classe que estará dentro do applicationContext, pois está anotada com a annotation @Component.
@Component
public class MovieFinder {
    private MovieFinder movieFinder;
    private Movie findMovie(String name) { ... }
}

Neste próximo trecho fictício de código abaixo, o componente declarado acima (MovieFinder) é usado sem ser inicializado, mas como o atributo está anotado com @Autowired,
então o próprio spring injetar a uma instância dessa entidade na classe.

@Component
public class MovieOperations {
    @Autowired
    private MovieFinder movieFinder;

    private boolean isMovieAvailable(){
      boolean result = false;
      if  (this.movieFinder.findMovie("lord of the rings") != null)
          result = true;
      return result;
   {
}

Espero que tenha sido proveitoso para aqueles que estão iniciando neste mundo de injeção de dependências/inversão de controle e etc 😉