“App did not start” com Calabash-android

Ao iniciar um projeto com Calabash-android para criar testes automatizados com utilização do Cucumber, me deparei com o erro “App did not start” quando tentava executar o Calabash-android.

Como havia atualizado algumas Gems, pensei que fosse algo decorrente dessas atualizações e comecei a buscar a causa desse erro. Depois de constatar que não estava relacionado às minhas atualizações, descobri que o erro decorria do uso de permissões no app que estava testando. Faltava a permissão de acesso à Internet no app (:-) Após adicionar a permissão no arquivo AndroidManifest.xml, problema resolvido!

Mas por que isso aconteceu?

Porque o Calabash-android, para interagir com a aplicação que está sendo testada, utiliza o protocolo HTTP entre o seu servidor (que é instalado no device ou simulador onde serão executados os testes) e a aplicação em teste. Assim, sem essa permissão habilitada, não era possível estabelecer uma conexão entre o servidor do Calabash e a aplicação. O seguinte erro foi mostrado no log da aplicação quando da tentativa do Calabash de estabelecer comunicação com a mesma:

Este log diz que não foi possível abrir um socket para conexão entre a aplicação e o servidor de testes requisitada pelo Calabash devido à permissão negada.

Após adicionar a permissão, gerei um novo apk e foi possível estabelecer a conexão com a aplicação e dar start nela. No log da aplicação no Android Studio vi o seguinte:

Ou seja \o/

Anúncios

Aplicando o padrão Home as Up na ActionBar do ANDROID

A partir do ANDROID  4.1 (API nível 16), é possível declarar o “pai” de uma Activity da seguinte forma:

Adicionando android:parentActivityName  na tag <activity>, no arquivo AndroidManifest.xml.

Para aplicativos que suportam Android 4.0 ou inferior, e incluem a Biblioteca de suporte, é preciso adicionar a tag <meta-data> dentro da tag <activity> . Em seguida, é preciso especificar a Activity “pai” como o valor de android.support.PARENT_ACTIVITY , combinando com o atributo android:parentActivityName.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<application ... >
    ...
    <!-- The main/home activity (it has no parent activity) -->
    <activity
        android:name="com.example.myapp.MainActivity" ...>
        ...
    </activity>
    <!-- A child of the main activity -->
    <activity
        android:name="com.example.myapp.DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.myapp.MainActivity" >
        <!-- Parent activity meta-data to support 4.0 and lower -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myapp.MainActivity" />
    </activity>
</application>

 

Agora adicione o botão de ação na ActionBar (a seta):

1
2
3
4
5
@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    getActionBar().setDisplayHomeAsUpEnabled(true);
}

A ação de clique será tratada no método onOptionsItemSelected:

1
2
3
4
5
6
7
8
9
10
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    // Id correspondente ao botão Up/Home da actionbar
    case android.R.id.home:
        NavUtils.navigateUpFromSameTask(this);
        return true;
    }
    return super.onOptionsItemSelected(item);
}

 

Fonte: http://helpdev.com.br/2014/03/25/android-implementando-corretamente-o-botao-voltar-na-actionbar-providing-up-navigation/