คุณสมบัติของแตงกวา: ภาพรวม
เผยแพร่แล้ว: 2022-04-20บทนำ
Gherkin เป็นภาษาที่ยังคงใช้ในเฟรมเวิร์กการทดสอบอัตโนมัติจำนวนมาก บางครั้งอาจเป็นเพราะลูกค้าต้องการให้เราใช้ บางครั้งอาจเป็นเพราะทีมงานตัดสินใจทำเช่นนั้น
ความจริงแล้วมันไม่ใช่รักแรกพบสำหรับฉัน โดยส่วนตัวแล้วฉันมีการเดินทางที่ยาวนานกับ Gherkin – ตั้งแต่ชอบมันในตอนแรก ผ่านการเกลียดชังภาษาชั่วขณะหนึ่ง แล้วก็จบลงด้วยการชอบมันอีกครั้ง ในบทความนี้ผมจะนำเสนอคุณสมบัติที่สำคัญที่สุดของแตงกวาร่วมกับการใช้งาน Java
นี่คือคุณสมบัติทั้งหมดของแตงกวาที่กล่าวถึงในบทความนี้:
ลักษณะเฉพาะ | คำอธิบาย |
---|---|
สถานการณ์ | สถานการณ์ง่ายๆ |
เค้าโครงสถานการณ์ | กำหนดให้ผู้ใช้ระบุข้อมูลการทดสอบในส่วน "ตัวอย่าง" |
ตารางข้อมูล | กำหนดให้ผู้ใช้ระบุข้อมูลการทดสอบสำหรับขั้นตอนการทดสอบ |
บริบทสถานการณ์ | การแบ่งปันค่าระหว่างขั้นตอนการทดสอบ |
ประเภทข้อมูลแตงกวา | ชนิดข้อมูลที่จัดการโดยแตงกวา |
แตงกวา การแสดงออกปกติ | การใช้นิพจน์ทั่วไปในสถานการณ์แตงกวา |
ตะขอแตงกวา | รันโค้ดเพิ่มเติมในสถานการณ์ทดสอบ |
ไฟล์คุณลักษณะ
ก่อนอื่น ไฟล์คุณลักษณะคืออะไร? ในโลกทางเทคนิค แนวทางที่ไม่ใช้เทคนิคถูกสร้างขึ้นเพื่อให้ผู้ที่ไม่ใช่ฝ่ายเทคนิคสามารถร่วมมือกับทีมได้ในระหว่างการพัฒนาแอป ภาษา Gherkin ถูกสร้างขึ้นเป็นเลเยอร์เพิ่มเติมในแนวทาง BDD การทดสอบของ Gherkin อยู่ในไฟล์คุณลักษณะที่เรียกว่าซึ่งติดกาวด้วยโค้ด (Java, Kotlin, C# เป็นต้น) โดยทั่วไปแล้ว Gherkin จะใช้งานง่ายมากและต้องใช้ความรู้ด้านการเขียนโปรแกรมขั้นต่ำ แต่มีคุณลักษณะที่ต้องใช้การเข้ารหัสบางอย่าง
มาเริ่มกันด้วยอะไรง่ายๆ
สถานการณ์
นี่เป็นตัวอย่างพื้นฐานและง่ายที่สุดในการใช้การทดสอบแตงกวา:
คุณสมบัติ: สถานการณ์ ความเป็นมา: ก่อนการทดสอบสถานการณ์ กำหนดให้ฉันดำเนินการก่อนขั้นตอน @ทดสอบ สถานการณ์: สถานการณ์ เนื่องจากฉันใช้ขั้นตอนการกำหนดพารามิเตอร์ของ "สถานการณ์ที่ 1"
Code Block 1 สถานการณ์
Code Block 1 มีบางสิ่งที่จะอธิบาย:
- คุณสมบัติ : ชื่อเรื่องของไฟล์คุณสมบัติ
- พื้นหลัง : คีย์เวิร์ดที่อนุญาตให้ผู้ใช้ดำเนินการขั้นตอนการทดสอบก่อนแต่ละสถานการณ์การทดสอบที่กำหนดไว้ในไฟล์คุณลักษณะ
- @Test : แท็กที่บอกกรอบการทดสอบว่าควรดำเนินการทดสอบสถานการณ์ใด “การทดสอบ” ถูกกำหนดโดยผู้ใช้ เราสามารถใช้เช่น “@SmokeTest”
- สถานการณ์จำลอง : ชื่อสถานการณ์ทดสอบ
การทดสอบ Gherkin ใช้คีย์เวิร์ด [Given, When, Then, But] ก่อนแต่ละขั้นตอนการทดสอบ ในขั้นตอนการทดสอบเดียวของเรา ยกเว้นขั้นตอนพื้นหลัง เราใช้พารามิเตอร์ที่เราส่งผ่านค่า "สถานการณ์ที่ 1"
ตอนนี้เรามาดูกันว่าโค้ด Java ที่ติดกาวมีลักษณะอย่างไร:
@Given("ฉันดำเนินการก่อนขั้นตอน") โมฆะสาธารณะ iExecuteBeforeStep () { // การใช้งานบางส่วน } @Given("ฉันใช้ขั้นตอนการกำหนดพารามิเตอร์ของ {string}") โมฆะสาธารณะ iUseParametrizedStepOf (สตริง p) { // การใช้งานบางส่วน }
Code Block 2 การใช้โค้ด Java ของ Scenario
เค้าโครงสถานการณ์
มาทำอะไรที่ซับซ้อนกว่านี้กันเถอะ:
คุณสมบัติ: โครงร่างสถานการณ์ @ทดสอบ เค้าโครงสถานการณ์จำลอง: เค้าโครงสถานการณ์จำลอง เนื่องจากฉันเรียกใช้ขั้นตอนด้วย "<parameter1>" และ "<parameter2>" ตัวอย่าง: | พารามิเตอร์1 | พารามิเตอร์2 | | พารามิเตอร์1a | พารามิเตอร์2a | | พารามิเตอร์1b | พารามิเตอร์2b |
Code Block 3 โครงร่างสถานการณ์
คราวนี้เราจะใช้โครงร่างสถานการณ์สมมติซึ่งช่วยให้เราสามารถทำซ้ำสถานการณ์การทดสอบด้วยการกำหนดค่าข้อมูลการทดสอบที่แตกต่างกัน Code Block 3 มีบางสิ่งที่จะอธิบาย:
- ตัวอย่าง : เมทริกซ์ของข้อมูลการทดสอบที่จะใช้ในสถานการณ์การทดสอบ แถวแรกเป็นส่วนหัวที่มีชื่อพารามิเตอร์
และการใช้งานจาวา:
@Given("ฉันเรียกใช้ขั้นตอนด้วย {string} และ {string}") โมฆะสาธารณะ iRunStepWithAnd (สตริง p1, สตริง p2) { // การใช้งานบางส่วน }
Code Block 4 การใช้ Java ของ Scenario Outline
ตารางข้อมูล
โครงร่างสถานการณ์สมมติมีประโยชน์มาก แต่ถ้าเราไม่ต้องการที่จะทำซ้ำสถานการณ์การทดสอบทั้งหมด แต่เพียงขั้นตอนการทดสอบเดียวล่ะ Gherkin มีวิธีการทำเช่นนี้และเรียกว่า "Data Table"
ลักษณะการทำงาน: ตารางข้อมูล @ทดสอบ สถานการณ์จำลอง: สถานการณ์ตารางข้อมูล ให้ตรวจสอบว่าคอลัมน์มีค่าที่คาดหวัง | ชื่อคอลัมน์ | ค่าคาดหวัง | | someColumnName | someExpectedValue |
รหัสบล็อก 5. ตารางข้อมูล
สถานการณ์จำลองที่มีตารางข้อมูลไม่แตกต่างจากโครงร่างสถานการณ์จำลองมากนัก สิ่งเดียวคือเราไม่ใส่คีย์เวิร์ด "ตัวอย่าง" ไว้หน้าตาราง
การใช้งาน Java ดูซับซ้อนกว่าในกรณีก่อนหน้านี้เล็กน้อย:
@Given("ฉันยืนยันว่าคอลัมน์มีค่าที่คาดหวัง") โมฆะสาธารณะ iVerifyColumnValuesInTableUsingQueryFromFileOnSchema (DataTable dataTable) { รายการ <Map<String, String>> data = dataTable.asMaps(); สำหรับ (รูปแบบ Map<String, String>: data) { สตริง columnName = form.get("columnName"); สตริงที่คาดหวัง = form.get ("expectedValue"); // การใช้งานบางส่วน } } }
Code Block 6 การใช้ Java ของ Data Table

ในการเข้าถึงข้อมูลจากตารางข้อมูล เราสร้าง dataTable ตัวแปรพิเศษประเภท "DataTable" ข้อมูลทั้งหมดจะถูกเก็บไว้ในตัวแปรรายการ
บริบทสถานการณ์
การใช้บริบทสถานการณ์สมมติเราสามารถแบ่งปันข้อมูลระหว่างขั้นตอนต่างๆ สมมติว่าเรามีสถานการณ์สมมติสองขั้นตอนซึ่งเราต้องการส่งค่า "ข้อมูล" จากขั้นตอนที่ 1 ไปยังขั้นตอนที่ 2 (Code Block 7)
@ทดสอบ สถานการณ์: บริบทสถานการณ์ เนื่องจากฉันตั้งค่าบริบทของสถานการณ์ "ข้อมูล" เนื่องจากฉันใช้ค่าบริบทของสถานการณ์
Code Block 7. บริบทสถานการณ์
อันดับแรก เราต้องสร้างคลาสพิเศษที่เรียกว่า ScenarioContext พร้อมคุณสมบัติบริบทของสถานการณ์ในการตั้งค่าและรับข้อมูล (Code Block 8) บริบทสถานการณ์สมมติของเราคือ HashMap ที่มีคู่คีย์-ค่า เราจะระบุค่าด้วยคีย์ของมัน
- บริบท() : HashMap ของคู่คีย์-ค่า
- setContext() : วิธีคีย์-ค่าเพื่อเก็บข้อมูลบริบทสถานการณ์
- getContext() : วิธีการรับข้อมูลคีย์
ScenarioContext คลาสสาธารณะ { แผนที่ส่วนตัว <String, Object> สถานการณ์จำลอง; สถานการณ์สมมติสาธารณะ () { สถานการณ์สมมติ = HashMap ใหม่ <>(); } โมฆะสาธารณะ setContext (คีย์บริบท, ค่าวัตถุ) { สถานการณ์Context.put(key.toString(), ค่า); } วัตถุสาธารณะ getContext (คีย์บริบท) { ส่งคืนสถานการณ์Context.get(key.toString()); } } บริบทสาธารณะ { รหัส; }
Code Block 8 การใช้ Java ของ Scenario Context class
มีสิ่งนี้เราสามารถใช้ประโยชน์จากวิธีการดำเนินการ ในขั้นตอนที่ 1 เราจะตั้งค่าในบริบทของสถานการณ์จำลอง และในขั้นตอนที่ 2 เราจะได้รับค่า (Code Block 9)
ScenarioContext scenarioContext = ใหม่ ScenarioContext (); @Given("ฉันตั้งค่าบริบทของสถานการณ์ {string}") โมฆะสาธารณะ iSetScenarioContextValue (ค่าสตริง) { scenarioContext.setContext(Context.ID, ค่า); } @Given("ฉันใช้ค่าบริบทของสถานการณ์") โมฆะสาธารณะ iUseScenarioContextValue () { สตริง sharedValue = scenarioContext.getContext(Context.ID).toString(); }
Code Block 9 ขั้นตอนบริบทสถานการณ์
ประเภทข้อมูลแตงกวา
แตงกวาจัดการประเภทข้อมูลจำนวนจำกัด เราสามารถกำหนดสตริง จำนวนเต็ม และค่าทศนิยมได้ แต่ในกรณีของค่าบูลีน เราจำเป็นต้องเขียนโค้ดการแก้ปัญหาชั่วคราว
@ทดสอบ สถานการณ์จำลอง: สถานการณ์จำลองพร้อมตัวแปร เนื่องจากฉันใช้สตริง "สตริง", int 1, float 1.1 และบูลีน "เท็จ"
Code Block 10. Cucumber Data Types
รหัส Java จะมีลักษณะดังนี้:
@Given("ฉันใช้สตริง {string}, int {int}, float {float} และบูลีน {string}") โมฆะสาธารณะ iUseStringIntFloatAndBoolean (String var1, int var2, double var3, String var4) { บูลีน f = Boolean.valueOf (var4); //โค้ดบางส่วน }
Code Block 11 การใช้ Java ของ Cucumber Data Types
แตงกวา การแสดงออกปกติ
นี่เป็นอีกหนึ่งคุณสมบัติที่ใช้บ่อย Code Block 12 แสดงสถานการณ์จำลองสองขั้นตอนซึ่งแตกต่างกันโดยใช้ค่าตัวแปรที่แตกต่างกันเท่านั้น (var1 และ var2) อันที่จริงนี่เป็นเพียงขั้นตอนเดียว และในโค้ด Java (Code Block 13) เรากำหนดวิธีเดียวเท่านั้น แต่มี regex และหนึ่งพารามิเตอร์ var
@ทดสอบ สถานการณ์จำลอง: สถานการณ์สมมติปกติ เนื่องจากฉันใช้ตัวแปรvar1 เนื่องจากฉันใช้ตัวแปรvar2
Code Block 12. Regular Expression ใน Cucumber
@Given("^ฉันใช้ตัวแปร (.*)") โมฆะสาธารณะ examTimeTableInSummerSeason (String var) { ถ้า (var.equals("var1")){ //โค้ดบางส่วน } อื่น if(var.equals("var2")){ //โค้ดบางส่วน } }
Code Block 13 การใช้ Java ของนิพจน์ทั่วไปของ Cucumber
ตะขอแตงกวา
สุดท้ายแต่ไม่ท้ายสุด: ตะขอแตงกวา
Code block 14 นำเสนอ 4 hooks ที่สำคัญที่สุด:
- @Before : รันโค้ดก่อนแต่ละสถานการณ์ทดสอบ
- @หลัง : รันโค้ดหลังจากแต่ละสถานการณ์ทดสอบ
- @BeforeStep : รันโค้ดก่อนแต่ละขั้นตอนการทดสอบ
- @AfterStep : รันโค้ดหลังจากแต่ละขั้นตอนการทดสอบ
@ก่อน โมฆะสาธารณะก่อนสถานการณ์ () { //โค้ดบางส่วน } @หลังจาก โมฆะสาธารณะหลังสถานการณ์ () { //โค้ดบางส่วน } @BeforeStep โมฆะสาธารณะ beforeStep() { //โค้ดบางส่วน } @AfterStep โมฆะสาธารณะ afterStep() { //โค้ดบางส่วน }
Code Block 14. ตะขอแตงกวา
สรุป
ฉันหวังว่าฉันจะโน้มน้าวให้คุณใช้ Gherkin ในการทดสอบของคุณ คุณลักษณะบางอย่างเหล่านี้จะทำให้การทดสอบของคุณอ่านง่ายและเข้าใจง่ายขึ้นโดยผู้ที่ไม่ใช่ผู้เชี่ยวชาญ นอกจากนี้ สำหรับผู้เข้าร่วมใหม่ จะเข้าใจตรรกะทางธุรกิจได้ง่ายขึ้นและลดเวลาในการเข้าร่วม