Не может создать и работать, тестовый проект андроида, созданный с помощью “муравья, создают тестовый проект”, когда протестированный проект имеет банки в, освобождает каталог

У меня есть модуль, который создает приложение под названием MyApp. У меня есть другой, который создает некоторые тестовые сценарии для того приложения, названного MyAppTests. Они оба создают свой собственный APKs, и они оба хорошо работают из моего IDE. Я хотел бы создать их использующий муравья так, чтобы я мог использовать в своих интересах непрерывную интеграцию.

Создание модуля приложения хорошо работает. Я испытываю затруднения, заставляя Тестовый модуль скомпилировать и работать.

Используя подсказку Christopher от предыдущего вопроса, я использовал android create test-project -p MyAppTests -m ../MyApp -n MyAppTests создать необходимые файлы типа "build", чтобы создать и выполнить мой тестовый проект. Это, кажется, работает отлично (после того как я удаляю ненужный тестовый сценарий, который это создало для меня, и вернитесь мой AndroidManifest.xml к тому, который я использовал, прежде чем это было заменено android create), но у меня есть две проблемы.

Первая проблема: проект не компилирует, потому что он пропускает библиотеки.

$ 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 {
    [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 {
    [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 {
    [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 {
    [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 {
    [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

Это не тяжелая проблема решить. Я не уверен, что это - правильный поступок, но я скопировал недостающие библиотеки (roboguice и gson) от каталога MyApp/libs до каталога MyAppTests/libs, и все, кажется, компилирует прекрасный.

Но это приводит к второй проблеме, на которой я в настоящее время застреваю. Тесты компилируют прекрасный, но они не будут работать:

$ 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

Какая-либо идея, что вызывает "Класс касательно в предварительно проверенном классе, разрешенном к неожиданной реализации" ошибка?

28
задан Community 23 May 2017 в 12:23
поделиться

3 ответа

Проблема в том, что в скриптах сборки android ant есть ошибка, которая не включает каталог libs тестируемого проекта при компиляции проекта тестера. Если вы попытаетесь обойти это, скопировав библиотеки в каталог libs тестируемого проекта, вы столкнетесь с проблемами проверки классов во время выполнения, как это сделал я, на что указал fadden.

Решение заключается в изменении цели compile изначально в android android_test_rules.xml, чтобы добавить к директиве.

Вот пересмотренная compile цель. Если добавить ее в build.xml в вашем проекте TESTER, она будет иметь приоритет над той, что находится в android_test_rules.xml:

<!-- override "compile" target in platform android_rules.xml to include tested app's external libraries -->
<target name="compile" depends="-resource-src, -aidl"
            description="Compiles project's .java files into .class files">
    <!-- If android rules are used for a test project, its classpath should include
         tested project's location -->
    <condition property="extensible.classpath"
                       value="${tested.project.absolute.dir}/bin/classes" else=".">
        <isset property="tested.project.absolute.dir" />
    </condition>
    <javac encoding="ascii" target="1.5" debug="true" extdirs=""
            destdir="${out.classes.absolute.dir}"
            bootclasspathref="android.target.classpath"
            verbose="${verbose}" classpath="${extensible.classpath}">
        <src path="${source.absolute.dir}" />
        <src path="${gen.absolute.dir}" />
        <classpath>
            <fileset dir="${tested.project.absolute.dir}/libs" includes="*.jar" />
            <fileset dir="${external.libs.absolute.dir}" includes="*.jar" />
        </classpath>
    </javac>
</target>
13
ответ дан 28 November 2019 в 03:18
поделиться

Я не вижу фактического сообщения об ошибке в тексте выше, но думаю, что могу ответить.

Как правило, предупреждение возникает из-за того, что один и тот же код появляется в двух разных APK. Реализация в одном APK использовалась для предварительной проверки и оптимизации, но другая реализация используется во время выполнения. ВМ обнаруживает ситуацию и отклоняет класс, потому что проверка и оптимизация были выполнены с набором предположений, которые больше не соответствуют действительности.

Чтобы исправить это, убедитесь, что для виртуальной машины доступна только одна реализация класса. Для этого может потребоваться немного больше борьбы со сценариями сборки.

Вы можете просмотреть содержимое APK с помощью dexdump. (Также есть «dexlist», который немного более лаконичен, но я не помню, является ли он частью SDK.)

6
ответ дан 28 November 2019 в 03:18
поделиться

Пытались ли вы включить файлы .class в тестовый apk вместо создания новых файлов .class из исходного проекта? Это решило проблему в моем случае.

0
ответ дан 28 November 2019 в 03:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: