Page object pattern

@Test
    public void givenScore_0_ShouldGetGrade_F(){
        onView(withId(R.id.scoreInput)).perform(clearText(), typeText("0"));

        onView(withId(R.id.button)).perform(click());

        onView(withId(R.id.gradeView)).check(matches(withText("F")));
    }

โค้ดนี้ทำงานได้ถูกต้อง แต่อ่านยาก อาจจะทำให้เกิดปัญหาเวลากลับมาแก้ไขได้ ดังนั้น จึงควรปรับปรุงให้อ่านง่าย แก้ไขได้ง่ายขึ้น ด้วยการ Refactor ให้อยู่ในรูปแบบ Page object pattern

Page object pattern ก็คือการสร้าง Class ที่เป็น"ตัวแทน"ของหน้าจอที่กำลังใช้งานอยู่

ลองพิจารณาจาก ตัวอย่าง

แล้วลองตอบคำถามต่อไปนี้

  1. หน้านี้คือหน้าอะไร
  2. เราทำอะไรในหน้านี้ได้บ้าง
  3. ตรวจสอบหรือดูข้อมูลอะไรจากหน้านี้ได้บ้าง

จากคำตอบที่ได้ สามารถนำไปออกแบบ class ได้ดังนี้

GradeScreen
inputScore(string)
submit()
showExpectedGrade(string)

จาก Class diagram สามารถนำไปสร้าง Java class ได้ ให้ทำการสร้างไฟล์ GradeScreen.java ไว้ใน app/src/androidTest/java

public class GradeScreen {

    public void inputScore(String score) {

    }

    public void submit() {

    }

    public void showExpectedGrade(String expectedGrade) {

    }
}

จะเห็นว่าตรงกับ code ที่อยู่ใน Test พอดี ให้ทำการย้ายมาใส่ GradeScreen ได้เลย

public class GradeScreen {

    public void inputScore(String score) {
        onView(withId(R.id.scoreInput)).perform(clearText(), typeText("0"));
    }

    public void submit() {
        onView(withId(R.id.button)).perform(click());
    }

    public void showExpectedGrade(String expectedGrade) {
        onView(withId(R.id.gradeView)).check(matches(withText("F")));
    }
}

ส่วนในไฟล์ MyGradeTest นั้นให้เรียกใช้คลาส GradeScreen แทน

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

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

    @Test
    public void givenScore_0_ShouldGetGrade_F(){
        GradeScreen gradeScreen = new GradeScreen();
        gradeScreen.inputScore("0");

        gradeScreen.submit();

        gradeScreen.showExpectedGrade("F");
    }
}

เมื่อทำการทดสอบแล้ว ต้องได้ผลเหมือนเดิม

results matching ""

    No results matching ""