标签: android-testing

warning(junit.framework.TestSuite $ 1):Maven执行Android Test时构造函数中的异常

我设置了Maven的Android测试项目,并按照此处的说明进行操作.基本上我能够设置测试项目,甚至模拟器被识别,但我仍然无法在执行mvn install时在Maven中运行测试(在Eclipse中).如果我尝试执行它,我会收到以下错误:

测试失败:警告(junit.framework.TestSuite $ 1):构​​造函数中的异常:testPersistAndRead(java.lang.RuntimeException:Stub!(..)warning(junit.framework.TestSuite $ 1):构​​造函数中的异常:testFileNotExists(java.lang .RuntimeException:Stub!(..)warning(junit.framework.TestSuite $ 1):构​​造函数中的异常:testCreateFiles(java.lang.RuntimeException:Stub!(..)warning(junit.framework.TestSuite $ 1):构​​造函数中的异常:testFilesExist(java.lang.RuntimeException:Stub!(..)warning(junit.framework.TestSuite $ 1):构​​造函数中的异常:testAndroidTestCaseSetupProperly(java.lang.RuntimeException:Stub!(..)

surfire的输出告诉我它嵌套在AndroidTestCase中:

junit.framework.AssertionFailedError:构造函数中的异常:testPersistAndRead(java.lang.RuntimeException:Stub!at android.test.AndroidTestCase.(AndroidTestCase.java:5)[...]

这是我尝试运行的测试.

public class PersistenceManagerTest extends AndroidTestCase {

    private final String FILENAME_PREFIX = "test.";

    protected void setUp() throws Exception {
        super.setUp();
        deleteInternalStorageFile();

        MockContentResolver resolver = new MockContentResolver();
        RenamingDelegatingContext renamingDelegatingContext = new RenamingDelegatingContext(new MockContext(), getContext(), FILENAME_PREFIX);
        Context context = new IsolatedContext(resolver, renamingDelegatingContext);

        setContext(context);
    }

    //AfterClass
    protected void tearDown() {
        deleteInternalStorageFile();
    }

    public void testPersistAndRead() throws IOException {
        String testData = "foobar";

        PersistenceManager.persist(testData, FileType.JSONDATA); …
Run Code Online (Sandbox Code Playgroud)

junit android maven android-testing

2
推荐指数
1
解决办法
4924
查看次数

控制何时自动化测试结束 - Espresso

我正在测试一个不寻常的情况.我正在使用Espresso来编写我的测试.我知道Espresso和InstrumentationTestCase不是为了做到这一点.

我有一个我在其中一个课程中创​​建的监听器,它会通知我某个值的变化.我在我的测试套件中使用了监听器.

当我从侦听器获取值时,我需要声明值已更改为此类.

我的问题是测试将在我收到监听器的值之前结束.

    private void sendSpeedChanges() {
    setStaticSpeed(new Random().nextInt(10) + 2);
    try {
        runTestOnUiThread(new Runnable() {
            @Override
            public void run() {
                consoleActivity.onSpeedChanged(getStaticSpeed(), false);
            }
        });
    } catch (Throwable throwable) {
        throwable.printStackTrace();
    }

}

private void createSpeedDelegate() {
    EspressoMachineValues.setOnSpeedChangeListener(new EspressoMachineValues.OnSpeedChangeListener() {
        @Override
        public void onSpeedChanged(double speed) {
            //assert speed is correct.
            assertTrue(getStaticSpeed() == speed);
        }
    });

}
Run Code Online (Sandbox Code Playgroud)

这些是我正在使用的两种方法.这createSpeedDelegate()是最开始的电话.然后我打电话sendSpeedChanges.我需要做X次.


注意:

  • 检索信息大约需要200毫秒(平均而言).
  • sendSpeedChanges()在检查了价值之前我无法打电话onSpeedChange()
  • 我无法使用,Thread.sleep();因为监听器在主线程上.

我试过添加一个getInstrumentation().wait(2000);getInstrumentation().waitForIdleSync();很明显,没有工作.

在一个完美的世界里,我会这样做:

   for (int i …
Run Code Online (Sandbox Code Playgroud)

java android android-testing android-espresso

2
推荐指数
1
解决办法
2408
查看次数

在Android上锁定CPU以进行应用程序性能测试

我正试图在不同的CPU状态下测试应用程序在Android上的性能.因此,我想将CPU锁定在1000Mhz并读取读数,然后使CPU过载并读取读数.我的问题是:无论如何要锁定CPU和可能的RAM以某些锁定/冻结率?任何有关此文档的链接都将受到高度赞赏.

performance android cpu-usage cpu-speed android-testing

2
推荐指数
1
解决办法
3208
查看次数

如何使用Espresso匹配此表格单元格?

我需要匹配由红色矩形突出显示的视图.我应该为它写出哪种Espresso表达方式?

在此输入图像描述

这是一个表格布局,所有单元格都是TextView的实例.单元格视图没有唯一的ID.感兴趣的视图可能包含也可能没有文本.我所知道的是,这种观点总是位于"食品集团"细胞之下.

任何线索都会受到欢迎.

android hamcrest android-layout android-testing android-espresso

2
推荐指数
1
解决办法
963
查看次数

Android中的单元测试?

我使用的是Android Studio 1.2

假设我在一些MyAdder类中添加了一个简单的方法

public int add(int a,int b) {
    return a+b;
}
Run Code Online (Sandbox Code Playgroud)

我想执行单元测试并使用断言来执行上述代码的测试.

我发现很难,首先从官方DEV站点测试基础知识,以便获得执行单元测试的示例代码或详细教程.

android unit-testing android-testing

2
推荐指数
1
解决办法
1741
查看次数

Android执行功能测试订单

我有一个应用程序,其中MainActivity布局由两个TextView(tvName和tvEmail)和一个按钮(btnLogout)组成.

我有这些测试方法的功能测试(最后的代码):

  • testUserDetailsAreShown:检查TextView是否包含正确的文本值.
  • testLoginActivityStarts:对btnLogout按钮执行单击操作,并检查是否已加载LoginActivity.

我的问题是,如果我评论testLoginActivityStarts,那么testUserDetailsAreShown传递.但是,当两者都被取消注释时,两者都会失败.

java.lang.NullPointerException
at android.support.test.espresso.intent.Intents.resumedActivitiesExist(Intents.java:235)
at android.support.test.espresso.intent.Intents.intended(Intents.java:184)
at android.support.test.espresso.intent.Intents.intended(Intents.java:169)
at net.example.login.MainActivityTest.testLoginActivityStarts(MainActivityTest.java:46)
Run Code Online (Sandbox Code Playgroud)

android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with id: net.example.login:id/tvName
Run Code Online (Sandbox Code Playgroud)

我认为这是因为testLoginActivityStarts在testUserDetailsAreShown之前执行,并且当testUserDetailsAreShown正在执行时,加载的活动不是MainActivity,而是LoginActivity.

谁能帮我这个?我需要让两个测试通过.我相信他们应该通过.

这里测试代码:

public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {
private String USER_NAME = "UserName";
private String USER_EMAIL = "UserEmail";

public MainActivityTest(){
    super(MainActivity.class);
}

public void testUserDetailsAreShown() {
    onView(withId(R.id.tvName)).check(matches(withText(USER_NAME)));
    onView(withId(R.id.tvEmail)).check(matches(withText(USER_EMAIL)));
}

public void testLoginActivityStarts() {
    onView(withId(R.id.btnLogout)).perform(click());
    intended(hasComponent(LoginActivity.class.getName()));
}
}
Run Code Online (Sandbox Code Playgroud)

testing android functional-testing android-testing

2
推荐指数
1
解决办法
558
查看次数

从一个普通班级运行所有Ui测试

我在Espresso库上为自定义组件编写UI测试.我有单独的类,扩展ActivityInstrumentationTestCase2<MyActivityDebug>,对于每一个组件,例如:CheckBoxTest,EditTextTest,SelectorText...现在我单独运行测试过.帮助我,我如何从一个地方为所有课程一次性运行所有测试?

android android-testing android-studio android-espresso

2
推荐指数
1
解决办法
974
查看次数

Android Espresso如何执行触摸事件

如何使用简单的触摸事件测试视图,例如ACTION_DOWNACTION_MOVE

android android-testing android-espresso android-touch-event

2
推荐指数
1
解决办法
3675
查看次数

gcloud CLI:如何使用clearPackageData参数运行检测测试?

我正在运行我的测试使用gcloud firebase测试android运行命令带--use-orchestrator标志来启用Android Test Orchestrator.一个Orchestrator参数clearPackageData可以清除应用程序在测试之间的状态,我可以在我自己的设备上运行Android Studio测试时使用它:

android {
  defaultConfig {
   ...
   testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

   // The following argument makes the Android Test Orchestrator run its
   // "pm clear" command after each test invocation. This command ensures
   // that the app's state is completely cleared between tests.
   testInstrumentationRunnerArguments clearPackageData: 'true'
 }

  testOptions {
    execution 'ANDROID_TEST_ORCHESTRATOR'
  }
}

dependencies {
  androidTestImplementation 'com.android.support.test:runner:1.0.2'
  androidTestUtil 'com.android.support.test:orchestrator:1.0.2'
}
Run Code Online (Sandbox Code Playgroud)

但是,当使用上面提到的命令和标志在Firebase测试实验室中运行测试时,此参数设置为false.有没有办法设置这个参数true

android android-testing firebase gcloud firebase-test-lab

2
推荐指数
1
解决办法
552
查看次数

FragmentManager.getFragmentFactory的NoSuchMethodError

我正在尝试使用androidx测试库的新FragmentScenario API,但是测试无法像这样启动片段场景:

fragmentScenario = launchFragmentInContainer<MyFragment>(args)

stacktrace是:

java.lang.NoSuchMethodError: androidx.fragment.app.FragmentManager.getFragmentFactory()Landroidx/fragment/app/FragmentFactory;

    at androidx.fragment.app.testing.FragmentScenario$1.perform(FragmentScenario.java:178)
    at androidx.fragment.app.testing.FragmentScenario$1.perform(FragmentScenario.java:171)
    at androidx.test.core.app.ActivityScenario.lambda$onActivity$0$ActivityScenario(ActivityScenario.java:478)
    at androidx.test.core.app.ActivityScenario$$Lambda$0.run(Unknown Source)
    at org.robolectric.android.fakes.RoboMonitoringInstrumentation.runOnMainSync(RoboMonitoringInstrumentation.java:53)
    at androidx.test.core.app.ActivityScenario.onActivity(ActivityScenario.java:471)
    at androidx.fragment.app.testing.FragmentScenario.internalLaunch(FragmentScenario.java:170)
    at androidx.fragment.app.testing.FragmentScenario.launchInContainer(FragmentScenario.java:160)
    at com.domain.myapp.ui.pck.pkg.MyFragmentTest.setup(MyFragmentTest.kt:656)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
Run Code Online (Sandbox Code Playgroud)

如果我去FragmentManager类(androidx.fragment.app FragmentManager),则没有getFragmentFactory方法,而FragmentScenario.java类(包androidx.fragment.app.testing)清楚地表明该方法不存在:
看图片

我猜我的依赖项配置不正确,这是我的app / build.gradle文件:

android {
    compileSdkVersion 28
    buildToolsVersion '28.0.3'
    defaultConfig {
        applicationId "com.domain.app"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode appVersionCode
        versionName appVersionName
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        vectorDrawables {
            useSupportLibrary true
        }
    }
    aaptOptions {
        additionalParameters "--no-version-vectors"
    }
    buildTypes {
        debug {
            applicationIdSuffix ".debug"
        }
    }
    compileOptions …
Run Code Online (Sandbox Code Playgroud)

android robolectric android-testing android-espresso androidx

2
推荐指数
1
解决办法
831
查看次数