คุณสมบัติของแตงกวา: ภาพรวม

เผยแพร่แล้ว: 2022-04-20

บทนำ

Gherkin เป็นภาษาที่ยังคงใช้ในเฟรมเวิร์กการทดสอบอัตโนมัติจำนวนมาก บางครั้งอาจเป็นเพราะลูกค้าต้องการให้เราใช้ บางครั้งอาจเป็นเพราะทีมงานตัดสินใจทำเช่นนั้น

ความจริงแล้วมันไม่ใช่รักแรกพบสำหรับฉัน โดยส่วนตัวแล้วฉันมีการเดินทางที่ยาวนานกับ Gherkin – ตั้งแต่ชอบมันในตอนแรก ผ่านการเกลียดชังภาษาชั่วขณะหนึ่ง แล้วก็จบลงด้วยการชอบมันอีกครั้ง ในบทความนี้ผมจะนำเสนอคุณสมบัติที่สำคัญที่สุดของแตงกวาร่วมกับการใช้งาน Java

นี่คือคุณสมบัติทั้งหมดของแตงกวาที่กล่าวถึงในบทความนี้:

ลักษณะเฉพาะ คำอธิบาย
สถานการณ์ สถานการณ์ง่ายๆ
เค้าโครงสถานการณ์ กำหนดให้ผู้ใช้ระบุข้อมูลการทดสอบในส่วน "ตัวอย่าง"
ตารางข้อมูล กำหนดให้ผู้ใช้ระบุข้อมูลการทดสอบสำหรับขั้นตอนการทดสอบ
บริบทสถานการณ์ การแบ่งปันค่าระหว่างขั้นตอนการทดสอบ
ประเภทข้อมูลแตงกวา ชนิดข้อมูลที่จัดการโดยแตงกวา
แตงกวา การแสดงออกปกติ การใช้นิพจน์ทั่วไปในสถานการณ์แตงกวา
ตะขอแตงกวา รันโค้ดเพิ่มเติมในสถานการณ์ทดสอบ
ตารางที่ 1. คุณสมบัติของแตงกวาและจาวาที่กล่าวถึงในบทความนี้

ไฟล์คุณลักษณะ

ก่อนอื่น ไฟล์คุณลักษณะคืออะไร? ในโลกทางเทคนิค แนวทางที่ไม่ใช้เทคนิคถูกสร้างขึ้นเพื่อให้ผู้ที่ไม่ใช่ฝ่ายเทคนิคสามารถร่วมมือกับทีมได้ในระหว่างการพัฒนาแอป ภาษา 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 ในการทดสอบของคุณ คุณลักษณะบางอย่างเหล่านี้จะทำให้การทดสอบของคุณอ่านง่ายและเข้าใจง่ายขึ้นโดยผู้ที่ไม่ใช่ผู้เชี่ยวชาญ นอกจากนี้ สำหรับผู้เข้าร่วมใหม่ จะเข้าใจตรรกะทางธุรกิจได้ง่ายขึ้นและลดเวลาในการเข้าร่วม