既然谷歌已经添加了实验单元测试支持,那么如何在单元测试和仪器测试中共享资源呢?
例如,假设我有一个TestUtils.java我想在单元测试和仪器测试中访问的类.如果我将它放在我的src/test/java文件夹中,我的单元测试就可以访问它.如果我把它放在我的src/androidTest/java文件夹中,它将可以访问我的仪器测试.如何使它们都可以访问?
我现在看到的唯一解决方案是将它放入src/debug/java,但有更好的方法吗?
android unit-testing android-gradle-plugin android-instrumentation
我想窥探android中的Linkedlist.
List list = new LinkedList();
List spyData = Mockito.spy(list);
spyData.add("xxxx");
Run Code Online (Sandbox Code Playgroud)
但是,发生了异常.
java.lang.AbstractMethodError: abstract method "boolean org.mockito.internal.invocation.AbstractAwareMethod.isAbstract()"
at org.mockito.internal.invocation.InvocationImpl.callRealMethod(InvocationImpl.java:109)
at org.mockito.internal.stubbing.answers.CallsRealMethods.answer(CallsRealMethods.java:41)
at org.mockito.internal.handler.MockHandlerImpl.handle(MockHandlerImpl.java:93)
at org.mockito.internal.handler.NullResultGuardian.handle(NullResultGuardian.java:29)
at org.mockito.internal.handler.InvocationNotifierHandler.handle(InvocationNotifierHandler.java:38)
at com.google.dexmaker.mockito.InvocationHandlerAdapter.invoke(InvocationHandlerAdapter.java:49)
at LinkedList_Proxy.add(LinkedList_Proxy.generated)
at com.app.test.testmethod(mytest.java:202)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1858)
Run Code Online (Sandbox Code Playgroud)
libs的依赖关系是
dexmaker-1.2.jar
dexmaker-mockito-1.2.jar
mockito-core-1.10.19.jar
Run Code Online (Sandbox Code Playgroud)
即使我更新mockito-core-1.10.19.jar到mockito-core-2.0.31-beta.jar,
问题依然存在.
但是Mockito.mock(Linkedlist.class)没关系,我对这个问题没有任何想法.
谢谢.
我正在编写Android仪器测试的过程中,Robolectric自定义阴影不足.
理想情况下,我们希望在Android SDK的所有版本中编写灵活的代码,但我处于边缘情况,我需要为仅适用于Marshmallow的方法编写单独的单元测试.
我还需要编写一个仅适用于Lollipop的单元测试,因为操作系统依赖性存在差异(即java.lang.NoClassDefFoundError)
无论如何,我可以通过类似于Junit4的注释或类似于Robolectric所做的事情,如果SDK不适合它可以忽略运行测试吗?
我不想写这样的代码:
// MarshmallowWidgetTest.java
@Test
public void testPrintName()
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
{
// ...asserts...
}
}
// LollipopWidgetTest.java
@Test
public void testPrintName()
{
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP)
{
// ...asserts...
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试为我的MainActivity编写一个检测测试.我按照这里给出的答案.Android Studio仍无法找到任何测试.我在androidTest文件夹中有ApplicationTest.java类.这是班级的内容:
package com.example.monicamarcus.mymusicplayer
import android.app.Activity;
import android.test.ActivityInstrumentationTestCase2;
import com.example.monicamarcus.mymusicplayer.MainActivity;
public class ApplicationTest extends ActivityInstrumentationTestCase2<MainActivity> {
public ApplicationTest() {
super(MainActivity.class);
}
public void testNextTrackButton() throws Exception {
Activity activity = getActivity();
Button nextButton = (Button) activity.findViewById(R.id.nextTrackBt);
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
nextButton.performClick();
assertTrue(currentPosition < songList.size());
}});
activity.finish();
}
}
Run Code Online (Sandbox Code Playgroud)
这个测试类出了什么问题?还是测试?我没有得到任何错误,它只是没有找到任何测试运行.运行ApplicationTest后,输出以以下行结束:
Running tests
Test running startedFinish
Empty test suite.
Run Code Online (Sandbox Code Playgroud)
这是app的build.gradle文件:
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.example.monicamarcus.mymusicplayer"
minSdkVersion 16
targetSdkVersion …Run Code Online (Sandbox Code Playgroud) 我正在开发一个项目,我们正在尝试使用ANDROID TEST ORCHESTRATOR,因为它可以隔离崩溃的明显好处.但是在执行测试套件时,在我看来,当协调器为每个测试用例启动一个新进程时,套件执行的测试覆盖率报告总是显示不完整的数据(主要是测试中出现的最后一个测试用例的数据)套房).
所以我想知道有没有办法克服这个问题,并为测试套件中现有的所有仪器化测试生成一个jacoco代码覆盖率报告.
android code-coverage orchestration android-testing android-instrumentation
我正在尝试在 gitlab-ci 中设置仪器测试。但是,该作业卡在了以下消息的某个点上:
PANIC:缺少“x86”CPU 的模拟器引擎程序。
这是我正在使用的 ci 配置。管道构建成功运行,直到测试阶段(debugTests),但最终在 instrumentation_tests 失败。
image: openjdk:8-jdk
variables:
ANDROID_COMPILE_SDK: "28"
ANDROID_BUILD_TOOLS: "28.0.3"
ANDROID_SDK_TOOLS: "4333796"
before_script:
- apt-get --quiet update --yes
- apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1
- wget --quiet --output-document=android-sdk.zip https://dl.google.com/android/repository/sdk-tools-linux-${ANDROID_SDK_TOOLS}.zip
- unzip -d android-sdk-linux android-sdk.zip
- echo y | android-sdk-linux/tools/bin/sdkmanager "platforms;android-${ANDROID_COMPILE_SDK}" >/dev/null
- echo y | android-sdk-linux/tools/bin/sdkmanager "platform-tools" >/dev/null
- echo y | android-sdk-linux/tools/bin/sdkmanager "tools" >/dev/null
- echo y | android-sdk-linux/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS}" >/dev/null
- export ANDROID_HOME=$PWD/android-sdk-linux
- export ANDROID_AVD_HOME=$HOME/.android/avd
- …Run Code Online (Sandbox Code Playgroud) 我有一个多模块项目。我希望能够分别运行我为这些模块编写的仪器测试。当我运行测试并初始化活动时,我不断遇到以下错误。
默认 FirebaseApp 在此过程中未初始化。确保首先调用 FirebaseApp.initializeApp(Context)。
我尝试在测试代码中使用测试应用程序的上下文显式调用此函数,但无济于事。我知道 firebase 是通过配置文件设置的,但我没有明确调用它来设置它。在实际应用程序启动之前,它会通过内容提供商(阅读博客)自动初始化。
因为这将是一个静态调用,并且我们没有显式调用它,所以我也看不到模拟它的方法。有没有办法在我的模块中完全禁用 UITest 运行的 firebase ?
我正在为我的Android应用程序设置一个Jenkins节点(在Mac OS X上)运行检测测试.
我的Jenkins项目启动Android模拟器并运行Gradle任务:app:connectedAndroidTest.但是任务一直是不稳定的,有时候能够很好地运行测试,但大多数情况下失败并出现以下错误:
:app:connectedAndroidTest FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:connectedAndroidTest'.
> com.android.builder.testing.api.DeviceException: No connected devices!
Run Code Online (Sandbox Code Playgroud)
经过一番调查,我发现:
adb devices 显示处于在线状态的模拟器;adb shell am instrument 工作得很好;因此我可以说问题是:app:connectedAndroidTest没有检测到正在运行的模拟器.
我已经半成了一个安装APK并运行的shell脚本am instrument,但后者不会生成与JUnit兼容的输出.
所以在做额外的工作之前,我想知道如何"修复"Gradle任务以便它检测到模拟器.我也很乐意获得进一步查明问题的建议,例如找出Gradle任务在我的机器上工作的原因.
是否可以仅更改“ BuildConfig仪器测试”中的字段?
这背后的当前动机是,我想将应用程序的URL指向仅用于Instrumentation测试的另一台服务器(即本地模拟服务器)。这些网址是通过buildConfigField中的build.gradle进行配置的,用于多种应用。
我最近升级到了Android Studio 3.2.1 / com.android.tools.build:gradle:3.2.1,并注意到当我运行Instrumentation Tests时,有很多新输出阻塞了我要查看的日志。这是一个小预览:
07:38:28 V/InstrumentationResultParser: INSTRUMENTATION_STATUS_CODE: 1
07:38:28 V/InstrumentationResultParser: INSTRUMENTATION_STATUS: class=com.zach.testapp.ExampleInstrumentedTest
07:38:28 V/InstrumentationResultParser: INSTRUMENTATION_STATUS: current=1
07:38:28 V/InstrumentationResultParser: INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
07:38:28 V/InstrumentationResultParser: INSTRUMENTATION_STATUS: numtests=1
07:38:28 V/InstrumentationResultParser: INSTRUMENTATION_STATUS: stream=.
07:38:28 V/InstrumentationResultParser: INSTRUMENTATION_STATUS: test=useAppContext
07:38:28 V/InstrumentationResultParser: INSTRUMENTATION_STATUS_CODE: 0
07:38:28 V/InstrumentationResultParser: INSTRUMENTATION_RESULT: stream=
对于具有单个Instrumentation测试的新项目,将显示超过50行文本作为输出。在我的“主要”项目中,我进行了数百次Instrumentation测试,这使输出很难读取有意义的信息(例如失败),因为我必须滚动很多。
有没有办法禁用此日志记录?
android android-studio android-gradle-plugin android-instrumentation
android ×10
java ×2
unit-testing ×2
dexmaker ×1
firebase ×1
gitlab-ci ×1
gradle ×1
mockito ×1
robolectric ×1
testing ×1