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 ที่เป็น"ตัวแทน"ของหน้าจอที่กำลังใช้งานอยู่
ลองพิจารณาจาก ตัวอย่าง
แล้วลองตอบคำถามต่อไปนี้
- หน้านี้คือหน้าอะไร
- เราทำอะไรในหน้านี้ได้บ้าง
- ตรวจสอบหรือดูข้อมูลอะไรจากหน้านี้ได้บ้าง
จากคำตอบที่ได้ สามารถนำไปออกแบบ 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");
}
}
เมื่อทำการทดสอบแล้ว ต้องได้ผลเหมือนเดิม