Android - InstrumentationTestRunner

Я новичок в Android и немного ржавый на Java, исходя из фона .NET. Я разрабатываю автоматизацию тестирования для мобильного приложения, работающего на Android.

В настоящее время я просто запускаю тесты через командную строку с помощью Android Debug Bridge, но я получаю сообщение об ошибке при попытке выполнить любые тесты:

Во-первых, это ошибка, которую я получаю:

junit.framework.TestSuite $1: Неисправность в предупреждении: junit.framework.AssertionFailedError: Не найдено никаких тестов com.myapp.test.UITests        в android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)         в android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)         at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:529)         at android.app.Инструментация $InstrumentationThread.run(Instrumentation.java:1448)

Я использую эту команду adb, чтобы попытаться запустить тест (на корневом устройстве):

adb shell am instrument -e класс com.myapp.test.UITests -w com.myapp.test/android.test.InstrumentationTestRunner

Наконец, вот класс, который я пытаюсь запустить тесты:

package com.myapp.test;

import android.app.Activity;
import android.test.ActivityInstrumentationTestCase2;
import com.jayway.android.robotium.solo.Solo;
import junit.framework.Assert;

@SuppressWarnings("unchecked")
public class UITests extends ActivityInstrumentationTestCase2
{
    private static final String TARGET_PACKAGE_ID = "com.myapp.main";
    private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME = "com.myapp.main.activities.MainActivity";
    private static Class<?> launcherActivityClass;

    private Solo solo;
    private Activity activity;

    static 
    {
        try
        {
            launcherActivityClass = Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME);
        }
        catch(ClassNotFoundException e)
        {
            throw new RuntimeException(e);
        }
    }

    public UITests() throws ClassNotFoundException
    {
        super(TARGET_PACKAGE_ID, launcherActivityClass);
    }

    @Override
    protected void setUp()
    {
        activity = getActivity();
        solo = new Solo(getInstrumentation(), activity);

    }

    @Override
    public void runTest() throws Throwable
    {
        // Simple Test
        Assert.assertTrue(solo.searchText("Welcome"));
    }

    @Override
    protected void tearDown() throws Exception
    {
        try
        {
            solo.finalize();
        }
        catch(Throwable e)
        {
        }
        getActivity().finish();
        super.tearDown();
    }

}

Я должен делать что-то неправильно, но я не уверен, что. Я основывал свой код на примере, который я нашел на сайте Robotium.

Я был бы очень признателен, если бы кто-нибудь мог указать на мою ошибку.

Обновление - добавление файла манифеста в соответствии с запросом

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.myapp.test"
          android:versionCode="1"
          android:versionName="1.0">

    <uses-sdk android:minSdkVersion="3" />

    <application android:icon="@drawable/icon" android:label="@string/ws_app_name">
        <uses-library android:name="android.test.runner" />
    </application>

    <instrumentation android:name="android.test.InstrumentationTestRunner"
                     android:targetPackage="com.myapp.main"
                     android:label="My App Tests"/>
</manifest>

Ответы

Ответ 1

Мне удалось это понять, я не понимал, что каждое имя функции тестирования должно начинаться с "теста", как описано здесь.

Ответ 2

Все имя метода тестирования должно начинаться с теста (с учетом регистра).

Пример:

public void testMethod1(){
/..
../
}

Ответ 3

Я решил это, установив File/Project Settings/Flavors/ Test Instrumentation Runner на android.support.test.runner.AndroidJUnitRunner