我正在我的项目上运行纯JUnit4 java测试而不是我的纯java文件,但我找不到一种方法来清楚地使用@VisibleForTesting而不会手动公开.
例如:
@VisibleForTesting
public Address getAddress() {
return mAddress;
}
Run Code Online (Sandbox Code Playgroud)
方法必须是public让它对测试"公开",但在这种情况下,注释没有意义吗?如果注释不会做什么,为什么不只是使用注释?
我的应用程序包含一个Activity用户Fragments.
我希望使用Espresso来测试用户界面Fragments.但是我遇到了一个问题.
如何测试一个Fragment未添加到Activity在onCreate.我见过的所有例子都Fragments涉及到Fragment被添加onCreate.那么我怎么能告诉Espresso去特定的Fragment并从那里开始呢?
谢谢
我正在开发一种QA自动化解决方案,可以在Android上记录/回放QA测试.关键业务要求是在回放录制的测试时不依赖于连接的PC.为此,我试图在没有连接PC的情况下运行仪器测试.(具体来说,是Appium UiAutomator2测试).
我目前的方法是尝试从我的应用程序以编程方式运行测试.如果我通常从连接的PC运行测试,我会使用该命令adb shell am instrument -w.我尝试从我的应用程序访问ADB Shell并运行am instrument -w,但这会产生错误,我错过了INTERACT_ACROSS_USERS_FULL权限.
为了解决这个问题,我尝试使用startInstrumentation运行测试.这成功地开始了测试.但是,测试立即崩溃.经过进一步调查,我将崩溃追踪到NPE:测试试图检索InstrumentationRegistry.getInstrumentation.getUiAutomation(0),但是返回null.
如何以编程方式运行测试并授予其访问所需的UiAutomation实例的权限?
这就是我开始测试的方式:
public void runTest() {
final String pm = getPackageName().replaceFirst(".test$", "");
final InstrumentationInfo info = getInstrumentationInfo(pm);
if (info != null) {
final ComponentName cn = new ComponentName(info.packageName,
info.name);
Bundle arguments = new Bundle();
arguments.putString("class", "io.testim.appiumwrapper.test.AppiumUiAutomator2Server");
//cn = {io.extension.test/android.support.test.runner.AndroidJUnitRunner}
startInstrumentation(cn, null, arguments);
}
}
Run Code Online (Sandbox Code Playgroud) android android-testing appium android-instrumentation appium-android
有人知道如何调试这个吗?我无法弄清楚哪些库产生了问题。
旁注,它只发生在我尝试运行 Android 测试时,所以我最好的猜测是它与某些测试库有关。
testImplementation "androidx.room:room-testing:$version_room"
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.4.0'
// Compose Tests
androidTestImplementation "androidx.compose.ui:ui-test-junit4:$version_compose"
debugImplementation "androidx.compose.ui:ui-test-manifest:$version_compose"
// Hilt test
androidTestImplementation "com.google.dagger:hilt-android-testing:$version_hilt"
kaptAndroidTest "com.google.dagger:hilt-android-compiler:$version_hilt"
debugImplementation 'androidx.fragment:fragment-testing:1.3.6'
Run Code Online (Sandbox Code Playgroud)
Execution failed for task ':app:mergeDebugAndroidTestJavaResource'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.MergeJavaResWorkAction
> 2 files found with path 'META-INF/LGPL2.1' from inputs:
- /home/lbenevento/.gradle/caches/transforms-3/1e2dfa6057fe4e701d175f47b1099efa/transformed/jetified-jna-platform-5.5.0.jar
- /home/lbenevento/.gradle/caches/transforms-3/405542266c1c406c39ff1a20cb26a332/transformed/jetified-jna-5.5.0.jar
Adding a packagingOptions block may help, please refer to
https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.PackagingOptions.html
for more information
* Try:
Run with --info or --debug option to get more log …Run Code Online (Sandbox Code Playgroud) 这是我第一次设置Android测试项目来测试Android项目.
我已经创建了一个非常基本的测试用例,我正试图运行,但是我没有运行.我得到了Test run failed: Instrumentation run failed due to 'java.lang.ClassNotFoundException'.
我会更麻烦这一点,但是我没有得到任何更多的信息,例如它试图找到哪个类,等等.关于如何从错误中获取更多信息的任何想法?我应该看的任何常见区域,或者我可能需要配置的任何东西?
以下是控制台的信息:
[2013-04-16 13:21:49 - XyzProgramTest] Android Launch!
[2013-04-16 13:21:49 - XyzProgramTest] adb is running normally.
[2013-04-16 13:21:49 - XyzProgramTest] Performing android.test.InstrumentationTestRunner JUnit launch
[2013-04-16 13:21:49 - XyzProgramTest] Automatic Target Mode: launching new emulator with compatible AVD 'GalaxyNexusAPI_17'
[2013-04-16 13:21:49 - XyzProgramTest] Launching a new emulator with Virtual Device 'GalaxyNexusAPI_17'
[2013-04-16 13:21:53 - Emulator] extension WGL_ARB_make_current_read was not found
[2013-04-16 13:21:53 - Emulator] extension WGL_EXT_swap_control was not found …Run Code Online (Sandbox Code Playgroud) 在典型的Android项目中,我们需要以干净的方式将数据从某个地方(REST,SQL,缓存等)提取到UI中,我们通常使用Loader,Service或(可能是yuk)AsyncTask,但我发现所有这些方法由于以下几个原因不满意:
我被这些文章中概述的想法所吸引:http : //fernandocejas.com/2014/09/03/architecting-android-the-clean-way/ http://antonioleiva.com/mvp-android/ http://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html
成功开始使用MVP将活动/碎片/视图分解为更小/更清洁的部分,我现在认为上述问题的解决方案可能是依赖于消息总线(Otto,EventBus等)而不是服务或加载器或任何与域数据交互的内容.
所以在实践中这意味着不是使用(例如)CursorLoader从数据库加载Cursor,而是使用消息总线发送消息来请求数据,数据被加载到后台线程以响应该消息,然后通过UI线程上的消息到达时处理响应数据.对我来说至关重要的是,我希望将数据结构从业务领域推出,而不是Android域,所以我更喜欢业务对象数组,而不是Cursor.
这是工程设计,总是需要权衡,虽然这似乎提供了更清晰的关注点分离,但是装载机/服务模板的减少,缺点是什么?
我的问题是,是否有任何基本原因不采用这种基于消息的Android应用程序方法?
android android-service android-cursor android-testing android-cursorloader
我一直在寻找一种方法来分别测试我的碎片的UI(即独立于其他碎片和活动),但我找不到办法.
特别是,假设我有片段A,片段B和片段C.进入片段C的唯一方法(应用方式)是首先通过片段A和片段B. 我正在寻找一种直接测试Fragment C的方法(可能通过模拟它的依赖关系,如果存在的话),而不必通过Fragment A和B.
到目前为止我调查的工具:
monkey:仅用于通过命令行生成伪随机事件.不是我想要的.
monkeyrunner:它可以运行Python程序将事件流发送到我的Android应用程序,但它不能直接使用这些脚本定位特定的Fragment.
Espresso:白盒测试工具.这接近我想要的,但它仍然需要在到达片段C之前通过片段A和B(即,您需要启动您的应用程序,然后测试将从那里运行).
UI Automator:黑盒测试工具.这也很接近,但同样,它需要在测试我想要的之前通过先前的片段(片段C).
有没有办法直接测试Fragmen的UI?
android android-testing android-espresso android-uiautomator
我正在尝试使用根据android文档的方法替换我的Espresso registerIdlingResources和unregisterIdlingResources弃用方法IdlingRegistry.
我的一些测试在更新之前工作,现在不再有效了......这些测试一起工作,但不能一起工作.
我注意到旧版本(Espresso类)有一点不同,这一行在IdlingRegistry课堂上不存在:
baseRegistry.sync(IdlingRegistry.getInstance().getResources(), IdlingRegistry.getInstance().getLoopers());
Run Code Online (Sandbox Code Playgroud)
我认为这个sync方法对我的自定义IdlingResource非常重要...
如何在没有这条线的情况下同步我的活套?
谢谢你的帮助.
编辑:我使用EspressoCore 3.0.1与runner/rules 1.0.1
在Android设备上运行测试sdk 26会导致它们失败,因为新的自动填充功能会在espresso尝试点击它们时隐藏字段.
我在firebase测试实验室运行我的测试,所以我不能在我的测试设备上手动禁用它们.
一些图片:
Espresso无法点击现在的密码字段,因为自动填充对话框隐藏了我的字段和fail.
AutofillManager#disableAutofillServices()仅使用禁用#2.对话但#3.还在那里.
如何在测试设备上禁用自动填充?
testing android android-testing android-espresso android-autofill-manager