Automated tests 如何使用espresso从textview获取文本

Automated tests 如何使用espresso从textview获取文本,automated-tests,android-testing,android-espresso,Automated Tests,Android Testing,Android Espresso,我希望在LinearLayout中的文本视图中显示文本字符串。浓缩咖啡可以吗? 如果没有,是否有其他方法可以做到这一点,或者我可以在espresso测试用例中使用android api?我使用的是API 17 18或更高版本的浓缩咖啡1.1(应该是最新的)。我对此一无所知。谢谢。基本思想是使用带有内部ViewAction的方法,该方法在其perform方法中检索文本。匿名类只能访问final字段,因此我们不能让它设置一个局部变量getText(),而是使用一个字符串数组从ViewAction中获

我希望在LinearLayout中的文本视图中显示文本字符串。浓缩咖啡可以吗? 如果没有,是否有其他方法可以做到这一点,或者我可以在espresso测试用例中使用android api?我使用的是API 17 18或更高版本的浓缩咖啡1.1(应该是最新的)。我对此一无所知。谢谢。

基本思想是使用带有内部
ViewAction
的方法,该方法在其perform方法中检索文本。匿名类只能访问final字段,因此我们不能让它设置一个局部变量
getText()
,而是使用一个字符串数组从
ViewAction
中获取字符串

String getText(最终匹配器匹配器){
最终字符串[]stringHolder={null};
onView(matcher).perform(newviewAction()){
@凌驾
公共匹配器getConstraints(){
返回isAssignableFrom(TextView.class);
}
@凌驾
公共字符串getDescription(){
返回“从文本视图获取文本”;
}
@凌驾
公共作废执行(UiController UiController,视图){
TextView tv=(TextView)view;//保存,因为签入getConstraints()
stringHolder[0]=tv.getText().toString();
}
});
返回字符串保持器[0];
}

注意:这种视图数据检索器应小心使用。如果你经常发现自己在写这种方法,很有可能,你一开始就做错了。另外,永远不要访问
视图断言
视图操作
之外的视图,因为只有在那里才能确保交互是安全的,因为它是从UI线程运行的,在执行之前会检查,没有其他交互干扰。

如果要用另一个文本检查文本值,可以创建Matcher。您可以查看我的代码以创建自己的方法:

 public static Matcher<View> checkConversion(final float value){
    return new TypeSafeMatcher<View>() {

        @Override
        protected boolean matchesSafely(View item) {
            if(!(item instanceof TextView)) return false;

            float convertedValue = Float.valueOf(((TextView) item).getText().toString());
            float delta = Math.abs(convertedValue - value);

            return delta < 0.005f;
        }

        @Override
        public void describeTo(Description description) {
            description.appendText("Value expected is wrong");
        }
    };
}
公共静态匹配器校验转换(最终浮点值){
返回新的TypeSafeMatcher(){
@凌驾
受保护的布尔匹配安全(视图项){
如果(!(TextView的项目实例))返回false;
float-convertedValue=float.valueOf(((TextView)项).getText().toString());
float delta=Math.abs(convertedValue-value);
返回增量<0.005f;
}
@凌驾
公共无效说明(说明){
description.appendText(“预期值错误”);
}
};
}

是的,浓缩咖啡可以做到这一点,如果用的是一种很粗糙的方式。但大多数情况下,您不应该这样做,因为在测试中,您通常希望将textview中的文本与给定文本进行比较,或者测试其某些属性。有了更多关于你在测试中实际要做什么的细节,就更容易给出一个有用的答案。那么,黑客的方式到底是什么呢?怎么做?我需要将这些文本插入到报告中。谢谢你的考虑@haffax@haffax例如,您的应用程序可能调用具有不可预测结果的web服务。您需要检查一些文本以确定要执行的逻辑,因为预期的行为取决于应用程序从web服务获得的响应。这种事情不能用断言来解决,你需要得到文本,然后运行你的逻辑来确定期望值,只有这样你才能做断言。你能举例说明你的代码的用法吗?我不知道如何使用你的解决方案。感谢you@Loebre您可以像这样使用它
getText(withId(viewId))@haffax但如果您正在检查前端是否对字符串列表进行了排序,该怎么办?那么getText是非常需要的。MohammadRakibAmin不知道您的具体情况,但总的来说:一个固定的场景将在没有这种逻辑的情况下解决这个问题。例如,如果您的测试数据库返回水果“草莓、苹果、香蕉”,那么确认第一个显示的水果是苹果,第二个是香蕉,最后一个是草莓是该场景的最强测试。仅测试所显示的内容是否按字母顺序排列并没有多大价值,可能会导致误判。这仅在您希望对返回值进行断言时才有帮助,而不是在您希望仅获取值而不对其进行断言时才有帮助。例如,您的应用程序可能调用具有不可预测结果的web服务。您需要检查一些文本以确定要执行的逻辑,因为预期的行为取决于应用程序从web服务获得的响应。这种事情不能用断言来解决,你需要得到文本,然后运行逻辑来确定期望值,只有这样你才能做断言。你可以在我的回答中看到我指的是检查(断言)。我认为如果你想得到这个值,最好的答案是使用投票最多的答案。