Android Automate Testing with Cucumber and Appium
ก่อนหน้านี้ผมเขียนบทความเกี่ยวกับการทำ automate test โดยใช้ appium ไปแล้วจะเห็นว่ามัน Geek มาก เพราะฉะนั้นบทความนี้จะพูดถึง Cucumber ตัวที่จะทำให้ความ Geek น้อยลง สำหรับท่านใดที่ยังไม่ได้อ่าน สามารถอ่านได้ [ตอนที่ 1, ตอนที่ 2]

Cucumber เป็น tool ที่ใช้สำหรับนิยาม test case ประโยชน์ของมันคือช่วยในการ collaboration กับทีม หรือคนทั่วไปเห็นแล้วอ่านเข้าใจ เป็นรูปแบบที่ไม่ได้อยู่ในรูปของภาษา programming แน่นอนว่าใครๆก็สามารถอ่านแล้วเข้าใจได้ทันทีว่าทดสอบอะไร?
จากบทความเรื่อง appium ก่อนหน้านี้ ถ้าคนที่ไม่ใช่โปรแกรมเมอร์มาเห็นคงจะพูดว่า “นี่กำลังทดสอบอะไรกันอยู่นะ?” เพราะบทความเรื่อง appium มันอยู่ในรูปของภาษา programming ดังนั้น cucumber จึงเป็นเหมือนเครื่องมือที่ช่วยในการอธิบายหรือสื่อสารให้คนที่ไม่ใช่ programmer เข้าใจ
“Easy to read and write”
จะเล่นว่า cucumber มันคือแตงกวา เว็บอื่นเขาก็เล่นกันเยอะละ
Cucumber เขียนในรูปแบบของ Behavior-Driven Development(BDD)
Cucumber นิยาม test case ด้วยภาษาGherkin
Gherkin keywords : Feature, Background, Scenario, Given, When, Then, And, But, Scenario outline, Example
ในที่นี้ Test case หรือ Scenario คนเขียนจะเป็น product owners หรือ business analysts ครับ เพราะทั้ง PO และ BA เป็นคนที่เข้าใจ requirements มากที่สุดแล้ว
Cucumber เองสามารถ implement เข้ากับภาษาอื่นๆได้ตามนี้

สิ่งที่ต้องเตรียม แทบจะเหมือนกับบทความก่อนๆเรื่อง Appium เพราะฉะนั้นจะพูดถึงแค่ส่วนที่เพิ่มเติมมาเท่านั้น

ตัวแรกคือ plugin ชื่อ Cucumber for java หรือถ้าใช้ภาษาอื่นก็ plugin ตามภาษานั้นๆ

ส่วนความสามารถของ plugin ก็ตามนี้

เมื่อ plugin พร้อม กายพร้อม ใจพร้อม เริ่มสร้างโปรเจคใหม่ได้

คำถามที่หลายคนอาจสงสัยคือ cucumber จะไปอยู่ส่วนไหนของโปรเจค จะเขียนในไฟล์ไหน คำตอบคืออยู่ในโฟลเดอร์ features ซึ่งจะมีนามสกุล .feature
อธิบายเพิ่มเติม โปรเจคจะถูกแบบออก 2 ส่วน คือ business และ technical ส่วน bussiness คือไฟล์ .feature และ technical ก็คือไฟล์ .java
ตัวอย่าง login.feature (login อีกแล้ว)

Dependencies
<dependencies>
<dependency>
<groupId>io.appium</groupId>
<artifactId>java-client</artifactId>
<version>${java-client.version}</version>
</dependency>
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-java</artifactId>
<version>${cucumber.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-junit</artifactId>
<version>${cucumber.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
เมื่อสร้างไฟล์ .feature เสร็จ ขั้นตอนต่อมาคือ การเขียน test case ดังตัวอย่าง

Given คือ context หรือพูดง่ายๆคือ initial state
When คือ action หรือ event ที่เกิดขึ้นจากการกระทำของ user
Then คือ ผลที่เกิดจากการกระทำของ user
ส่วน And ใช้ในกรณีที่ไม่ได้มี steps เดียว
*keyword อื่นๆ เพิ่มเติม https://github.com/cucumber/cucumber/wiki/Feature-Introduction
*ภาษาไทยก็เขียนได้นะครับ ลองดู๊ดดดดด
เสร็จแล้วลองคลิกขวารันที่ scenario

ผลที่ได้คือ พัง!!!

เพราะเรายังไม่ได้ implements steps เมื่อยังไม่ได้ implements มันก็ดี๊ดี generate ให้อีก โอ้ สบายละ จะเขียนไม่เป็นก็งานนี้แหละ จากนั้นครับก็ก๊อปเลยครับ ไปวางในไฟล์ .java ซึ่งเป็นส่วนของ technical ที่เราจะนำส่วนของ bussiness มา implement ให้อยู่ในรูปของภาษาโปรแกรม

ถ้าสังเกตดีๆ จะมี annotation Given, When, Then มันก็เลยเป็นที่มาว่าแต่ละ step เนี้ยมันรู้ได้อย่างไรว่า scenario ที่เราเขียนมันจะไปเรียกหรือไปทำงานที่ method ไหนของ java
เช่น Given(ตื้อๆๆๆๆ…) มันก็จะไปไล่ถามข้อความภายใน annotation ดูว่ามัน match กันหรือไม่? มันก็คือ regular expression นั่นเอง
จากนั้นครับ มาถึงขั้นตอนนนี้แทบจะเป็นความรู้ส่วนของ Appium เพราะฉะนั้นไม่ขออธิบายอะไรมาก เป็นว่าได้ตามนี้ครับ บางคนอาจจะ งง อยู่ดีๆมาถึงนี่ได้ไง แนะนำให้กลับไปอ่าน ตอนที่ 1 และ ตอนที่ 2 ก่อน

เพียงเท่านี้เป็นอันเสร็จพิธีกรรม
ชีวิตคนเรามันสั้นนัก อะไร Automate ได้ ก็ Automate ให้หมด
ถึงเวลาจริงๆ ก็คงต้องเลือกครับว่า เราต้องการแบบไหน? ไม่ใช่นำ automate เข้ามาแล้วแต่ดันทำให้ปัญหาในการทำ software เยอะขึ้น ถ้าเป็นแบบนั้นผมคิดว่าจริงๆแล้วเรากำลังหลงทาง
บทความนี้เป็นเพียงการ intro เท่านั้นอาจจะมีขาดตกเนื้อหาส่วนใด ส่วนหนึ่งไป ยังไงก็แนะนำได้ครับ
หวังว่าจะเป็นประโยชน์กับคนที่สนใจเริ่มจะทำ Automate Test บน android ครับ สวัสดี
ตัวอย่างโค้ดที่ไม่ได้ผ่านการลองรันhttps://github.com/WeRockStar/appium-cucumber