天道酬勤,学无止境

android-testing

如何为测试创建对象的 PagedList?(How do I create a PagedList of an object for tests?)

问题 我一直在使用 Google 的 arch 库,但使测试变得困难的一件事是使用PagedList 。 对于本示例,我使用存储库模式并从 API 或网络返回详细信息。 所以在 ViewModel 中,我调用了这个接口方法: override fun getFoos(): Observable<PagedList<Foo>> 然后 Repository 将使用RxPagedListBuilder创建类型为 PagedList 的Observable : override fun getFoos(): Observable<PagedList<Foo>> = RxPagedListBuilder(database.fooDao().selectAll(), PAGED_LIST_CONFIG).buildObservable() 我希望能够进行测试来设置这些方法的返回值,这些方法返回PagedList<Foo> 。 类似的东西 when(repository.getFoos()).thenReturn(Observable.just(TEST_PAGED_LIST_OF_FOOS) 两个问题: 这可能吗? 如何创建PagedList<Foo> ? 我的目标是以更端到端的方式进行验证(例如确保屏幕上显示正确的 Foos 列表)。 片段/活动/视图是从 ViewModel

2021-10-23 05:12:42    分类:技术分享    android   kotlin   android-testing   android-architecture-components   android-paging

MutableLiveData 在 JUnitTest 中为 null(MutableLiveData is null in JUnitTest)

问题 我想写一个单元测试。 因此我需要 MutableLiveData。 我从一个非常基本的设置测试开始,但我无法实例化 MutableLiveData 对象。 当我运行测试时,我总是为空。 我必须嘲笑什么吗? 有什么建议么? @RunWith(MockitoJUnitRunner.class) public class DefaultLiveDataTest { private static final int EXPECTED = 5; private final MutableLiveData<Integer> underTest = new MutableLiveData<>(); @Test public void exampleTest() { underTest.setValue(EXPECTED); //underTest is Null assertEquals(underTest.getValue().intValue(), EXPECTED); } } java.lang.NullPointerException at android.arch.core.executor.DefaultTaskExecutor.isMainThread(DefaultTaskExecutor.java:58) at android.arch.core.executor

2021-10-22 15:16:18    分类:技术分享    android   testing   androidx   android-testing   android-livedata

Reading an asset in a Xamarin NUnit test class

I want to read a mock RSS feed file to test against in a Xamarin NUnit test for an Android app. The test class has no context so I can't put the file in the Assets folder and do this: System.IO.Stream strIn = instanceOfAssetManager.Open(feedFile); It also has no ancestor, so I can't do this: System.IO.Stream strIn = this.Class.ClassLoader.ResourceAsStream(feedFile); Any suggestions how I can get to the jolly thing? This case solved a similar problem for a different platform/setup: Storing test files in the test project

2021-10-22 07:09:36    分类:问答    nunit   xamarin.android   android-testing

如何从 Android Oreo 禁用新的自动填充功能以进行浓缩咖啡测试(How to disable the new Autofill feature from Android Oreo for espresso tests)

问题 使用sdk 26在 android 设备上运行测试会导致它们失败,因为新的自动填充功能会在 espresso 尝试单击它们时隐藏这些字段。 我在 firebase 测试实验室上运行我的测试,所以我无法在我的测试设备上手动禁用它们。 一些图片: 1. 在点击用户名字段之前密码是可见的。 2. 单击用户名字段后,此自动填充对话框隐藏密码字段: 3. 登录后,它会显示另一个填充对话框: Espresso 现在无法单击密码字段,因为自动填充对话框隐藏了我的字段并fail 。 使用AutofillManager#disableAutofillServices()只会禁用 #2。 对话但#3。 还在。 如何在测试设备上禁用自动填充? 回答1 adb shell pm disable com.google.android.gms/com.google.android.gms.autofill.service.AutofillService 这应该禁用自动填充服务。 与在系统设置中手动关闭自动填充服务相同。 它至少适用于模拟器。 但这需要root访问权限。 另一种禁用自动填充服务的方法是更改autofill_service设置。 adb shell settings put secure autofill_service null 回答2 根据文档,您可以使用 AutofillManager

2021-10-19 16:21:27    分类:技术分享    android   testing   android-espresso   android-testing   android-autofill-manager

Robolectric:Resources$NotFoundException:带有 Android Gradle 插件 3 的字符串资源 ID(Robolectric: Resources$NotFoundException: String resource ID with Android Gradle Plugin 3)

问题 Android Studio 3.0 Beta2 classpath 'com.android.tools.build:gradle:3.0.0-beta3' testCompile 'org.robolectric:robolectric:3.4.2' 我正在使用的测试类无法运行: @Config(constants = BuildConfig.class, sdk = Build.VERSION_CODES.LOLLIPOP) @RunWith(RobolectricTestRunner.class) public class RecipeAdapterTest { private MainActivity activity; @Before public void setup() { activity = Robolectric.setupActivity(MainActivity.class); /* Also tried this same Error activity = Robolectric.buildActivity(MainActivity) .create() .resume() .get(); */ } @Test public void testActivityShouldNotBeNull() { assertThat(activity, is

2021-10-18 14:31:31    分类:技术分享    android   unit-testing   testing   android-testing   Robolectric

我们如何自动只在较新的 Android 版本上运行测试?(How can we automatically only run tests on newer Android versions?)

问题 我发现一项测试,尤其是在 KitKat 之前的设备上一直失败。 我相信这与旧 Android 设备上使用的嵌入式 WebView 的变化有关(但也许这是错误的)。 无论如何,回到我的问题:我想要一种优雅的方式来控制是否根据设备上运行的 Android 版本运行测试。 目前,如果运行时早于 KitKat,我会使用短路测试并通过测试的代码。 这是相关的代码: if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { assertTrue("Skipping this test as the Android version is too low.", true); return; } 从那以后,我尝试依次使用两个注释: @TargetApi和@RequiresApi例如 @Test @RequiresApi(Build.VERSION_CODES.KITKAT) public void zimTest() { Log.v("kiwixTesting", "Running zimTest() on Android version: " + Build.VERSION.SDK_INT); ... } 在这两种情况下,测试都在我的测试设备(包括 Android 4.3、4.3、4.4 和更新版本)上运行。 我可以判断

2021-10-18 13:07:16    分类:技术分享    android   android-espresso   android-testing

升级到Android Studio 3.0后不存在Support Annotation(Support Annotation does not exist after upgrading to Android Studio 3.0)

问题 将项目升级到 AndroidStudio 3.0-beta1 后,我的androidTest文件停止编译。 很多包都没有找到,其中一些是: 错误:包 android.support.annotation 不存在错误:找不到符号类 StringRes 错误:无法访问 AppCompatActivity 找不到 android.support.v7.app.AppCompatActivity 的类文件 我已经添加了 androidTestCompile "com.android.support:support-annotations:25.3.1" 进入build.gradle 但即使这样,我也有找不到包的错误。 我尝试从 Android Studio 内部和使用./gradlew connectedCheck终端运行测试 回答1 我有同样的问题。 问题不在于您升级了 AndroidStudio,而是在更新 SDK 中的构建工具后,您的目标版本和编译版本低于 26。 如此变化 android { compileSdkVersion 25 defaultConfig { applicationId "bla.bla" minSdkVersion 21 targetSdkVersion 25 } } 到 android { compileSdkVersion 26

2021-10-16 13:34:07    分类:技术分享    android   android-studio   android-testing   android-studio-3.0   gradle-android-test-plugi

如何设置 Appium UI 测试 maven 项目与 Gitlab CI 一起测试 Android App?(how to set up a Appium UI test maven project to work with Gitlab CI to test Android App?)

问题 我现在是一名实习生,刚接触自动化测试。我的目标是帮助我的公司为客户端设置 CI。 现在我有一个 maven 项目,其中包含几个使用 Appium java-client lib 的测试,在 Eclipse IDE 下,它可以在本地运行 UI 测试。 我下一步的目标是将我的测试与 gitlab 存储库(已经存在,由 android 开发人员创建)挂钩,但我被困在这里。 有人可以帮我吗? 请尽量具体: 我应该如何设置 .gitlab.yaml? 我们可以在 yaml 中使用脚本来下载 Appium 和 maven 吗? 或者我们可以只下载 Appium,但将所有 Appium java-client jars 导入到 main 中的 libs 中? 如果以上任何一个是真的,怎么办? 如果两者都没有,我应该怎么做? 我应该把我的测试放在那个 repo 的 gitlab 中吗? 或者我不必将我的测试放在现有的 repo 中。 相反,我可以有另一个并告诉 yaml 去哪里? 又如何? 如果您能帮助我完成工作流程,将会很有帮助。 就像,当我开发人员签入代码时,gitlab 读取 yaml,然后构建,然后在 where(Q3) 中找到我的测试套件,然后执行等等。 提前谢谢了! 回答1 由于终于有人也对这个问题感兴趣,让我分享我对此的解决方案。 所以,如果你在看这个问题

2021-10-15 19:09:37    分类:技术分享    maven   appium   android-testing   gitlab-ci

浓缩咖啡测试禁用动画(Espresso testing disable animation)

问题 @Test public void test3_PaySuccessful(){ init(); ViewInteraction amountEditText = onView( allOf(withId(R.id.et_amount), isDisplayed())); amountEditText.perform(replaceText("SGD 0.010"), closeSoftKeyboard()); //, withText("Proceed") ViewInteraction appCompatButton = onView( allOf(withId(R.id.btn_confirm), isDisplayed())); appCompatButton.perform(click()); //, withText("Pay") ViewInteraction appCompatButton2 = onView( allOf(withId(R.id.btn_confirm), isDisplayed())); appCompatButton2.perform(click()); //dialog ViewInteraction appCompatButton3 = onView( allOf(withId(R.id.confirm_button)

2021-10-15 05:02:25    分类:技术分享    android   animation   android-testing   android-espresso

测试该应用在 Android 中启动另一个应用(Test that app launches another app in Android)

问题 我有一个非常简单的活动,当点击按钮时,它将用户重定向到应用程序的 Play 商店页面: public class MyActivity extends AppCompatActivity { private static final String PLAY_STORE_URI = "market://details?id=" + BuildConfig.APPLICATION_ID; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.my_activity); findViewById(R.id.go_to_play_store).setOnClickListener(this::goToPlayStore); } public void goToPlayStore(View view) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(PLAY_STORE_URI)); startActivity(intent); } } 是否可以编写一个测试来检查单击按钮时

2021-10-15 02:32:53    分类:技术分享    android   android-espresso   android-testing