Robotium! – Framework de teste Automatizado no Android.

Ola Pessoal,

Nesse primeiro artigo, falaremos sobre testes automatizados de interface gráficas utilizando o framework Robotium:

O Robotium, é um framework voltado para os testes de interface gráfica de aplicativos Android. Sua principal função consiste em simular procedimentos que geralmente são executados por um analista de teste.
Tais como: Cadastro/Pesquisa/Alteração e deleção de um registro.

Os testes de interface gráfica são de mais alto nível do que os tradicionais testes unitários . Com ele conseguiremos simular um clique de um botão por exemplo, ao invés de testar um determinado trecho de código.
Com isso evitamos que o profissional de teste tenha que re-testar determinada funcionalidade todas as vezes que a mesma sofrer alteração. Como o procedimento esta automatizado, ele poderá ser executado pelo próprio desenvolvedor, com o mínimo de esforço sempre que for necessário. Poupando horas e horas de trabalho de uma equipe inteira de analistas de teste.

Vejamos o funcionamento

Primeiro vamos criar um projeto Android que chamaremos de CRUDSimples. Esse projeto basicamente terá uma tela de cadastro, com três componentes EditText que irão receber dados digitados pelo usuário da aplicação. A tela também terá um componente Button que ao ser clicado verificará se os campos (EditText) foram preenchidos. Caso sim, um componente TextView no final da tela receberá um texto com a String “FINALIZADO”, caso contrário o texto informado será “FALHA”.

Abaixo segue o código do Layout XML que será utilizado na Activity:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Nome:" />

    <EditText
        android:id="@+id/editTextNome"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="E-mail:" />

    <EditText
        android:id="@+id/editTextEmail"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:text="Telefone:" />

    <EditText
        android:id="@+id/editTextTelefone"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

     <TextView
         android:id="@+id/textViewLegenda"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="" />

    <Button
        android:id="@+id/buttonEnviar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Enviar" />

</LinearLayout>

O código da classe Activity que representa um cadastro simples. Pode ser vista logo abaixo:

public class MainActivity extends Activity {

	private EditText editTextNome;
	private EditText editTextEmail;
	private EditText editTextTelefone;
	private TextView texViewLegenda;
	private Button buttonEnviar;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

         editTextNome = (EditText)findViewById(R.id.editTextNome);
         editTextEmail = (EditText)findViewById(R.id.editTextEmail);
         editTextTelefone = (EditText)findViewById(R.id.editTextTelefone);
         texViewLegenda = (TextView)findViewById(R.id.textViewLegenda);

         buttonEnviar = (Button)findViewById(R.id.buttonEnviar);

         buttonEnviar.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {

				if(isTodosCamposPreenchidos(editTextNome,editTextEmail,editTextTelefone)) {
					texViewLegenda.setText(R.string.finalizado);
				} else {
					texViewLegenda.setText(R.string.falha);
				}

			}
		});

    }

    private boolean isTodosCamposPreenchidos(EditText... editTexts) {
    	for(EditText editText : editTexts) {
    		String valor = editText.getText().toString();
    		if(valor == null || valor.length() == 0)
    			return false; // existe campos sem estarem preenchidos!
    	}

    	return true; // Todos os campos estão preenchidos
    }
}

Se tudo estiver correto teremos a seguinte tela:

Nesse momento nossa aplicação esta construída, agora falta criar o projeto que irá testa-la. No eclipse criamos esse projeto seguindo os passos.
File -> new ->Other -> Selecionar aba Android e selecionar Android Test Project
Quando aparecer o Wizard de criação de projetos você deve vincular o projeto de teste que esta criando com o projeto que deseja testar. O nome escolhido para esse projeto é TestCRUDSimples ele terá apenas uma classe a TestMainActivity. Veja que os nomes que escolhemos seguem um padrão. Primeiro colocamos o pré-fixo Test em seguida colocamos o alvo do teste.
Esse projeto deve ter a biblioteca do Robotium na pasta libs. (Link para download).

Segue o código da nossa classe de teste:

public class TestMainActivity extends ActivityInstrumentationTestCase2<MainActivity> {

	private Solo solo;

	public TestMainActivity() {
		super("com.example.crudsimples", MainActivity.class);
	}

	@Override
	protected void setUp() throws Exception {
		super.setUp();
		solo = new Solo(getInstrumentation(),getActivity());
	}

	public void testCadastroSimples() {
		solo.enterText(0, "Nome");
		solo.enterText(1, "Email");
		solo.enterText(2, "Telefone");
		solo.clickOnButton("Enviar");
		String finalizado = getActivity().getString(com.example.crudsimples.R.string.finalizado);
		assertTrue(solo.searchText(finalizado));
	}

	public void testCadastroSimplesFalha() {
		solo.enterText(0, "");
		solo.clickOnButton("Enviar");
		String falha = getActivity().getString(com.example.crudsimples.R.string.falha);
		assertTrue(solo.searchText(falha));
	}

}

Pontos importantes

O framework Robotium disponibiliza uma classe chamada Solo. Essa classe encapsula as ações de interação com a interface gráfica. Através dela conseguimos colocar textos em componentes EditText, pressionar buttons, selecionar elementos em uma lista, dentre varias outras ações.
Para exemplificar, podemos ver que o método enterText do Solo permite a entrada  de um texto em um componente EditText. Nesse caso informamos como paramêtro qual a posição do EditText no qual eu desejo de informar um texto, e como segundo paramêtro o texto que eu gostaria de colocar.

solo.enterText(0, "Nome");

Voltando a analisar a Classe de teste, percebemos que ela possui dois métodos. O primeiro testa se ao preencher todos os campos aparecerá a mensagem informando que o cadastro foi finalizado com sucesso através da String “Finalizado”. (Esse texto esta no arquivo Strings.xml).
O outro método verifica, se acontecer um click sem nenhum campo estar preenchido aparecerá a mensagem “Falha”. (Esse texto também esta no arquivo Strings.xml).

Conclusão

Com os testes automatizados o desenvolvedor consegue se sentir mais seguro para realizar manutenções evolutivas ou corretivas no software.
Pois ele conseguirá verificar instantaneamente se a sua modificação impactou de forma negativa em outro ponto do sistema.
Também constatamos que os testes de interface gráfica conseguem poupar horas de trabalho repetido da equipe de analistas de teste. Principalmente no momento de realizar os testes de regressão.
Se esse processo for manual, pode ser muito custoso e perigoso para a organização. Pois o profissional é um ser humano e nem sempre conseguirá realizar a mesma tarefa da mesma forma diversas vezes como é preciso.

Os testes automatizados ajudam a equipe a poupar tempo/esforço, além de gerar segurança para os desenvolvedores. Quer garantir a qualidade do seu software? Faça os testes automatizados!

Anúncios

, ,

  1. #1 by teste on Julho 31, 2012 - 12:55 am

    Muito bom

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s