Khung thử nghiệm cà phê espresso - Xem người đối sánh

Khung Espresso cung cấp nhiều trình so khớp chế độ xem. Mục đích của trình so khớp là so khớp một chế độ xem bằng cách sử dụng các thuộc tính khác nhau của chế độ xem như Id, Văn bản và tính khả dụng của chế độ xem con. Mỗi đối sánh khớp với một thuộc tính cụ thể của chế độ xem và áp dụng cho loại chế độ xem cụ thể. Ví dụ: trình đối sánh withId khớp với thuộc tính Id của chế độ xem và áp dụng cho tất cả chế độ xem, trong khi trình đối sánh withText khớp với thuộc tính Văn bản của chế độ xem và chỉ áp dụng cho TextView .

Trong chương này, chúng ta hãy tìm hiểu các bộ so khớp khác nhau được cung cấp bởi khung thử nghiệm cà phê espresso cũng như tìm hiểu thư viện Hamcrest mà các bộ phối trộn espresso được xây dựng trên đó.

Thư viện Hamcrest

Thư viện Hamcrest là một thư viện quan trọng trong phạm vi khung thử nghiệm cà phê espresso. Bản thân Hamcrest là một khuôn khổ để viết các đối tượng so khớp. Espresso framework sử dụng rộng rãi thư viện Hamcrest và mở rộng nó bất cứ khi nào cần thiết để cung cấp các bộ so khớp đơn giản và có thể mở rộng.

Hamcrest cung cấp một chức năng đơn giản assertThat và một bộ sưu tập của quẹt để khẳng định bất kỳ đối tượng. khẳng định Điều đó có ba đối số và chúng như được hiển thị bên dưới -

  • Chuỗi (mô tả bài kiểm tra, tùy chọn)

  • Đối tượng (thực tế)

  • Matcher (dự kiến)

Hãy để chúng tôi viết một ví dụ đơn giản để kiểm tra xem một đối tượng danh sách có giá trị mong đợi hay không.

import static org.hamcrest.Matchers.hasItem;
import static org.hamcrest.MatcherAssert.assertThat;
@Test
public void list_hasValue() {
   ArrayList<String> list = new ArrayList<String>();
   list.add("John");
   assertThat("Is list has John?", list, hasItem("John"));
}

Ở đây, hasItem trả về một đối sánh, kiểm tra xem danh sách thực có giá trị được chỉ định là một trong các mục hay không.

Hamcrest có rất nhiều trình kết hợp cài sẵn và cũng có các tùy chọn để tạo trình kết hợp mới. Một số công cụ so khớp tích hợp quan trọng hữu ích trong khung thử nghiệm cà phê espresso như sau:

bất cứ điều gì - luôn luôn phù hợp

Trình so khớp dựa trên lôgic

  • allOf - chấp nhận bất kỳ số lượng đối sánh nào và chỉ đối sánh nếu tất cả các đối sánh đều thành công.

  • anyOf - chấp nhận bất kỳ số lượng đối sánh nào và đối sánh nếu bất kỳ một đối sánh nào thành công.

  • not - chấp nhận một trình kết hợp và chỉ khớp nếu trình kết hợp không thành công và ngược lại.

Đối sánh dựa trên văn bản

  • equalToIgnoringCase - được sử dụng để kiểm tra xem đầu vào thực tế có bằng với chuỗi ký tự bỏ qua dự kiến ​​hay không.

  • equalToIgnoringWhiteSpace - được sử dụng để kiểm tra xem đầu vào thực tế có bằng với chuỗi được chỉ định bỏ qua chữ hoa và khoảng trắng hay không.

  • containsString - được sử dụng để kiểm tra xem đầu vào thực tế có chứa chuỗi được chỉ định hay không.

  • endsWith - được sử dụng để kiểm tra xem đầu vào thực tế có bắt đầu bằng chuỗi được chỉ định hay không.

  • startsWith - được sử dụng để kiểm tra xem thực tế đầu vào có kết thúc bằng chuỗi được chỉ định hay không.

Đối sánh dựa trên số

  • closeTo - được sử dụng để kiểm tra xem liệu đầu vào thực tế có gần với số lượng dự kiến ​​hay không.

  • greaterThan - được sử dụng để kiểm tra xem liệu đầu vào thực tế có lớn hơn số lượng mong đợi hay không.

  • greaterThanOrEqualTo - được sử dụng để kiểm tra xem liệu đầu vào thực tế có lớn hơn hoặc bằng số lượng mong đợi hay không.

  • lessThan - được sử dụng để kiểm tra xem liệu đầu vào thực tế có nhỏ hơn số lượng dự kiến ​​hay không.

  • lessThanOrEqualTo - được sử dụng để kiểm tra xem liệu đầu vào thực tế có nhỏ hơn hoặc bằng số lượng mong đợi hay không.

Đối tượng dựa trên đối tượng

  • equalTo - được sử dụng để kiểm tra xem đầu vào thực tế có bằng với đối tượng mong đợi hay không

  • hasToString - được sử dụng để kiểm tra xem đầu vào thực tế có phương thức toString hay không.

  • instanceOf - được sử dụng để kiểm tra xem đầu vào thực sự có phải là trường hợp của lớp mong đợi hay không.

  • isCompatibleType - được sử dụng để kiểm tra xem đầu vào thực tế có tương thích với kiểu mong đợi hay không.

  • notNullValue - được sử dụng để kiểm tra xem đầu vào thực tế có phải là giá trị rỗng hay không.

  • sameInstance - được sử dụng để kiểm tra xem đầu vào thực tế và dự kiến ​​có giống nhau không.

  • hasProperty - được sử dụng để kiểm tra xem đầu vào thực tế có thuộc tính mong đợi hay không

là - Đường hoặc cắt ngắn cho bằng nhau

Người đối sánh

Espresso cung cấp phương thức onView () để khớp và tìm các chế độ xem. Nó chấp nhận đối sánh chế độ xem và trả về đối tượng ViewInteraction để tương tác với chế độ xem đã khớp. Danh sách các trình so khớp chế độ xem thường được sử dụng được mô tả bên dưới:

withId ()

withId () chấp nhận một đối số kiểu int và đối số này tham chiếu đến id của khung nhìn. Nó trả về một đối sánh, đối sánh với chế độ xem bằng cách sử dụng id của chế độ xem. Mã mẫu như sau,

onView(withId(R.id.testView))

withText ()

withText () chấp nhận một đối số kiểu chuỗi và đối số tham chiếu đến giá trị của thuộc tính văn bản của chế độ xem. Nó trả về một đối sánh, đối sánh với chế độ xem bằng cách sử dụng giá trị văn bản của chế độ xem. Nó chỉ áp dụng cho TextView . Mã mẫu như sau,

onView(withText("Hello World!"))

withContentDescription ()

withContentDescription () chấp nhận một đối số kiểu chuỗi và đối số đề cập đến giá trị của thuộc tính mô tả nội dung của chế độ xem. Nó trả về một đối sánh, đối sánh với chế độ xem bằng cách sử dụng mô tả của chế độ xem. Mã mẫu như sau,

onView(withContentDescription("blah"))

Chúng ta cũng có thể chuyển id tài nguyên của giá trị văn bản thay vì chính văn bản.

onView(withContentDescription(R.id.res_id_blah))

hasContentDescription ()

hasContentDescription () không có đối số. Nó trả về một trình so khớp, phù hợp với chế độ xem có bất kỳ mô tả nội dung nào. Mã mẫu như sau,

onView(allOf(withId(R.id.my_view_id), hasContentDescription()))

withTagKey ()

withTagKey () chấp nhận một đối số kiểu chuỗi và đối số tham chiếu đến khóa thẻ của chế độ xem. Nó trả về một đối sánh, đối sánh với chế độ xem bằng cách sử dụng khóa thẻ của nó. Mã mẫu như sau,

onView(withTagKey("blah"))

Chúng tôi cũng có thể chuyển id tài nguyên của tên thẻ thay vì chính tên thẻ.

onView(withTagKey(R.id.res_id_blah))

withTagValue ()

withTagValue () chấp nhận đối số kiểu Matcher <Đối tượng> và đối số tham chiếu đến giá trị thẻ của chế độ xem. Nó trả về một đối sánh, đối sánh với chế độ xem bằng cách sử dụng giá trị thẻ của nó. Mã mẫu như sau,

onView(withTagValue(is((Object) "blah")))

Dưới đây, là hamcrest khớp.

withClassName ()

withClassName () chấp nhận một đối số kiểu Matcher <Chuỗi> và đối số tham chiếu đến giá trị tên lớp của chế độ xem. Nó trả về một trình so khớp, khớp với chế độ xem sử dụng tên lớp của nó. Mã mẫu như sau,

onView(withClassName(endsWith("EditText")))

Ở đây, kết thúcWith là Hamcrest matcher và trả về Matcher <Chuỗi>

withHint ()

withHint () chấp nhận một đối số kiểu Matcher <Chuỗi> và đối số tham chiếu đến giá trị gợi ý của chế độ xem. Nó trả về một đối sánh, đối sánh với chế độ xem bằng cách sử dụng gợi ý của chế độ xem. Mã mẫu như sau,

onView(withClassName(endsWith("Enter name")))

withInputType ()

withInputType () chấp nhận một đối số kiểu int và đối số tham chiếu đến kiểu đầu vào của dạng xem. Nó trả về một trình so khớp, khớp với chế độ xem sử dụng kiểu đầu vào của nó. Mã mẫu như sau,

onView(withInputType(TYPE_CLASS_DATETIME))

Ở đây, TYPE_CLASS_DATETIME đề cập đến ngày và giờ hỗ trợ chế độ xem chỉnh sửa.

withResourceName ()

withResourceName () chấp nhận một đối số kiểu Matcher <Chuỗi> và đối số tham chiếu đến giá trị tên lớp của chế độ xem. Nó trả về một trình so khớp, khớp với chế độ xem sử dụng tên tài nguyên của chế độ xem. Mã mẫu như sau,

onView(withResourceName(endsWith("res_name")))

Nó cũng chấp nhận đối số chuỗi. Mã mẫu như sau,

onView(withResourceName("my_res_name"))

withAlpha ()

withAlpha () chấp nhận một đối số kiểu float và đối số tham chiếu đến giá trị alpha của dạng xem. Nó trả về một đối sánh, đối sánh với chế độ xem bằng cách sử dụng giá trị alpha của chế độ xem. Mã mẫu như sau,

onView(withAlpha(0.8))

withEffectiveVisibility ()

withEffectiveVisibility () chấp nhận một đối số kiểu ViewMatchers.Visibility và đối số đề cập đến khả năng hiển thị hiệu quả của chế độ xem. Nó trả về một đối sánh, đối sánh với chế độ xem bằng cách sử dụng khả năng hiển thị của chế độ xem. Mã mẫu như sau,

onView(withEffectiveVisibility(withEffectiveVisibility.INVISIBLE))

withSpinnerText ()

withSpinnerText () chấp nhận một đối số kiểu Matcher <Chuỗi> và đối số này tham chiếu đến giá trị của chế độ xem được chọn hiện tại của Spinner. Nó trả về một trình so khớp, khớp với con quay dựa trên giá trị toString của mục đã chọn. Mã mẫu như sau,

onView(withSpinnerText(endsWith("USA")))

Nó chấp nhận đối số chuỗi hoặc id tài nguyên của chuỗi. Mã mẫu như sau,

onView(withResourceName("USA"))
onView(withResourceName(R.string.res_usa))

withSubstring ()

withSubString () tương tự với withText () ngoại trừ nó giúp kiểm tra chuỗi con của giá trị văn bản của khung nhìn.

onView(withSubString("Hello"))

hasLinks ()

hasLinks () không có đối số và nó trả về một đối sánh, khớp với dạng xem có liên kết. Nó chỉ áp dụng cho TextView. Mã mẫu như sau,

onView(allOf(withSubString("Hello"), hasLinks()))

Ở đây, allOf là một trình khớp Hamcrest. allOf trả về một so khớp, phù hợp với tất cả các giá trị được chuyển vào trong so khớp và ở đây, nó được sử dụng để so khớp một dạng xem cũng như kiểm tra xem dạng xem có liên kết trong giá trị văn bản của nó hay không.

hasTextColor ()

hasTextColor () chấp nhận một đối số duy nhất của kiểu int và đối số tham chiếu đến id tài nguyên của màu. Nó trả về một so khớp, phù hợp với TextView dựa trên màu của nó. Nó chỉ áp dụng cho TextView . Mã mẫu như sau,

onView(allOf(withSubString("Hello"), hasTextColor(R.color.Red)))

hasEllipsizedText ()

hasEllipsizedText () không có đối số. Nó trả về một trình so khớp, khớp với TextView có văn bản dài và được đánh dấu chấm lửng (đầu tiên .. mười .. cuối cùng) hoặc bị cắt bỏ (đầu tiên…). Mã mẫu như sau,

onView(allOf(withId(R.id.my_text_view_id), hasEllipsizedText()))

hasMultilineText ()

hasMultilineText () không có đối số. Nó trả về một đối sánh, đối sánh TextView có bất kỳ văn bản nhiều dòng nào. Mã mẫu như sau,

onView(allOf(withId(R.id.my_test_view_id), hasMultilineText()))

hasBackground ()

hasBackground () chấp nhận một đối số duy nhất kiểu int và đối số này tham chiếu đến id tài nguyên của tài nguyên nền. Nó trả về một đối sánh, đối sánh với chế độ xem dựa trên tài nguyên nền của nó. Mã mẫu như sau,

onView(allOf(withId("image"), hasBackground(R.drawable.your_drawable)))

hasErrorText ()

hasErrorText () chấp nhận một đối số kiểu Matcher <Chuỗi> và đối số tham chiếu đến giá trị chuỗi lỗi (EditText) của chế độ xem. Nó trả về một trình so khớp, khớp với chế độ xem bằng cách sử dụng chuỗi lỗi của chế độ xem. Điều này chỉ áp dụng cho EditText . Mã mẫu như sau,

onView(allOf(withId(R.id.editText_name), hasErrorText(is("name is required"))))

Nó cũng chấp nhận đối số chuỗi. Mã mẫu như sau,

onView(allOf(withId(R.id.editText_name), hasErrorText("name is required")))

hasImeAction ()

hasImeAction () chấp nhận một đối số kiểu Matcher <Integer> và đối số này tham chiếu đến các phương thức nhập được hỗ trợ (EditText) của chế độ xem. Nó trả về một đối sánh, đối sánh với chế độ xem sử dụng phương thức nhập được hỗ trợ của chế độ xem. Điều này chỉ áp dụng cho EditText . Mã mẫu như sau,

onView(allOf(withId(R.id.editText_name),
hasImeAction(is(EditorInfo.IME_ACTION_GO))))

Ở đây, EditorInfo.IME_ACTION_GO nằm trên các tùy chọn phương thức nhập. hasImeAction () cũng chấp nhận đối số số nguyên. Mã mẫu như sau,

onView(allOf(withId(R.id.editText_name),
hasImeAction(EditorInfo.IME_ACTION_GO)))

supportsInputMethods ()

supportsInputMethods () không có đối số. Nó trả về một so khớp, phù hợp với dạng xem nếu nó hỗ trợ các phương thức nhập. Mã mẫu như sau,

onView(allOf(withId(R.id.editText_name), supportsInputMethods()))

isRoot ()

isRoot () không có đối số. Nó trả về một trình so khớp, phù hợp với chế độ xem gốc. Mã mẫu như sau,

onView(allOf(withId(R.id.my_root_id), isRoot()))

được hiển thị()

isDisplayed () không có đối số. Nó trả về một so khớp, khớp với chế độ xem hiện đang được hiển thị. Mã mẫu như sau,

onView(allOf(withId(R.id.my_view_id), isDisplayed()))

isDisplayingAtLeast ()

isDisplayingAtLeast () chấp nhận một đối số duy nhất kiểu int. Nó trả về một trình so khớp, phù hợp với chế độ xem hiện tại được hiển thị ít nhất theo tỷ lệ phần trăm được chỉ định. Mã mẫu như sau,

onView(allOf(withId(R.id.my_view_id), isDisplayingAtLeast(75)))

isComplempleDisplayed ()

isComplempleDisplayed () không có đối số. Nó trả về một so khớp, khớp với chế độ xem hiện đang được hiển thị hoàn toàn trên màn hình. Mã mẫu như sau,

onView(allOf(withId(R.id.my_view_id), isCompletelyDisplayed()))

được kích hoạt()

isEnabled () không có đối số. Nó trả về một trình so khớp, phù hợp với chế độ xem được bật. Mã mẫu như sau,

onView(allOf(withId(R.id.my_view_id), isEnabled()))

isFocusable ()

isFocusable () không có đối số. Nó trả về một đối sánh, đối sánh với chế độ xem có tùy chọn tiêu điểm. Mã mẫu như sau,

onView(allOf(withId(R.id.my_view_id), isFocusable()))

hasFocus ()

hasFocus () không có đối số. Nó trả về một so khớp, khớp với chế độ xem hiện đang được lấy tiêu điểm. Mã mẫu như sau,

onView(allOf(withId(R.id.my_view_id), hasFocus()))

isClickable ()

isClickable () không có đối số. Nó trả về một trình so khớp, phù hợp với chế độ xem là tùy chọn nhấp chuột. Mã mẫu như sau,

onView(allOf(withId(R.id.my_view_id), isClickable()))

đã được chọn()

isSelected () không có đối số. Nó trả về một so khớp, khớp với chế độ xem hiện đang được chọn. Mã mẫu như sau,

onView(allOf(withId(R.id.my_view_id), isSelected()))

isChecked ()

isChecked () không có đối số. Nó trả về một trình so khớp, phù hợp với dạng xem thuộc loại CompoundButton (hoặc kiểu con của nó) và ở trạng thái được kiểm tra. Mã mẫu như sau,

onView(allOf(withId(R.id.my_view_id), isChecked()))

isNotChecked ()

isNotChecked () đối lập với isChecked. Mã mẫu như sau *

onView(allOf(withId(R.id.my_view_id), isNotChecked()))

isJavascriptEnabled ()

isJavascriptEnabled () không có đối số. Nó trả về một đối sánh, đối sánh với WebView đang đánh giá JavaScript. Mã mẫu như sau,

onView(allOf(withId(R.id.my_webview_id), isJavascriptEnabled()))

với cha mẹ()

withParent () chấp nhận một đối số kiểu Matcher <View>. Đối số đề cập đến một chế độ xem. Nó trả về một đối sánh, đối sánh với chế độ xem mà chế độ xem được chỉ định là chế độ xem mẹ. Mã mẫu như sau,

onView(allOf(withId(R.id.childView), withParent(withId(R.id.parentView))))

hasSibling ()

hasSibling () chấp nhận một đối số kiểu Matcher> View <. Đối số đề cập đến một chế độ xem. Nó trả về một trình so khớp, khớp với chế độ xem mà chế độ xem được truyền vào là một trong những chế độ xem anh chị em của nó. Mã mẫu như sau,

onView(hasSibling(withId(R.id.siblingView)))

với trẻ con()

withChild () chấp nhận một đối số kiểu Matcher <View>. Đối số đề cập đến một chế độ xem. Nó trả về một trình so khớp, khớp với chế độ xem mà chế độ xem được truyền vào là chế độ xem con. Mã mẫu như sau,

onView(allOf(withId(R.id.parentView), withChild(withId(R.id.childView))))

hasChildCount ()

hasChildCount () chấp nhận một đối số kiểu int. Đối số đề cập đến số lượng con của một chế độ xem. Nó trả về một trình so khớp, khớp với chế độ xem có chính xác số lượng chế độ xem con như được chỉ định trong đối số. Mã mẫu như sau,

onView(hasChildCount(4))

hasMinimumChildCount ()

hasMinimumChildCount () chấp nhận một đối số kiểu int. Đối số đề cập đến số lượng con của một chế độ xem. Nó trả về một trình so khớp, phù hợp với chế độ xem có ít nhất số chế độ xem con như được chỉ định trong đối số. Mã mẫu như sau,

onView(hasMinimumChildCount(4))

hasDescendant ()

hasDescendant () chấp nhận một đối số kiểu Matcher <View>. Đối số đề cập đến một chế độ xem. Nó trả về một đối sánh, đối sánh với chế độ xem mà chế độ xem được truyền vào là một trong những chế độ xem con trong hệ thống phân cấp chế độ xem. Mã mẫu như sau,

onView(hasDescendant(withId(R.id.descendantView)))

isDescendantOfA ()

isDescendantOfA () chấp nhận một đối số kiểu Matcher <View>. Đối số đề cập đến một chế độ xem. Nó trả về một trình so khớp, khớp với chế độ xem mà chế độ xem được truyền vào là một trong những chế độ xem tổ tiên trong hệ thống phân cấp chế độ xem. Mã mẫu như sau,

onView(allOf(withId(R.id.myView), isDescendantOfA(withId(R.id.parentView))))