14

我有个问题

我想测试按钮单击后是否使用浓缩咖啡启动了网络浏览器。问题是:甚至有可能测试这样的东西吗?如果有任何想法我会怎么做?

4

3 回答 3

35

虽然这是一个老问题,但只是在这里发布以帮助其他人。我有同样的情况,我想验证一个特定的 url 是否在浏览器中启动。我从这个链接得到了真正的帮助

我使用这段代码让它工作:

    Intents.init();
    Matcher<Intent> expectedIntent = allOf(hasAction(Intent.ACTION_VIEW), hasData(EXPECTED_URL));
    intending(expectedIntent).respondWith(new Instrumentation.ActivityResult(0, null));
    onView(withId(R.id.someid)).perform(click());
    intended(expectedIntent);
    Intents.release();

因此,它会测试何时使用正确的 url 打开浏览器,并且intenting()通过启用意图存根来发挥作用。使用它,我们可以拦截它,因此意图永远不会发送到系统。

于 2016-01-28T17:15:47.187 回答
5

为方便起见,我建议一个完整的例子:


生产代码:

register_terms.text = Html.fromHtml(getString(R.string.register_terms,
        getString(R.string.privacy_policy_url),
        getString(R.string.register_terms_privacy_policy),
        getString(R.string.general_terms_and_conditions_url),
        getString(R.string.register_terms_general_terms_and_conditions)))

字符串 XML:

<string name="register_terms">By registering you accept our &lt;a href=\"%1$s\">%2$s&lt;/a&gt; and the &lt;a href=\"%3$s\">%4$s&lt;/a&gt;.</string>
<string name="register_terms_privacy_policy">Privacy Policy</string>
<string name="register_terms_general_terms_and_conditions">General Terms and Conditions</string>

<string name="privacy_policy_url" translatable="false">https://www.privacypolicy.com</string>
<string name="general_terms_and_conditions_url" translatable="false">https://www.generraltermsandconditions.com</string>

测试代码:

@Before
fun setUp() {
    Intents.init()
}

@After
fun tearDown() {
    Intents.release()
}

@Test
fun when_clickPrivacyLink_then_openPrivacyUrl() {
    val expected = allOf(IntentMatchers.hasAction(Intent.ACTION_VIEW), IntentMatchers.hasData(string(privacy_policy_url)))
    Intents.intending(expected).respondWith(Instrumentation.ActivityResult(0, null))

    onView(ViewMatchers.withId(R.id.register_terms))
            .perform(openLinkWithText(string(register_terms_privacy_policy)))

    Intents.intended(expected)
}
于 2017-08-08T15:28:59.133 回答
4

其实没有。Espresso 将允许您单击按钮,一旦浏览器启动,测试将结束。您拥有的替代方法是让您的类触发浏览器 Intent 模拟,以便您可以测试剩余的流程(如果有)。

看看这个答案:控制自动化测试何时结束 - Espresso,我在其中描述了如何实现这一目标。

于 2014-02-26T01:57:03.877 回答