Ho un modulo che crea un'applicazione chiamata MyApp. Ne ho un altro che costruisce alcuni test per quell'app, chiamato MyAppTests. Entrambi costruiscono i propri APK e funzionano entrambi bene all'interno del mio IDE. Mi piacerebbe costruirli usando la formica in modo da poter sfruttare l'integrazione continua.Impossibile creare ed eseguire un progetto di prova Android creato utilizzando "ant create test-project" quando il progetto testato ha jar nella directory libs
Costruire il modulo dell'app funziona correttamente. Sto avendo difficoltà a compilare ed eseguire il modulo Test.
Utilizzando il suggerimento di Christopher da previous question, ho utilizzato android create test-project -p MyAppTests -m ../MyApp -n MyAppTests
per creare i file di build necessari per creare ed eseguire il mio progetto di test. Questo sembra funzionare alla grande (una volta rimosso un caso di test non necessario che ha costruito per me e ripristinato il mio AndroidManifest.xml su quello che stavo usando prima che venisse sostituito da android create
), ma ho due problemi.
Il primo problema: il progetto non viene compilato perché mancano le librerie.
$ ant run-tests
Buildfile: build.xml
[setup] Project Target: Google APIs
[setup] Vendor: Google Inc.
[setup] Platform Version: 1.6
[setup] API level: 4
[setup] WARNING: No minSdkVersion value set. Application will install on all Android versions.
-install-tested-project:
[setup] Project Target: Google APIs
[setup] Vendor: Google Inc.
[setup] Platform Version: 1.6
[setup] API level: 4
[setup] WARNING: No minSdkVersion value set. Application will install on all Android versions.
-compile-tested-if-test:
-dirs:
[echo] Creating output directories if needed...
-resource-src:
[echo] Generating R.java/Manifest.java from the resources...
-aidl:
[echo] Compiling aidl files into Java classes...
compile:
[javac] Compiling 1 source file to /Users/mike/Projects/myapp/android/MyApp/bin/classes
-dex:
[echo] Converting compiled files and external libraries into /Users/mike/Projects/myapp/android/MyApp/bin/classes.dex...
[echo]
-package-resources:
[echo] Packaging resources
[aaptexec] Creating full resource package...
-package-debug-sign:
[apkbuilder] Creating MyApp-debug-unaligned.apk and signing it with a debug key...
[apkbuilder] Using keystore: /Users/mike/.android/debug.keystore
debug:
[echo] Running zip align on final apk...
[echo] Debug Package: /Users/mike/Projects/myapp/android/MyApp/bin/MyApp-debug.apk
install:
[echo] Installing /Users/mike/Projects/myapp/android/MyApp/bin/MyApp-debug.apk onto default emulator or device...
[exec] 1567 KB/s (288354 bytes in 0.179s)
[exec] pkg: /data/local/tmp/MyApp-debug.apk
[exec] Success
-compile-tested-if-test:
-dirs:
[echo] Creating output directories if needed...
[mkdir] Created dir: /Users/mike/Projects/myapp/android/MyAppTests/gen
[mkdir] Created dir: /Users/mike/Projects/myapp/android/MyAppTests/bin
[mkdir] Created dir: /Users/mike/Projects/myapp/android/MyAppTests/bin/classes
-resource-src:
[echo] Generating R.java/Manifest.java from the resources...
-aidl:
[echo] Compiling aidl files into Java classes...
compile:
[javac] Compiling 5 source files to /Users/mike/Projects/myapp/android/MyAppTests/bin/classes
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/GsonTest.java:4: package roboguice.test does not exist
[javac] import roboguice.test.RoboUnitTestCase;
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/GsonTest.java:8: package com.google.gson does not exist
[javac] import com.google.gson.JsonElement;
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/GsonTest.java:9: package com.google.gson does not exist
[javac] import com.google.gson.JsonParser;
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/GsonTest.java:11: cannot find symbol
[javac] symbol: class RoboUnitTestCase
[javac] public class GsonTest extends RoboUnitTestCase<MyApplication> {
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest.java:6: package roboguice.test does not exist
[javac] import roboguice.test.RoboUnitTestCase;
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest.java:7: package roboguice.util does not exist
[javac] import roboguice.util.RoboLooperThread;
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest.java:11: package com.google.gson does not exist
[javac] import com.google.gson.JsonObject;
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest.java:15: cannot find symbol
[javac] symbol: class RoboUnitTestCase
[javac] public class HttpTest extends RoboUnitTestCase<MyApplication> {
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/LinksTest.java:4: package roboguice.test does not exist
[javac] import roboguice.test.RoboUnitTestCase;
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/LinksTest.java:12: cannot find symbol
[javac] symbol: class RoboUnitTestCase
[javac] public class LinksTest extends RoboUnitTestCase<MyApplication> {
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.java:4: package roboguice.test does not exist
[javac] import roboguice.test.RoboUnitTestCase;
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.java:5: package roboguice.util does not exist
[javac] import roboguice.util.RoboAsyncTask;
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.java:6: package roboguice.util does not exist
[javac] import roboguice.util.RoboLooperThread;
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.java:12: cannot find symbol
[javac] symbol: class RoboUnitTestCase
[javac] public class SafeAsyncTest extends RoboUnitTestCase<MyApplication> {
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyApp/bin/classes/com/myapp/activity/Stories.class: warning: Cannot find annotation method 'value()' in type 'roboguice.inject.InjectResource': class file for roboguice.inject.InjectResource not found
[javac] /Users/mike/Projects/myapp/android/MyApp/bin/classes/com/myapp/activity/Stories.class: warning: Cannot find annotation method 'value()' in type 'roboguice.inject.InjectResource'
[javac] /Users/mike/Projects/myapp/android/MyApp/bin/classes/com/myapp/activity/Stories.class: warning: Cannot find annotation method 'value()' in type 'roboguice.inject.InjectView': class file for roboguice.inject.InjectView not found
[javac] /Users/mike/Projects/myapp/android/MyApp/bin/classes/com/myapp/activity/Stories.class: warning: Cannot find annotation method 'value()' in type 'roboguice.inject.InjectView'
[javac] /Users/mike/Projects/myapp/android/MyApp/bin/classes/com/myapp/activity/Stories.class: warning: Cannot find annotation method 'value()' in type 'roboguice.inject.InjectView'
[javac] /Users/mike/Projects/myapp/android/MyApp/bin/classes/com/myapp/activity/Stories.class: warning: Cannot find annotation method 'value()' in type 'roboguice.inject.InjectView'
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/GsonTest.java:15: cannot find symbol
[javac] symbol : class JsonParser
[javac] location: class com.myapp.test.GsonTest
[javac] final JsonParser parser = new JsonParser();
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/GsonTest.java:15: cannot find symbol
[javac] symbol : class JsonParser
[javac] location: class com.myapp.test.GsonTest
[javac] final JsonParser parser = new JsonParser();
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/GsonTest.java:18: cannot find symbol
[javac] symbol : class JsonElement
[javac] location: class com.myapp.test.GsonTest
[javac] final JsonElement e = parser.parse(s);
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/GsonTest.java:20: cannot find symbol
[javac] symbol : class JsonElement
[javac] location: class com.myapp.test.GsonTest
[javac] final JsonElement e2 = parser.parse(s2);
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest.java:19: cannot find symbol
[javac] symbol : method getInstrumentation()
[javac] location: class com.myapp.test.HttpTest
[javac] assertEquals("MyApp", getInstrumentation().getTargetContext().getResources().getString(com.myapp.R.string.app_name));
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest.java:62: cannot find symbol
[javac] symbol : class RoboLooperThread
[javac] location: class com.myapp.test.HttpTest
[javac] new RoboLooperThread() {
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest.java:82: cannot find symbol
[javac] symbol : method assertTrue(java.lang.String,boolean)
[javac] location: class com.myapp.test.HttpTest
[javac] assertTrue(result[0], result[0].contains("Search"));
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest.java:87: cannot find symbol
[javac] symbol : class JsonObject
[javac] location: class com.myapp.test.HttpTest
[javac] final JsonObject[] result = {null};
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest.java:90: cannot find symbol
[javac] symbol : class RoboLooperThread
[javac] location: class com.myapp.test.HttpTest
[javac] new RoboLooperThread() {
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest.java:117: cannot find symbol
[javac] symbol : class JsonObject
[javac] location: class com.myapp.test.HttpTest
[javac] final JsonObject[] result = {null};
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest.java:120: cannot find symbol
[javac] symbol : class RoboLooperThread
[javac] location: class com.myapp.test.HttpTest
[javac] new RoboLooperThread() {
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/LinksTest.java:27: cannot find symbol
[javac] symbol : method assertTrue(boolean)
[javac] location: class com.myapp.test.LinksTest
[javac] assertTrue(m.matches());
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/LinksTest.java:28: cannot find symbol
[javac] symbol : method assertEquals(java.lang.String,java.lang.String)
[javac] location: class com.myapp.test.LinksTest
[javac] assertEquals(map.get(url), m.group(1));
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.java:19: cannot find symbol
[javac] symbol : method getInstrumentation()
[javac] location: class com.myapp.test.SafeAsyncTest
[javac] assertEquals("MyApp", getInstrumentation().getTargetContext().getString(com.myapp.R.string.app_name));
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.java:27: cannot find symbol
[javac] symbol : class RoboLooperThread
[javac] location: class com.myapp.test.SafeAsyncTest
[javac] new RoboLooperThread() {
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.java:65: cannot find symbol
[javac] symbol : method assertEquals(com.myapp.test.SafeAsyncTest.State,com.myapp.test.SafeAsyncTest.State)
[javac] location: class com.myapp.test.SafeAsyncTest
[javac] assertEquals(State.TEST_SUCCESS,state[0]);
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.java:74: cannot find symbol
[javac] symbol : class RoboLooperThread
[javac] location: class com.myapp.test.SafeAsyncTest
[javac] new RoboLooperThread() {
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.java:105: cannot find symbol
[javac] symbol : method assertEquals(com.myapp.test.SafeAsyncTest.State,com.myapp.test.SafeAsyncTest.State)
[javac] location: class com.myapp.test.SafeAsyncTest
[javac] assertEquals(State.TEST_SUCCESS,state[0]);
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.java:113: cannot find symbol
[javac] symbol : class RoboLooperThread
[javac] location: class com.myapp.test.SafeAsyncTest
[javac] new RoboLooperThread() {
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.java:144: cannot find symbol
[javac] symbol : method assertEquals(com.myapp.test.SafeAsyncTest.State,com.myapp.test.SafeAsyncTest.State)
[javac] location: class com.myapp.test.SafeAsyncTest
[javac] assertEquals(State.TEST_SUCCESS,state[0]);
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.java:154: cannot find symbol
[javac] symbol : class RoboLooperThread
[javac] location: class com.myapp.test.SafeAsyncTest
[javac] new RoboLooperThread() {
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.java:187: cannot find symbol
[javac] symbol : method assertEquals(com.myapp.test.SafeAsyncTest.State,com.myapp.test.SafeAsyncTest.State)
[javac] location: class com.myapp.test.SafeAsyncTest
[javac] assertEquals(State.TEST_SUCCESS,state[0]);
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/StoriesTest.java:11: cannot access roboguice.activity.GuiceListActivity
[javac] class file for roboguice.activity.GuiceListActivity not found
[javac] public class StoriesTest extends ActivityUnitTestCase<Stories> {
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/StoriesTest.java:21: cannot access roboguice.application.GuiceApplication
[javac] class file for roboguice.application.GuiceApplication not found
[javac] setApplication(new MyApplication(getInstrumentation().getTargetContext()));
[javac] ^
[javac] /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/StoriesTest.java:22: incompatible types
[javac] found : com.myapp.activity.Stories
[javac] required: android.app.Activity
[javac] final Activity activity = startActivity(intent, null, null);
[javac] ^
[javac] 39 errors
[javac] 6 warnings
BUILD FAILED
/opt/local/android-sdk-mac/platforms/android-1.6/templates/android_rules.xml:248: Compile failed; see the compiler error output for details.
Total time: 24 seconds
Questo non è un problema difficile da risolvere. Non sono sicuro che sia la cosa giusta da fare, ma ho copiato le librerie mancanti (roboguice e gson) dalla directory MyApp/libs alla directory MyAppTests/libs e tutto sembra compilare bene.
Ma questo porta al secondo problema, al quale sono attualmente bloccato. I test compilare bene ma non verrà eseguito:
$ cp ../MyApp/libs/gson-r538.jar libs/
$ cp ../MyApp/libs/roboguice-1.1-SNAPSHOT.jar libs/
0 10:23 /Users/mike/Projects/myapp/android/MyAppTests $ ant run-testsBuildfile: build.xml
[setup] Project Target: Google APIs
[setup] Vendor: Google Inc.
[setup] Platform Version: 1.6
[setup] API level: 4
[setup] WARNING: No minSdkVersion value set. Application will install on all Android versions.
-install-tested-project:
[setup] Project Target: Google APIs
[setup] Vendor: Google Inc.
[setup] Platform Version: 1.6
[setup] API level: 4
[setup] WARNING: No minSdkVersion value set. Application will install on all Android versions.
-compile-tested-if-test:
-dirs:
[echo] Creating output directories if needed...
-resource-src:
[echo] Generating R.java/Manifest.java from the resources...
-aidl:
[echo] Compiling aidl files into Java classes...
compile:
[javac] Compiling 1 source file to /Users/mike/Projects/myapp/android/MyApp/bin/classes
-dex:
[echo] Converting compiled files and external libraries into /Users/mike/Projects/myapp/android/MyApp/bin/classes.dex...
[echo]
-package-resources:
[echo] Packaging resources
[aaptexec] Creating full resource package...
-package-debug-sign:
[apkbuilder] Creating MyApp-debug-unaligned.apk and signing it with a debug key...
[apkbuilder] Using keystore: /Users/mike/.android/debug.keystore
debug:
[echo] Running zip align on final apk...
[echo] Debug Package: /Users/mike/Projects/myapp/android/MyApp/bin/MyApp-debug.apk
install:
[echo] Installing /Users/mike/Projects/myapp/android/MyApp/bin/MyApp-debug.apk onto default emulator or device...
[exec] 1396 KB/s (288354 bytes in 0.201s)
[exec] pkg: /data/local/tmp/MyApp-debug.apk
[exec] Success
-compile-tested-if-test:
-dirs:
[echo] Creating output directories if needed...
-resource-src:
[echo] Generating R.java/Manifest.java from the resources...
-aidl:
[echo] Compiling aidl files into Java classes...
compile:
[javac] Compiling 5 source files to /Users/mike/Projects/myapp/android/MyAppTests/bin/classes
[javac] Note: /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.java uses unchecked or unsafe operations.
[javac] Note: Recompile with -Xlint:unchecked for details.
-dex:
[echo] Converting compiled files and external libraries into /Users/mike/Projects/myapp/android/MyAppTests/bin/classes.dex...
[echo]
-package-resources:
[echo] Packaging resources
[aaptexec] Creating full resource package...
-package-debug-sign:
[apkbuilder] Creating MyAppTests-debug-unaligned.apk and signing it with a debug key...
[apkbuilder] Using keystore: /Users/mike/.android/debug.keystore
debug:
[echo] Running zip align on final apk...
[echo] Debug Package: /Users/mike/Projects/myapp/android/MyAppTests/bin/MyAppTests-debug.apk
install:
[echo] Installing /Users/mike/Projects/myapp/android/MyAppTests/bin/MyAppTests-debug.apk onto default emulator or device...
[exec] 1227 KB/s (94595 bytes in 0.075s)
[exec] pkg: /data/local/tmp/MyAppTests-debug.apk
[exec] Success
run-tests:
[echo] Running tests ...
[exec]
[exec] android.test.suitebuilder.TestSuiteBuilder$FailedToCreateTests:INSTRUMENTATION_RESULT: shortMsg=Class ref in pre-verified class resolved to unexpected implementation
[exec] INSTRUMENTATION_RESULT: longMsg=java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
[exec] INSTRUMENTATION_CODE: 0
BUILD SUCCESSFUL
Total time: 38 seconds
Qualche idea di cosa sta causando il "ref classe in classe pre-verificata deliberato la realizzazione inaspettato" errore?
Sembra che questa sia la soluzione, ma quando si aggiungono quelle linee al mio build.xml, la formica si lamenta che -resource-src e -aidl non sono definiti (sebbene siano importati): Target "-resource-src" non esiste nel progetto "sdk_android_test". È usato dall'obiettivo "compilare". – Snicolas
Ok, ho avuto la versione sbagliata degli strumenti. Se ricevi lo stesso errore che ho ricevuto, prendi la nuova versione di compile in ou strumento android ant_rules * .xml file. – Snicolas
se posso chiedere, quale versione di sdk stai usando? Sto usando r16 e ancora ottenendo il "Target" -resource-src "non esiste nel progetto" – browep