我面临的一个常见情况是,我希望View在将自定义项目作为大型应用程序的一部分进行开发时,在屏幕上以可见方式对其进行测试。我意识到单元测试的存在,特别是使用ActivityUnitTestCase,但据我了解,这些框架实际上并没有在屏幕上可见地附加组件。
目前,我倾向于这样做的方法是将组件放置在应用程序中实际使用的任何位置。这通常意味着需要等待一段时间应用程序启动或在应用程序可见之前浏览应用程序的某些部分,这可能会变得很麻烦。
我发现的更好的方法是在应用程序中创建一个Activity纯粹出于测试目的而存在的应用程序(例如,仅显示我正在开发的自定义View),启动该应用程序以显示我正在处理的自定义View(或其他内容)。为此,我Activity在清单中分配给该过滤器的唯一意图过滤器是android.intent.action.MAIN,而不是 android.intent.category.LAUNCHER。然后,我可以简单地在 Android Studio 中创建一个运行/调试配置来Activity直接启动它。据我认为,这实际上允许我拥有Activity只能由我从 IDE 启动的类。
我的问题是:
省略是否可以android.intent.category.LAUNCHER保证应用程序的用户无法Activity以任何方式启动该应用程序,也无法意识到它的存在?这是一个安全的地方吗Activity只开设用于发展的课程
是否有任何类型的工作流程或测试框架可以用来改进我的做法?
我想使用 device.findObject() 在屏幕中查找对象,这需要 UiSelector。到目前为止,一切都很好。
问题是我有几个项目只能通过它们在屏幕上的位置来区分,例如,在消息传递应用程序中,所有头像都具有相同的属性,除了它们在屏幕中的位置之外。
我该如何指定这一点?
我想到:
您有什么建议/解决方案吗?
谢谢。
我像这样注释了我的课程
\n\n@RunWith(AndroidJUnit4.class)\npublic class WorkdayProviderTest\nRun Code Online (Sandbox Code Playgroud)\n\n此外,还注释了我的测试方法
\n\n@Test\npublic void insert_dataInsertsCorrectly()\nRun Code Online (Sandbox Code Playgroud)\n\n最后,像这样配置我的 build.gradle defaultConfig 和依赖项
\n\ndefaultConfig {\n applicationId \'com.jueggs.workinghours\'\n minSdkVersion 16\n targetSdkVersion 23\n versionCode 1\n versionName "1.0"\n\n testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"\n}\n\nandroidTestCompile "junit:junit:4.12"\nandroidTestCompile "com.android.support:support-annotations:23.3.0"\nandroidTestCompile "com.android.support.test:runner:0.4.1"\nandroidTestCompile "com.android.support.test:rules:0.4.1"\nandroidTestCompile "com.android.support.test.espresso:espresso-core:2.2.1"\nandroidTestCompile "com.android.support.test.espresso:espresso-contrib:2.2.1"\nandroidTestCompile "org.hamcrest:hamcrest-library:1.3"\nRun Code Online (Sandbox Code Playgroud)\n\n并像这样配置测试运行
\n\n\n\n它\xc2\xb4s告诉我
\n\nNo tests were found\n\nTest running failed: Instrumentation run failed due to \'java.lang.ClassNotFoundException\'\nRun Code Online (Sandbox Code Playgroud)\n\n如何解决这个问题?
\n我在 Circle ci 中运行 UI 测试时遇到超时问题,因为命令connectedAndroidTest 的运行时间超过 10 分钟。
所以我试图将它们分成测试套件并一次运行每个套件。
我在这里找到了如何为我的 android 测试创建套件:https://developer.android.com/reference/junit/framework/TestSuite.html
但我找不到如何使用connectedAndroidTest 命令运行它们。
我无法UiObject2在 androidTest 中使用 UiAutomator 找到元素 ( )。我获得了 UiDevice 实例并尝试使用以下命令查找对象:
MY_UI_DEVICE.findObject(By.res(CURRENT_PACKAGE, id));
Run Code Online (Sandbox Code Playgroud)
CURRENT_PACKAGE是我的应用程序的包MY_UI_DEVICE.getCurrentPackageName()。我也尝试过这个:
MY_UI_DEVICE.wait(Until.findObject(By.res(CURRENT_PACKAGE, id)), 10000);
Run Code Online (Sandbox Code Playgroud)
我可以看到应用程序在右侧屏幕上等待 10 秒(所需的对象仍然存在),但超时后它无法找到它并且测试失败。它在模拟器 (API 23) 上总是失败,但在真实设备 (API 25) 上很少能正常工作。
当我调试代码时,我可以看到,我可以通过手动调用getChild(index)方法序列来获取正确的元素AccessibilityNodeInfo,但在运行时,即使应用程序在我期望的特定元素的正确屏幕上等待,它仍然会失败。
我正在使用不同的 UiDevice 功能,但没有任何帮助,而且我没有想法,所以任何帮助将不胜感激。
如果我要在本地运行浓缩咖啡测试并传递环境变量,我可以通过添加来做到这一点
defaultConfig {
testInstrumentationRunnerArgument 'USERNAME' 'David'
}
Run Code Online (Sandbox Code Playgroud)
在build.gradle 文件中
然后我可以通过调用这个变量
InstrumentationRegistry.getArguments().getString("USERNAME")
Run Code Online (Sandbox Code Playgroud)
但是当我在 firebase testlab 上运行此参数时,instrumentationrunner 参数不起作用
android android-testing firebase android-espresso firebase-test-lab
我正在尝试按照以下说明测试片段:https ://developer.android.com/training/basics/fragments/testing
launchFragmentInContainer但是,当我从测试中调用时,我遇到了以下崩溃。
堆栈跟踪:
android.view.InflateException: Binary XML file line #16: Binary XML file line #16: Error inflating class <unknown>
Caused by: android.view.InflateException: Binary XML file line #16: Error inflating class <unknown>
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
...
at android.view.LayoutInflater.$$robo$$android_view_LayoutInflater$createView(LayoutInflater.java:647)
...
at com.myapp.poll.PollHomeFragment.onCreateView(PollHomeFragment.kt:31)
...
Caused by: java.lang.UnsupportedOperationException: Failed to resolve attribute at index 13: TypedValue{t=0x2/d=0x7f0301b1 a=-1}
at android.content.res.TypedArray.getDrawableForDensity(TypedArray.java:946)
at android.content.res.TypedArray.getDrawable(TypedArray.java:930)
at android.view.View.__constructor__(View.java:5010)
at android.view.View.<init>(View.java)
at android.widget.TextView.<init>(TextView.java)
...
at com.myapp.poll.PollHomeFragment.onCreateView(PollHomeFragment.kt:31)
Run Code Online (Sandbox Code Playgroud)
这是布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" …Run Code Online (Sandbox Code Playgroud) android android-fragments android-testing android-fragmentscenario
我正在使用 mockito、junit5 和协程来获取存储库中的数据。但是在测试用例中调用了 no 方法。我尝试使用没有任何Dispatchers和emit()功能的正常挂起功能,并且它有效。因此,我猜原因可能是由于 livedata 协程
GitReposRepository.kt
fun loadReposSuspend(owner: String) = liveData(Dispatchers.IO) {
emit(Result.Loading)
val response = githubService.getReposNormal(owner)
val repos = response.body()!!
if (repos.isEmpty()) {
emit(Result.Success(repos))
repoDao.insert(*repos.toTypedArray())
} else {
emitSource(repoDao.loadRepositories(owner)
.map { Result.Success(it) })
}
}
Run Code Online (Sandbox Code Playgroud)
GitReposRepositoryTest.kt
internal class GitRepoRepositoryTest {
private lateinit var appExecutors:AppExecutors
private lateinit var repoDao: RepoDao
private lateinit var githubService: GithubService
private lateinit var gitRepoRepository: GitRepoRepository
@BeforeEach
internal fun setUp() {
appExecutors = mock(AppExecutors::class.java)
repoDao = mock(RepoDao::class.java)
githubService = mock(GithubService::class.java) …Run Code Online (Sandbox Code Playgroud) android kotlin android-testing android-livedata kotlin-coroutines
只要我在 YouTube 视频中看到 Android 设备倾向于启动并显示在我的测试中启动的活动,我就认为这里有问题,因为我的设备根本没有反应(尽管屏幕始终处于打开状态,动画已关闭)。当我尝试测试应用程序中首先运行的活动(逻辑上)时,我尝试在测试时自己打开应用程序,并且不知何故它起作用了。现在我正在测试另一个,但这个技巧不再起作用了。
无论如何,我总是收到错误:java.lang.AssertionError:活动永远不会变成请求状态“[RESUMED,STARTED,CREATED,DESTROYED]”
我的测试代码不包括:
val 场景 = ActivityScenario.launch(HomeActivity::class.java)
然后我只检查布局元素(textview 或任何东西)是否存在
有什么想法可能会发生吗?提前致谢
UPD:安卓模拟器工作正常。
我有一个Android应用程序.当用户点击按钮A并且意图像这个android-presudocode一样被触发:)
//inside FirstActivity
@Override
public void onClick(View view) {
startActivity(new Intent(this, AnotherActivity.class));
}
Run Code Online (Sandbox Code Playgroud)
所以,如果我没有弄错的话,应该调用onResume方法AnotherActivity,对吗?
我ActivityInstrumentationTestCase2<FirstActivity>用来测试我的活动,但我无法实例化AnotherActivity.
所以问题是,我该如何测试:'当按下按钮时,恢复正确的活动并将正确的额外内容传递给意图'.
android ×10
android-testing ×10
android-view ×1
bounds ×1
circleci ×1
firebase ×1
kotlin ×1
uidevice ×1