>& STDOUT

主にソフトウェアに関する日々の標準出力+標準エラー出力

NativeDriverを使ってみた:サンプルテストコード読む編その2

次にサンプルで入ってるテストコードの中でいちばん何やってるかさっぱりわからない FindByTextTest を見てみます。これの難点は「そもそも何のテストをしてるのか挙動からは読み取れない」点なので各テストの解説から。

testFindByText_noResults
public void testFindByText_noResults()

メソッド名からだいたい察しがつきますが、planet というプルダウンメニューの中に「Earth」があること「Pluto」が無いこと、を確認しています。前者はまあわかるのですが、後者、

try {
   // Search for something that should not appear. Pluto is not a planet.
   driver.findElement(AndroidNativeBy.text("Pluto"));
   fail("Should have thrown a NoSuchElementException.");
} catch (NoSuchElementException exception) {
   // Expected exception.
}

無いこと、を確認するために findElement で例外を起こしてそれをcatchして次に進む感じになってます。少し冗長に感じますが、こういうお作法なのでしょうか。

testFindByText_resultFromSpinnerPopup
public void testFindByText_resultFromSpinnerPopup()

次これ。Spinnerからテキストを選んで、それが正しく選択されている事を確認します。ここで初見のclassが出てきます。

driver.findElement(AndroidNativeBy.text("Wolf 359")).click();

AndroidNativeBy 例によってまだドキュメントが無いので実装を確認すると、名前そのまんまにAndroidに特化した構造検索のメソッドをまとめるclassのようです。

   assertEquals(
        "'Wolf 359' should appear in child TextView of the spinner control.",
        1, starsSpinner.findElements(AndroidNativeBy.text("Wolf 359")).size());

ここで、AndroidNativeByによって返されるリストの大きさが1(=見つかった)であることを確認しています。

testFindByText_elementInitiallyInvisible

最初に表示されるplanetのプルダウンの初期値が”Neptune”で無いこと、さらに、プルダウンから”Neptune”を選んで正しくその値が表示されている事を確認しています。ここで謎なのが、

    assertEquals("Element with text 'Neptune' should be invisible at first.",
        ImmutableList.of(),
        driver.findElements(AndroidNativeBy.text("Neptune")));

これ。ナゼ空のリストを使う必要があるのでしょう??既にどこかで検証用のリストを作っているのならともかく、その形跡はありません。

testFindByPartialText_multipleResultsFromSpinnerPopup

プルダウンメニューの中の要素が、ある部分テキストを持っていることを確認するテスト。ここでは、

    assertEquals(
        "Should have found two planets with 'ar' in name: Earth and Mars.",
        2, elementsWithArInText.size());

"ar" という部分文字列がプルダウンメニューの各要素にあるかどうかを確認しています。"Earth"と"Mars"は持ってるよね?的な。部分テキストの存在を確認するメソッドは先程のAndroidNativeByの中にあります。


注目すべきなのはやはりここ

    // Ensure the new UI is focused by performing a UI operation
    driver.findElement(AndroidNativeBy.text("Choose a planet"))
        .sendKeys(AndroidKeys.DPAD_DOWN, AndroidKeys.DPAD_UP);


新しいUIになっても動くようにしてあるよ!だと思うのですが実装みると

  DPAD_DOWN(Keys.ARROW_DOWN, KeyEvent.KEYCODE_DPAD_DOWN),
  DPAD_LEFT(Keys.ARROW_LEFT, KeyEvent.KEYCODE_DPAD_LEFT),

こうなってます。なるほど。直後のsendKeysも謎ですが、恐らくプルダウンメニューの”中身” の方にフォーカスを移しているものと思われます。

あとは、先程のassertEqualsの中でリストの要素が2であることを確認、ですね。



いくつか謎な点が残ってしまいましたが、もう少し落ち着いてまた読んでみようと思います。