显示带有标签的帖子 浓咖啡. 显示所有帖子
显示带有标签的帖子 浓咖啡. 显示所有帖子

2016年10月10日,星期一

如何使用Espresso测试自动完成文本框

这是当今最常见的测试方案,因为许多应用程序都在使用自动完成文本框/自动填充文本框。如果您尚未遇到此问题,则可以在开始在位置填充中键入内容时签出google map应用程序,然后显示匹配结果的下拉列表,您可以从列表中选择任何一个继续。关于需要从自动完成文本框中选择结果的测试用例。

让我们看看下面的谷歌地图示例,让我们编写Espresso测试用例来处理“自动完成文本框”值选择。

自动完成文本框测试自动化
自动完成文本框测试自动化

测试方案-

1.键入位置名称。
2.检查是否显示匹配结果列表。
3.单击任一匹配结果。

测试用例 -

1.在下面的示例测试案例中,我们使用的是Junit Testing Framework。
2.通过使用以下命令定义应用程序的主要活动 @Rule Annotation.
3.我们使用inRoot()和decor View在Main活动窗口中选择一个窗口。
4.首先,我们在位置字段中输入“禁令”,然后检查是否显示了前两个建议。
5.然后,我们单击“最佳”建议。


@RunWith(AndroidJUnit4.class)
@LargeTest
public class MultiWindowTest {

    @Rule
    public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(
            MainActivity.class);

    private MainActivity mActivity = null;

    @Before
    public void setActivity()  {
        mActivity = mActivityRule.getActivity() ;
    }

    @Test
    public void testAutoCompleteTextView()  {
        // Type "ban" to trigger two suggestions.
        onView(withId(R.id.auto_complete_text_view))
                .perform(typeText("ban"), closeSoftKeyboard() );

        // Check that both suggestions are displayed.
        onView(withText("Bangalore"))
                .在Root(withDecorView(not(is(mActivity.getWindow() .getDecorView() ))))
                .check(matches(isDisplayed() ));
        onView(withText("bangalore central mall"))
                .在Root(withDecorView(not(is(mActivity.getWindow() .getDecorView() ))))
                .check(matches(isDisplayed() ));
    }

        // Tap on a suggestion.
        onView(withText("Bangalore"))
                .在Root(withDecorView(not(is(mActivity.getWindow() .getDecorView() ))))
                .perform(click() );

        // By clicking on the auto complete term, the text should be filled 在.
        onView(withId(R.id.auto_complete_text_view))
                .check(matches(withText("Bangalore")));
    }

    

}

我希望这篇文章可以帮助您解决自动填充文本框测试问题。如果您觉得它有用,请与您的朋友分享,并在下面的评论部分中给我反馈或建议。

2016年9月29日星期四

使用Espresso Test Recorder记录测试案例



大家好,我很高兴与大家分享 Android Studio 2.2 已经启动,并且作为Android App Tester,已经为我们启动了一些非常有用的功能,那就是 浓缩咖啡测试记录仪。 在我们的 浓咖啡教程 我们已经了解了如何编码和运行Espresso测试用例,还研究了为WebViews和Intents等编写测试用例。 

在这篇文章中,我想与您分享有关新推出的Android的Espresso Test Recorder以及我们如何有效地记录和运行我们的测试用例的信息。如果您是手动测试仪并且不舒服,则必须学习此方法,因为它非常简单快捷地学习了Espresso的功能。如果您是Automation Tester,并且已经在使用Espresso,则必须尝试一下,这将减少您的工作量并帮助您加快测试用例的开发。

视频教程也可用- 

 

什么是Espresso Test Recorder?

浓咖啡是Android的Instrumentation测试框架,允许开发人员和测试人员编写UI测试用例以测试应用程序的功能。 浓咖啡 Test Recorder是Android Studio 2.2中引入的新功能,它使用户可以在设备中手动执行步骤并添加断言以记录测试用例。 

浓咖啡 Test Recorder的优点-
1.允许我们创建有效的基于UI的测试用例 与用户互动。
2.我们可以捕获断言和交互,而无需直接访问应用程序的结构,这可以提高执行速度并优化测试用例。
3.它节省了很多时间来查找定位器然后编写测试用例。
4.它支持多个断言,使测试案例更加可靠。
浓咖啡 Test Recorder的缺点-
1.当前不支持WebViews交互的记录。
2. 一旦我们完成一次录制,下一次录制将启动该应用程序,则没有API可控制此类行为。
3.无法记录吐司消息的断言

逐步记录第一个Espresso测试用例-

前提条件
1. Android Studio 2.2
2. Java 8
3.为JAVA_HOME和Android_HOME设置环境变量

行动装置设定
1.进入手机设置
2.开发人员选项
3.关闭 Windows Animator缩放比例,Transition Animator缩放比例&动画时长比例.



记录UI交互
1. 发射 Android Studio 
2.单击开始新的Android Studio项目
3.输入申请名称为 浓咖啡TestRecorder
4.点击 下一页


5.点击 下一页


6.选择 空白活动 和 click on 下一页


7.您的Android项目将打开
8.前往 跑 ->记录咖啡测试 


9.选择一个设备,然后单击确定
10.检查您的设备,它会说 “等待调试器” 在窗口关闭(不要单击“强制关闭”)后安装应用程序后,开始在移动应用程序上执行“轻按并键入事件”。


记录断言
1.点击 添加断言
2.它将获取设备的屏幕截图并将其显示在屏幕上。


3. In 编辑断言 在此部分,您可以选择要添加的断言类型。


4.点击 保存断言。
5.然后单击“完整记录”以保存您的测试用例

保存测试用例
1.将出现一个弹出窗口,其中记录了测试的活动名称,您可以编辑名称
2.点击保存


3.测试用例将保存在Android中->app->带有(androidTest)的软件包名称->TestClassName

运行测试用例
1.找到测试类别后,右键单击名称
2.点击 .




学习起来简单有趣吗?在评论部分中写下您的查询和问题,并推广有关New 浓咖啡 Test Recorder的信息,以减轻工作负担。测试愉快:-)



2016年3月11日,星期五

如何在Espresso中匹配视图的子视图



大家好,只要我们想单击垂直列或行内的零件,大多数情况下单击视图的子视图都用于ListView。在上一篇文章中,我们已经看到一个ListView示例,其中大约有50行包含文本和切换按钮。我们将只使用相同的示例,并学习如何在espresso中匹配子视图。

正在测试的应用-
考虑到我们有 一个具有ListView和ListView的应用程序分为两列,第一列是文本,第二列是文本中的字符数。列表视图在第一列中具有唯一的文本,但是第二列具有重复的条目。

测试案例方案-
1.在列表中检查一行,其中文本为“ Dog”和“ 3”。
2.单击3,其中在不同的行中多次出现3,但是我们要在行中单击文本“ Dog。”中的“ 3”。

测试用例 -
大家都已经熟悉意式浓缩咖啡。我只是给您下面的简单测试用例,以实现我们的测试用例目标。


@Test
public void testChildView() 
{
onData(withItemContent("Dog"))
  .onChildView(withId(R.id.no_char))
  .perform(click() );
}

我希望这篇文章可以帮助您找到测试服的代码范围:)
请在下面的评论部分中分享您的反馈,并按照质量检查自动化以获取最新的帖子更新。HappyTesting :-)

浓咖啡资源闲置示例


浓咖啡的优势在于其能够无缝同步所有测试操作与被测应用程序的能力。默认情况下,Espresso等待当前消息队列中的UI事件得到处理,并等待AsyncTask的默认实例完成,然后再进行下一个测试操作。

但是,在某些情况下,应用程序会使用非标准方式(例如直接创建和管理线程)执行后台操作,例如与Web服务通信。

在这种情况下,您必须使用空闲资源来通知Espresso应用程序’长期运行的操作。

1.修改  java class MainActivity.java 应用程式>src->Main.
2.添加方法 getIdlingResource() 如下例所示。

package com.example.和roid.testing.espresso.IdlingResourceSample;

import 和roid.app.Activity;
import 和roid.os.Bundle;
import 和roid.support.annotation.NonNull;
import 和roid.support.annotation.Nullable;
import 和roid.support.annotation.VisibleForTesting;
import 和roid.support.test.espresso.IdlingResource;
import 和roid.support.test.espresso.idling.CountingIdlingResource;
import 和roid.view.View;
import 和roid.widget.EditText;
import 和roid.widget.TextView;

import com.example.android.testing.espresso.IdlingResourceSample.IdlingResource.SimpleIdlingResource;

/**
 * Gets a text String from the user 和 displays it back after a while.
 */
public class MainActivity extends Activity implements View.OnClickListener,
        MessageDelayer.DelayerCallback {

    // The TextView used to display the message 内 the Activity.
    private TextView mTextView;

    // The EditText where the user types the message.
    private EditText mEditText;

    // The Idling Resource which will be null 在 production.
    @Nullable private SimpleIdlingResource mIdlingResource;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Set the listeners for the buttons.
        findViewById(R.id.changeTextBt).setOnClickListener(this);

        mTextView = (TextView) findViewById(R.id.textToBeChanged);
        mEditText = (EditText) findViewById(R.id.editTextUserInput);
    }

    @Override
    public void onClick(View view) {
        // Get the text from the EditText view.
        final String text = mEditText.getText() .toString() ;

        if (view.getId()  == R.id.changeTextBt) {
            // Set a temporary text.
            mTextView.setText(R.string.waiting_msg);
            // Submit the message to the delayer.
            MessageDelayer.processMessage(text, this, mIdlingResource);
        }
    }

    @Override
    public void onDone(String text) {
        // The delayer notifies the activity via a callback.
        mTextView.setText(text);
    }

    /**
     * Only called from test, creates 和 returns a new {@link SimpleIdlingResource}.
     */
    @VisibleForTesting
    @NonNull
    public IdlingResource getIdlingResource()  {
        if (mIdlingResource == null) {
            mIdlingResource = new SimpleIdlingResource() ;
        }
        return mIdlingResource;
    }
}

3.向其中注册一个或多个空闲资源 Espresso by calling 浓咖啡.registerIdlingResource() 在测试设置中,然后在拆卸中,我们应该使用代码注销
 浓咖啡.unregisterIdlingResources(mIdlingResource);



/*
 * 版权2016, The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except 在 compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to 在 writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions 和
 * limitations under the License.
 */

package com.example.和roid.testing.espresso.IdlingResourceSample;

import static 和roid.support.test.espresso.浓咖啡.onView;
import static 和roid.support.test.espresso.action.ViewActions.click;
import static 和roid.support.test.espresso.action.ViewActions.closeSoftKeyboard;
import static 和roid.support.test.espresso.action.ViewActions.typeText;
import static 和roid.support.test.espresso.assertion.ViewAssertions.matches;
import static 和roid.support.test.espresso.matcher.ViewMatchers.withId;
import static 和roid.support.test.espresso.matcher.ViewMatchers.withText;

import 和roid.support.test.espresso.Espresso;
import 和roid.support.test.espresso.IdlingResource;
import 和roid.support.test.filters.LargeTest;
import 和roid.support.test.rule.ActivityTestRule;
import 和roid.support.test.runner.AndroidJUnit4;

import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;


/**
 * Same as 浓咖啡's BasicSample, but with an Idling Resource to help with synchronization.
 */
@RunWith(AndroidJUnit4.class)
@LargeTest
public class ChangeTextBehaviorTest {

    private static final String STRING_TO_BE_TYPED = "浓咖啡";

    @Rule
    public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(
            MainActivity.class);

    private IdlingResource mIdlingResource;

    @Before
    public void registerIdlingResource()  {
        mIdlingResource = mActivityRule.getActivity() .getIdlingResource() ;
        // To prove that the test fails, omit this call:
        浓咖啡.registerIdlingResources(mIdlingResource);
    }

    @Test
    public void changeText_sameActivity()  {
        // Type text 和 then press the button.
        onView(withId(R.id.editTextUserInput))
                .perform(typeText(STRING_TO_BE_TYPED), closeSoftKeyboard() );
        onView(withId(R.id.changeTextBt)).perform(click() );

        // Check that the text was changed.
        onView(withId(R.id.textToBeChanged)).check(matches(withText(STRING_TO_BE_TYPED)));
    }

    @After
    public void unregisterIdlingResource()  {
        if (mIdlingResource != null) {
            浓咖啡.unregisterIdlingResources(mIdlingResource);
        }
    }
}

我希望这篇文章可以帮助您找到测试服的代码范围:)
请在下面的评论部分中分享您的反馈,并按照质量检查自动化以获取最新的帖子更新。HappyTesting :-)
 

2016年3月6日星期日

如何使用Jacoco和Gradle查找代码覆盖率?




查找代码覆盖率对于测试非常重要,因为它可以让您评估测试工作。如果您已经为应用程序准备了一套测试套件,但是不确定测试套件是否涵盖了多少代码百分比,那么确定代码覆盖范围将是一个好习惯。获得覆盖率报告后,您将确切地知道测试用例中未覆盖的代码部分,然后可以添加测试用例来覆盖代码。

Jacoco是Java代码覆盖率工具,可让您计算单元测试和功能测试的代码覆盖率。 Jacoco可以与Ant,maven和gradle一起使用。今天,我将向您展示Jacoco与Gradle for 浓咖啡测试服的逐步集成。

我已经为Simple Hello world项目完成了此设置,以了解Jacoco的工作原理,并为您提供适当的代码覆盖率报告。

影片教学-



1.创建一个android项目,如图所示 以前的帖子。
2.在里面创建一个java类 src->main->androidTest 并在课堂上编写您的Espresso测试用例。
3.创建一个名为 AndroidJococoTestRunner src-> main ->androidTest 并在类内复制以下代码。


import 和roid.os.Bundle;
import 和roid.support.test.runner.AndroidJUnitRunner;
import 和roid.util.Log;

import java.io.IOException;
import java.lang.reflect.Method;
import java.nio.charset.Charset;


public class AndroidJacocoTestRunner extends AndroidJUnitRunner {

    private static final Charset UTF8 = Charset.forName("UTF-8");

    static {
//    System.setProperty("jacoco-agent.destfile", "/sdcard/coverage.ec");
    }

    @Override
    public void finish(在t resultCode, Bundle results) {
        try {
            Class rt = Class.forName("org.jacoco.agent.rt.RT");
            Method getAgent = rt.getMethod("getAgent");
            Method dump = getAgent.getReturnType() .getMethod("dump", boolean.class);
            Object agent = getAgent.在voke(null);
            dump.在voke(agent, false);
        } catch (Throwable e) {
            final String trace = Log.getStackTraceString(e);

            try {
                System.out.write(trace.getBytes(UTF8));
            } catch (IOException ignored) {
            }
        }

        super.finish(resultCode, results);
    }
}

4.开放 应用程式> build.gradle 和  copy below code 在 defaultConfig.

testInstrumentationRunner "com.example.anuja.myapplication1.AndroidJacocoTestRunner"

还要在buidTypes中添加下面给出的代码。


debug {
            testCoverageEnabled = true
        }

5.然后单击右侧的Gradle Android Studio-> click on refresh -> other ->右键单击createDebugAndroidTestCoverageReport-> click on run

Android应用程序的代码覆盖率
Android应用程序的代码覆盖率

6.此操作将在其中运行所有测试用例 src->main->androidTest 和 give the report 在 应用程式>build-> reports ->coverage -> debug.
7.打开 在dex.html 在浏览器中检查文件覆盖率报告,如下面的屏幕快照所示。

Jacoco代码覆盖率

Android应用程序的详细代码覆盖率
Android应用程序的详细代码覆盖率

从Android Studio获取代码覆盖率
从Android Studio获取代码覆盖率

我希望这篇文章可以帮助您找到测试服的代码范围:)
请在下面的评论部分中分享您的反馈,并按照质量检查自动化以获取最新的帖子更新。HappyTesting :-)

2016年2月25日星期四

使用意图测试相机活动



我们已经看到了如何使用意图进行应用间测试,到目前为止,我们已经看到了如何测试Dialer和Browser活动。在帖子中,我将为您提供测试Camera Activity的简单示例。有许多应用程序使用相机捕获图像并共享图像。现在,使用Espresso Intent可以非常轻松地测试这种情况。

正在测试的应用-
我已经按照截图创建了一个简单的应用程序,当您单击相机时,它会启动相机活动,然后您可以捕获图像。

使用Espresso测试相机活动

测试案例方案-
1.启动应用程序。
2.拿  a photo 
3.检查照片是否已拍摄并显示在“图像视图”框中。

测试用例代码说明-
1.我们需要创建一个自定义匹配器,以检查图像视图中是否包含图像。因此,在名称为ImageViewMatcher的androidTest文件夹中创建一个新的Java类,然后复制下面给出的代码。
2.在“测试用例”类中,我们将使用应用启动器图标图像对摄像机活动进行存根,以便我们进行交叉检查。因此,我们使用createImageCaptureStub()方法将应用程序可绘制图像放入包中,并使用包创建Intent,然后传递与ActivityResult相同的intent。
3.在执行测试用例之前,我们先将意图存根,以便当应用启动相机时,可绘制图像将作为预期存根的一部分传递。
4.然后在我们的测试用例中,单击“ camera”按钮,该按钮将调用“意图”,并且我们获得了先前绘制的可绘制图像,并且可以在测试用例中对其进行断言。
自定义匹配器-

package com.example.anuja.cameraintentsample;

/**
 * Created by Anuja on 24-02-2016.
 */
import 和roid.support.test.espresso.matcher.BoundedMatcher;
import 和roid.view.View;
import 和roid.widget.ImageView;

import org.hamcrest.Description;
public class ImageViewMatcher {

    public static BoundedMatcher<View, ImageView> hasDrawable()  {
        return new BoundedMatcher<View, ImageView>(ImageView.class) {
            @Override
            public void describeTo(Description description) {
                description.appendText("has drawable");
            }

            @Override
            public boolean matchesSafely(ImageView imageView) {
                return imageView.getDrawable()  != null;
            }
        };
    }
}

测试用例 -


package com.example.anuja.cameraintentsample;

import 和roid.app.Activity;
import 和roid.content.Intent;
import 和roid.graphics.BitmapFactory;
import 和roid.os.Bundle;
import 和roid.provider.MediaStore;
import 和roid.support.test.espresso.intent.rule.IntentsTestRule;
import 和roid.support.test.rule.ActivityTestRule;
import 和roid.support.test.runner.AndroidJUnit4;
import 和roid.test.suitebuilder.annotation.LargeTest;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

import static 和roid.app.Instrumentation.ActivityResult;
import static 和roid.support.test.espresso.浓咖啡.onView;
import static 和roid.support.test.espresso.action.ViewActions.click;
import static 和roid.support.test.espresso.assertion.ViewAssertions.matches;
import static 和roid.support.test.espresso.在tent.Intents.在tending;
import static 和roid.support.test.espresso.在tent.matcher.IntentMatchers.hasAction;
import static 和roid.support.test.espresso.matcher.ViewMatchers.withId;

import static com.example.anuja.cameraintentsample.ImageViewMatcher.hasDrawable;
import static org.hamcrest.Matchers.not;

/**
 * Created by Anuja on 24-02-2016.
 */
@RunWith(AndroidJUnit4.class)
@LargeTest
public class CameraIntentTest {

        @Rule
        public IntentsTestRule<ImageViewerActivity> mIntentsRule = new IntentsTestRule<>(
                ImageViewerActivity.class);

        @Before
        public void stubCameraIntent()  {
            ActivityResult result = createImageCaptureStub() ;

            // Stub the Intent.
            在tending(hasAction(MediaStore.ACTION_IMAGE_CAPTURE)).respondWith(result);
        }

        @Test
        public void testTakePhoto()  {
            // Check that the ImageView doesn't have a drawable applied.
            onView(withId(R.id.imageView)).check(matches(not(hasDrawable() )));

            // Click on the button that will trigger the stubbed 在tent.
            onView(withId(R.id.button_take_photo)).perform(click() );

            // With no user 在teraction, the ImageView will have a drawable.
            onView(withId(R.id.imageView)).check(matches(hasDrawable() ));
        }

        private ActivityResult createImageCaptureStub()  {
            // Put the drawable 在 a bundle.
            Bundle bundle = new Bundle() ;
            bundle.putParcelable(ImageViewerActivity.KEY_IMAGE_DATA, BitmapFactory.decodeResource(
                    mIntentsRule.getActivity() .getResources() , R.drawable.ic_launcher));

            // Create the Intent that will 在clude the bundle.
            Intent resultData = new Intent() ;
            resultData.putExtras(bundle);

            // Create the ActivityResult with the Intent.
            return new ActivityResult(Activity.RESULT_OK, resultData);
        }
    }

我希望这篇文章可以帮助您找到测试服的代码范围:)
请在下面的评论部分中分享您的反馈,并按照质量检查自动化以获取最新的帖子更新。HappyTesting :-)

2016年2月24日星期三

意向测试浏览器活动的启动



在我之前的文章中,我们已经了解了如何使用Espresso Intent测试拨号程序的活动。我们知道有时我们的应用程序会启动应用程序拨号程序,摄像头或浏览器等外部的活动。在本文中,我们将学习如何使用Intent测试测试浏览器的活动。

正在测试的应用-
考虑您有一个带有“单击此处”按钮的应用程序。单击后,将启动Chrome浏览器并打开网址www.google.com。

测试案例方案-
我们的测试用例是单击按钮并检查浏览器活动是否已启动并打开正确的URL。

测试用例-


import 和roid.content.Intent;
import 和roid.support.test.espresso.intent.rule.IntentsTestRule;
import 和roid.support.test.runner.AndroidJUnit4;
import 和roid.test.suitebuilder.annotation.LargeTest;
import org.junit.FixMethodOrder;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.MethodSorters;
import static 和roid.support.test.espresso.浓咖啡.onView;
import static 和roid.support.test.espresso.action.ViewActions.click;
import static 和roid.support.test.espresso.在tent.Intents.在tended;
import static 和roid.support.test.espresso.在tent.matcher.IntentMatchers.hasAction;
import static 和roid.support.test.espresso.在tent.matcher.IntentMatchers.hasData;
import static 和roid.support.test.espresso.在tent.matcher.IntentMatchers.toPackage;
import static 和roid.support.test.espresso.在tent.matcher.UriMatchers.hasHost;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.equalTo;
@RunWith(AndroidJUnit4.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@LargeTest
public class BrowserIntentTest {

    private static final String PACKAGE_NAME="com.android.chrome";
    @Rule
    public IntentsTestRule<MainActivity> mActivityRule = new IntentsTestRule<>(
            MainActivity.class);

    @Test
    public void test1() throws Exception
    {
            Thread.sleep(3000);
            onView(withId("Click Here")).perform(click() );
            Thread.sleep(1000);
            在tended(allOf(hasData(hasHost(equalTo("www.google.com"))),
                    hasAction(Intent.ACTION_VIEW),
                    toPackage(PACKAGE_NAME)));

    }
}

我希望这篇文章可以帮助您找到测试服的代码范围:)
请在下面的评论部分中分享您的反馈,并按照质量检查自动化以获取最新的帖子更新。HappyTesting :-)