最近,我决定更新我的 Espresso 代码以使用ActivityScenarioRule已弃用的ActivityTestRule.
为此,我将以下库导入到我的项目中:
最终代码使用ActivityScenarioRule:
package com.realtomjoney.pyxlmoose.activities.main
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions
import androidx.test.espresso.matcher.ViewMatchers.*
import com.realtomjoney.pyxlmoose.R
import org.junit.Rule
import org.junit.Test
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.assertion.ViewAssertions
import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.filters.LargeTest
import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner
import org.junit.runner.RunWith
@LargeTest
@RunWith(AndroidJUnit4ClassRunner::class)
class MainActivityTestsWhenNewProjectIsCreated {
@get:Rule
var activityTestRule = ActivityScenarioRule(MainActivity::class.java)
private fun createNewProject() {
onView(withId(R.id.floatingActionButton)).perform(click())
onView(withId(R.id.fragmentNewCanvas_projectTitleTextInputEditText)).perform(ViewActions.replaceText("Untitled Project"))
onView(withId(R.id.fragmentNewCanvas_spanCountTextInputEditText)).perform(ViewActions.replaceText("5"))
onView(withId(R.id.fragmentNewCanvas_doneButton)).perform(click())
}
@Test
fun uitest_fragmentNewCanvasProjectTitleTextInputEditText_isNotDisplayed_after_fragmentNewCanvasDoneButton_isPressed() {
createNewProject()
onView(withId(R.id.fragmentNewCanvas_projectTitleTextInputEditText)).check(ViewAssertions.doesNotExist())
}
@Test
fun uitest_fragmentNewCanvasProjectTitleTextInputLayout_isNotDisplayed_after_fragmentNewCanvasDoneButton_isPressed() {
createNewProject()
onView(withId(R.id.fragmentNewCanvas_projectTitleTextInputLayout)).check(ViewAssertions.doesNotExist())
}
@Test
fun uitest_fragmentNewCanvasSpanCountTextInputEditText_isNotDisplayed_after_fragmentNewCanvasDoneButton_isPressed() {
createNewProject()
onView(withId(R.id.fragmentNewCanvas_spanCountTextInputEditText)).check(ViewAssertions.doesNotExist())
}
@Test
fun …Run Code Online (Sandbox Code Playgroud) 大约一个星期前,我问过这个问题
为什么库模块android.support.test在添加依赖项中不可见
经过多次头部刮擦和项目设置变形后,我发现这个app/build.gradle依赖配置让我比以前更进一步,因为至少项目编译但是在尝试运行时没有构建:
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion '22.0.1'
defaultConfig {
applicationId "com.my.package.name"
minSdkVersion 8
targetSdkVersion 22
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
sourceSets { main { java.srcDirs = ['src/main/java', 'src/androidTest/java'] } }
packagingOptions {
exclude 'LICENSE.txt'
}
}
dependencies {
compile 'com.android.support:appcompat-v7:22.1.0'
compile 'com.android.support:support-v4:22.1.0'
compile 'com.android.support.test.espresso:espresso-core:2.1'
compile 'com.android.support.test:testing-support-lib:0.1'
}
Run Code Online (Sandbox Code Playgroud)
请注意,compile而不是androidTestCompile测试支持依赖项.使用androidTestCompile上述问题中提到的问题的结果.
另请注意sourceSets声明中的两个srcDirs.当我手动创建androidTest/java目录时,该声明自动设置.这应该以不同的方式宣布吗
同样,getDefaultProguardFile在ide中用工具提示"无法解析符号'getDefaultProguardFile'"加下划线.如果这是至关重要的.
这种新的启示,切换androidTestCompile到compile,让我相信有什么毛病我成立了项目结构的单元测试的方式.这是我的项目结构图:
我应该提一下,从Eclipse迁移时会自动创建这个项目/模块结构.通过图标装饰,它看起来至少将我的测试类识别为测试类.
但现在我陷入了这个错误:
错误:任务':mymodule:dexDebug'的执行失败.com.android.ide.common.internal.LoggedErrorException:无法运行命令:C:\ …
我正在从机器人切换到浓缩咖啡,我正在使用apk编写测试,我无法访问代码.在使用solo.getView("view-id")的robotium中,我们可以访问视图,但我不知道如何在浓缩咖啡中进行操作?espresso witId()方法需要R.id.viewid,我无权访问.
public class AaEspressoTest {
private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME = "com.tri.re.CordActivity";
private static Class<?> launcherActivityClass;
static {
try {
launcherActivityClass = Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
@Rule
public ActivityTestRule<?> mActivityRule = new ActivityTestRule(launcherActivityClass);
@Test public void testHello() throws Exception{
onView(withText("Browse older recordings")).perform(click());
//Id is not accessible shows red
onView(withId(R.id.button)).perform(click());
}
}
Run Code Online (Sandbox Code Playgroud) 如果一个字符串显示在listAdapter的一个或多个项目中,那么android-espresso是否可以验证?
试着像这样的人:
onData(anything()).inAdapterView(withId(R.id.test)).check(matches(hasToString("Anmeldung steht noch aus!")));
Run Code Online (Sandbox Code Playgroud) 我在检查是否使用浓缩咖啡显示吐司时遇到问题。我正在上课:
import android.os.IBinder;
import android.support.test.espresso.Root;
import android.view.WindowManager;
import org.hamcrest.Description;
import org.hamcrest.TypeSafeMatcher;
public class ToastMatcher extends TypeSafeMatcher<Root> {
@Override
public void describeTo(Description description) {
description.appendText("is toast");
}
@Override
public boolean matchesSafely(Root root) {
int type = root.getWindowLayoutParams().get().type;
if ((type == WindowManager.LayoutParams.TYPE_TOAST)) {
IBinder windowToken = root.getDecorView().getWindowToken();
IBinder appToken = root.getDecorView().getApplicationWindowToken();
if (windowToken == appToken) {
// windowToken == appToken means this window isn't contained by any other windows.
// if it was a window for an activity, it would have TYPE_BASE_APPLICATION. …Run Code Online (Sandbox Code Playgroud) Android Studio 2.1.2
如果用户点击按钮并且用户名为空,我试图让测试失败.这是我的代码.但是,测试总是通过.有没有办法进行测试,如果它EditText是空的,它将失败.
@Test
public void shouldFailToLoginWithEmptyUserName() {
onView(withId(R.id.btnSignIn)).perform(ViewActions.click());
onView(withId(R.id.etUsername)).check(ViewAssertions.matches(withText("")));
}
Run Code Online (Sandbox Code Playgroud) 我最近使用espresso对我的android应用程序进行测试。但是有时候测试用例通过了,有时候没有通过。这是一个很长的异步任务,大约需要30秒才能完成。当它失败时,它将抛出此异常:
IdlingResourceTimeoutException
那么,有谁知道为什么会发生这种异常,这种异常的含义是什么?
我有一个异构的回收站视图,我试图将其滚动到位置30处的项目。我的测试通过了,但是我看不到屏幕实际在滚动。
onView(withId(R.id.content_view))
.perform(RecyclerViewActions.scrollToPosition(30));
Run Code Online (Sandbox Code Playgroud)
这就是我要做的滚动。
android android-espresso android-recyclerview android-espresso-recorder
这是我的代码:
onView(withId(R.id.first_name)).perform(
typeText("John"), closeSoftKeyboard());
SystemClock.sleep(5000);
onView(withId(R.id.last_name)).perform(typeText("Smith"));
Run Code Online (Sandbox Code Playgroud)
我从这里尝试了答案 Android:java.lang.SecurityException:注入到另一个应用程序需要INJECT_EVENTS权限 ,但没有帮助。
这是我使用的Expresso版本:
// Android Test Support Libraries
espressoRunnerVersion = "0.5"
espressoRulesVersion = "0.5"
espressoVersion = "2.2.2"
Run Code Online (Sandbox Code Playgroud)
这是完整的堆栈跟踪:
android.support.test.espresso.PerformException: Error performing 'type text(Smith)' on view 'with id: church.life.app:id/last_name'.
at android.support.test.espresso.PerformException$Builder.build(PerformException.java:84)
at android.support.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:81)
at android.support.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:52)
at android.support.test.espresso.ViewInteraction.waitForAndHandleInteractionResults(ViewInteraction.java:312)
at android.support.test.espresso.ViewInteraction.desugaredPerform(ViewInteraction.java:167)
at android.support.test.espresso.ViewInteraction.perform(ViewInteraction.java:110)
at church.life.app.ui.profile.ProfileSignupTest.InvalidSignupTest(ProfileSignupTest.java:44)
at java.lang.reflect.Method.invoke(Native Method)
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.InvokeMethod.evaluate(InvokeMethod.java:17)
at android.support.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) …Run Code Online (Sandbox Code Playgroud) 我正在尝试测试android偏好设置,而我对如何实现该结果感到有些困惑。
这是我的偏爱
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<ListPreference
android:id="@+id/numberListPreference"
android:defaultValue="3"
android:entries="@array/number_text"
android:entryValues="@array/number_value"
android:key="@string/pref_key"
android:summary="@string/pref_summary"
android:title="@string/pref_title" />
</PreferenceScreen>
Run Code Online (Sandbox Code Playgroud)
我想测试一下,当我更改显示的ListPreference中的数字时,实际上已更改了SharedPreference。
现在,代码可以正常工作了,我只是阻塞了测试部分。
这是我活动的一部分:
public class SettingActivity extends AppCompatActivity implements
SharedPreferences.OnSharedPreferenceChangeListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getFragmentManager()
.beginTransaction()
.replace(android.R.id.content, new SettingsFragment())
.commit();
}
public static class SettingsFragment extends PreferenceFragment {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是我遇到经典的“如果目标视图不属于视图层次结构”错误。
欢迎任何帮助。谢谢 !
android ×10
android-espresso ×10
java ×2
testing ×2
junit ×1
junit4 ×1
kotlin ×1
robotium ×1
toast ×1
unit-testing ×1