#android #unit-testing
#Android #модульное тестирование
Вопрос:
У меня возникла другая проблема с использованием подкласса InstrumentationTestRunner.
Вот код для подкласса:
package com.jlptquiz.app.tests;
/**
*
*/
import junit.framework.TestSuite;
import android.test.InstrumentationTestRunner;
import android.test.InstrumentationTestSuite;
public class MyInstrumentationTestRunner extends InstrumentationTestRunner {
public TestSuite getAllTests(){
InstrumentationTestSuite suite = new InstrumentationTestSuite(this);
suite.addTestSuite(UtilsTestCase.class);
return suite;
}
public ClassLoader getLoader() {
return MyInstrumentationTestRunner.class.getClassLoader();
}
}
Вот модульный тест:
package com.jlptquiz.app.tests;
import com.jlptquiz.app.Utils;
import junit.framework.Assert;
import android.app.Activity;
import android.content.Context;
import android.net.wifi.WifiManager;
import android.test.ActivityInstrumentationTestCase2;
import android.util.Log;
public class UtilsTestCase extends ActivityInstrumentationTestCase2 {
private Context mContext;
private Utils utils;
public static String TAG = "GetResourceStringTestCase";
public UtilsTestCase() {
super("com.jlptquiz.app", Utils.class);
}
public void setup() {
try {
super.setUp();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mContext = this.getInstrumentation().getContext();
}
public void testRandomNumberEqaulsOne() {
utils = (Utils) this.getActivity();
int randNum = Utils.genRandomNumber(1, 1);
Integer actual = Integer.valueOf(randNum);
Integer expected = Integer.valueOf(1);
Assert.assertSame(expected, actual);
}
}
Вот манифест:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jlptquiz.app" android:versionCode="1" android:versionName="1.0">
<application android:name="AppState" android:debuggable="true"
android:clearTaskOnLaunch="true"
android:icon="@drawable/ic_icon" android:label="@string/app_name">
<activity android:name="JlptQuizStartActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="QuestionActivity"></activity>
<activity android:name="AnswerActivity"></activity>
<activity android:name="SettingsActivity"></activity>
<uses-library android:name="android.test.runner" />
</application>
<instrumentation android:label="AllTests"
android:name="com.jlpt.quiz.app.tests.MyInstrumentationTestRunner"
android:targetPackage="com.jlptquiz.app"/>
<uses-sdk android:minSdkVersion="5" />
</manifest>
И конфигурация запуска, конфигурация тестирования Android junit, указывает MyInstrumentationTestRunner в качестве ImplementationTestRunner.
Но я выдаю исключение «класс не найден» в MyInstrumentationTestRunner, согласно logcat:
/AndroidRuntime( 835): >>>>>> AndroidRuntime START com.android.internal.os.RuntimeInit <<<<<<
D/AndroidRuntime( 835): CheckJNI is ON
D/AndroidRuntime( 835): Calling main entry com.android.commands.am.Am
I/ActivityManager( 61): Force stopping package com.jlptquiz.app uid=10034
I/ActivityManager( 61): Start proc com.jlptquiz.app for added application com.jlptquiz.app: pid=843 uid=10034 gids={}
D/AndroidRuntime( 843): Shutting down VM
W/dalvikvm( 843): threadid=1: thread exiting with uncaught exception (group=0x40015560)
E/AndroidRuntime( 843): FATAL EXCEPTION: main
E/AndroidRuntime( 843): java.lang.RuntimeException: Unable to instantiate instrumentation ComponentInfo{com.jlptquiz.app/com.jlpt.quiz.app.tests.MyInstrumentationTestRunner}: java.lang.ClassNotFoundException: com.jlpt.quiz.app.tests.MyInstrumentationTestRunner in loader dalvik.system.PathClassLoader[/system/framework/android.test.runner.jar:/data/app/com.jlptquiz.app-1.apk:/data/app/com.jlptquiz.app-1.apk]
E/AndroidRuntime( 843): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3194)
E/AndroidRuntime( 843): at android.app.ActivityThread.access$2200(ActivityThread.java:117)
E/AndroidRuntime( 843): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:966)
E/AndroidRuntime( 843): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 843): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 843): at android.app.ActivityThread.main(ActivityThread.java:3647)
E/AndroidRuntime( 843): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 843): at java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime( 843): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
E/AndroidRuntime( 843): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
E/AndroidRuntime( 843): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 843): Caused by: java.lang.ClassNotFoundException: com.jlpt.quiz.app.tests.MyInstrumentationTestRunner in loader dalvik.system.PathClassLoader[/system/framework/android.test.runner.jar:/data/app/com.jlptquiz.app-1.apk:/data/app/com.jlptquiz.app-1.apk]
E/AndroidRuntime( 843): at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
E/AndroidRuntime( 843): at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
E/AndroidRuntime( 843): at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
E/AndroidRuntime( 843): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3191)
E/AndroidRuntime( 843): ... 10 more
W/ActivityManager( 61): Error in app com.jlptquiz.app running instrumentation ComponentInfo{com.jlptquiz.app/com.jlpt.quiz.app.tests.MyInstrumentationTestRunner}:
W/ActivityManager( 61): java.lang.ClassNotFoundException
W/ActivityManager( 61): java.lang.ClassNotFoundException: com.jlpt.quiz.app.tests.MyInstrumentationTestRunner in loader dalvik.system.PathClassLoader[/system/framework/android.test.runner.jar:/data/app/com.jlptquiz.app-1.apk:/data/app/com.jlptquiz.app-1.apk]
I/ActivityManager( 61): Force stopping package com.jlptquiz.app uid=10034
I/Pro
Есть идеи, где я здесь сбиваюсь с пути?
Ответ №1:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
**package="com.jlptquiz.app.tests"** android:versionCode="1" android:versionName="1.0">
<application android:name="AppState" android:debuggable="true"
android:clearTaskOnLaunch="true"
android:icon="@drawable/ic_icon" android:label="@string/app_name">
<activity android:name="JlptQuizStartActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="QuestionActivity"></activity>
<activity android:name="AnswerActivity"></activity>
<activity android:name="SettingsActivity"></activity>
<uses-library android:name="android.test.runner" />
</application>
<instrumentation android:label="AllTests"
android:name="com.jlpt.quiz.app.tests.MyInstrumentationTestRunner"
**android:targetPackage="com.jlptquiz.app.tests"/>**
<uses-sdk android:minSdkVersion="5" />
</manifest>
изменить
**package="com.jlptquiz.app.tests"**
**android:targetPackage="com.jlptquiz.app.tests"/>**
Ответ №2:
Выполнить
$ adb -s <serialno> shell pm list instrumentation
чтобы убедиться, что ваш инструментарий определен точно так, как вы ожидаете.
Затем убедитесь, что манифест вашего тестового проекта включает
<uses-library android:name="android.test.runner" />
И, наконец, запустите тесты.
Ответ №3:
В итоге я вернулся к документам Google и сделал то, что они рекомендуют, то есть настроил отдельный проект для тестирования. Это обрабатывает все manifest.xml материал для вас.