我在Pixel设备上尝试Android P预览,目前遇到使用UiAutomator框架编写的仪器测试问题.
每当使用UiAutomator通过以下代码模拟按钮点击时:
onView(withId(R.id.button_activity_login)).perform(click())
Run Code Online (Sandbox Code Playgroud)
我遇到一个带有消息的AlertDialog
Detected problems with API compatibility (visit g.co/dev/appcompat for more info)
Run Code Online (Sandbox Code Playgroud)
这导致了这个链接:
这打破了UiAutomator测试,因为我的测试目前不考虑每个动作之间的额外AlertDialog.
这只发生在UiAutomator的按钮点击,而不是Espresso的.我相信UiAutomator可能会在引擎盖下使用一些反射来实现跨应用程序测试功能(事先不知道UI组件的文本或ID),而Espresso负责处理被测试应用程序内的所有内容.
这有点奇怪,因为UiAutomator是Google自己在开发者网站上建议的测试框架(https://developer.android.com/training/testing/ui-automator.html#ui-automator-apis).有没有人经历过或解决过以下问题?
我想知道是否有任何关于在WWDC 2015中引入的XCode 7中的新UI测试的文档.如果没有文档,是否有任何用户生产的版本值得关注?
谢谢
我有用于测试MyApp的UI测试目标.要测试特定的MyApp条件,我需要将通知从UI测试目标发布到MyApp目标.要从UI测试目标函数发布通知,我使用此:
NSNotificationCenter.defaultCenter().postNotificationName(name, object: nil, userInfo: aUserInfo)
Run Code Online (Sandbox Code Playgroud)
看起来这个通知永远不会从UI测试目标到达观察者,但是从MyApp目标发布此通知时它可以正常工作.
如何从UI Target发布通知到MyApp目标?
使用Xcode 7.
我正面临着一个我一直试图解决的大问题.我正在尝试使用robotium运行测试,但是当我调用getActivity()setup方法时,RuntimeException会抛出异常.
java.lang.RuntimeException:无法在45秒内启动意图Intent {act = android.intent.action.MAIN flg = 0x14000000 cmp = com.company.app/.SplashActivity}.也许主线程在合理的时间内没有闲置?可能会有一个动画或不断重新绘制屏幕的东西.或者活动是在创建网络呼叫?请参阅threaddump日志.在您的活动启动请求为1463908619275之前,事件队列最后一次空闲以供您参考,现在队列最后一次空闲时间是:1463908619275.如果这些数字相同,您的活动可能会占用事件队列.
我正在使用机器人5.4.4
在我的Jenkins CI slave上的iOS应用程序上运行UI测试时,UI不正确,我的测试失败.在本地,相同的UI是预期的,测试通过.
我无法解决这个问题,我无法在远程计算机上进行调试.因此,我想添加日志记录以查看应用程序正在做出哪些决定,以找出UI在远程Jenkins从站中错误显示的原因.
测试日志输出不包含来自应用程序(通过NSLog)的日志输出,也无法NSLog在派生数据输出文件夹中的任何.xcactivitylog文件中找到应用程序调用中的任何字符串.
当UI测试运行时,我在哪里可以找到我的应用程序的日志输出?这是使用运行iOS 9.3模拟设备的Xcode 8.2.
它们共享相同的 UDID 吗?它们是如何在幕后实施的?
场景是我有 4 个并行运行 UI 测试的克隆。我需要一个干净的模拟器来进行一些测试(但想保持随机测试顺序)
我想在CI(Jenkins Pipeline)中的项目上运行UI测试和单元测试.UI测试要求图像和视频位于测试设备/仿真器上.在UI测试中,我请求存储读/写访问权限,因此我可以将一些资源转储到下载文件夹中,然后在测试套件的末尾将其删除.
当我在Jenkins(mac)上运行我的测试时,没有授予权限,没有媒体转移,我的所有测试都失败了.
该项目包含一个应用程序模块和两个内部库模块.
建立
sh "./gradlew clean assembleRelease"
Run Code Online (Sandbox Code Playgroud)
单元测试
sh "./gradlew testReleaseUnitTest"
Run Code Online (Sandbox Code Playgroud)
UI测试
sh "$ANDROID_HOME/emulator/emulator @my_sweet_emulator_name -no-boot-anim & $ANDROID_HOME/platform-tools/adb wait-for-device"
sh './gradlew connectedAndroidTest'
Run Code Online (Sandbox Code Playgroud)
1)CI构建依赖于隐式assembleDebugAndroidTest任务
2)如果我在计算机的命令行上运行该任务,则测试将安装但是未授予读/写存储权限,因此所有测试都因设备上没有任何预期内容而失败.
testBuildType "release"我如何授予权限
@RunWith(AndroidJUnit4::class)
class MyMediaClassTest {
@Rule
@JvmField
val activityRule = ActivityTestRule(MainActivity::class.java)
@Rule
@JvmField
val grantPermissionRule: GrantPermissionRule = GrantPermissionRule
.grant(android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
// tests and stuff
}
Run Code Online (Sandbox Code Playgroud)
我已经看到了一个短期解决方案,可以将我的所有媒体资产手动复制到模拟器中.但这似乎不对,这应该能够实现自动化.
我正在尝试使用 FragmentScenario 测试片段。这个片段有自己的菜单。操作栏上有一个添加图标,单击此菜单项会启动一个子片段,用户可以从中添加新项目。所以我试图测试这种行为。但是,您可能知道,FragmentScenario 在 EmptyFragmentActivity 中启动片段,而不启动真正的宿主活动。由于操作栏不是片段布局的一部分,而是属于宿主活动,因此在测试期间操作栏和菜单甚至不可见。那么如何测试与菜单的交互呢?
我从官方文档中找到了这条信息:
如果您需要调用片段本身的方法,例如响应选项菜单中的选择,您可以通过实现 FragmentAction 安全地执行此操作:
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@Test fun testEventFragment() {
val scenario = launchFragmentInContainer<MyFragment>()
scenario.onFragment(fragment ->
fragment.onOptionsItemSelected(clickedItem) {
//Update fragment's state based on selected item.
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如何将正确的项目传递给 onOptionsItemSelected 回调?我试图将 addMenuItem 定义为成员变量并在 onCreateOptionsMenu 内部对其进行初始化,但它返回 null。在测试期间似乎没有调用 onCreateOptionsMenu。所以我不知道如何测试用户与菜单的交互。
我在两个不同的文件中有两个独立的组件
组件A和组件B
我在ComponentB中有一个按钮
现在我想测试一下,当单击ComponentB中的特定按钮时, ComponentA应呈现如下:
import { render, screen, fireEvent } from '@testing-library/react';
import ComponentA from './ComponentA';
import ComponentB from './ComponentB'
test('Component A Comes up on Click of Component B button', () => {
render(<ComponentB />);
const componentBButton = screen.getByRole('button');
fireEvent.click(componentBButton);
expect(<ComponentA />).toBeInTheDocument(); //This throwing an error that receiver must be HTMLElement or SVGElement
});
Run Code Online (Sandbox Code Playgroud)
不幸的是,我收到了Receiver must be HTMLElement or SVGElement这个expect(<ComponentA />).toBeInTheDocument();错误
请问,我是测试新手,请问如何解决这个问题?谢谢您的意见
我正在尝试测试 ButtonClick 如何更改用户界面。
测试设置如下:
composeRule.setContent {
var i by remember { mutableStateOf(0) }
Button(modifier = Modifier.testTag("TEST"), onClick = { i++ }) {
Text(text = i.toString())
}
}
Run Code Online (Sandbox Code Playgroud)
我的实际测试如下:
val button = composeRule.onNodeWithTag("TEST")
button.assertTextEquals("0")
button.performClick()
button.printToLog("Test")
button.assertTextEquals("1")
Run Code Online (Sandbox Code Playgroud)
第一个断言通过,但是在检查文本是否应该等于时失败1:
java.lang.AssertionError: Failed to assert the following: (Text + EditableText = [1])
Semantics of the node:
Node #2 at (l=0.0, t=66.0, r=176.0, b=165.0)px, Tag: 'TEST'
Role = 'Button'
Text = '[0]'
Actions = [OnClick, GetTextLayoutResult]
MergeDescendants = 'true'
Selector used: (TestTag = …Run Code Online (Sandbox Code Playgroud)