BDD - TDD ในรูปแบบ BDD

ใน TDD คำว่า“ การทดสอบการยอมรับ” ทำให้เข้าใจผิด การทดสอบการยอมรับเป็นตัวแทนของพฤติกรรมที่คาดหวังของระบบ ในการปฏิบัติแบบ Agile จะเน้นการทำงานร่วมกันของทั้งทีมและการมีปฏิสัมพันธ์กับลูกค้าและผู้มีส่วนได้ส่วนเสียอื่น ๆ สิ่งนี้ทำให้เกิดความจำเป็นในการใช้คำศัพท์ที่ทุกคนที่เกี่ยวข้องในโครงการเข้าใจได้ง่าย

TDD ทำให้คุณคิดถึงสิ่งที่จำเป็น Behavior และด้วยเหตุนี้คำว่า 'พฤติกรรม' จึงมีประโยชน์มากกว่าคำนี้ ‘Test’. BDD คือ Test Driven Development พร้อมคำศัพท์ที่เน้นพฤติกรรมไม่ใช่การทดสอบ

ในคำพูดของ Dan North“ ฉันพบว่าการเปลี่ยนจากการคิดในการทดสอบไปสู่การคิดในพฤติกรรมนั้นลึกซึ้งมากจนฉันเริ่มอ้างถึง TDD ว่า BDD หรือ Behavior Driven Development” TDD มุ่งเน้นไปที่การทำงานของบางสิ่ง BDD มุ่งเน้นไปที่สาเหตุที่เราสร้างมันขึ้นมา

BDD ตอบคำถามต่อไปนี้ที่นักพัฒนามักจะเผชิญ -

คำถาม ตอบ
จะเริ่มต้นที่ไหน? นอก - ใน
จะทดสอบอะไร เรื่องราวของผู้ใช้
สิ่งที่ไม่ต้องทดสอบ? อย่างอื่น

คำตอบเหล่านี้ทำให้เกิดกรอบเรื่องราวดังนี้ -

Story Framework

ในฐานะที่เป็น [Role]

ฉันต้องการ [Feature]

ดังนั้น [Benefit]

ซึ่งหมายความว่า 'เมื่อก Feature ถูกดำเนินการผลลัพธ์ที่ได้ Benefit เป็นของบุคคลที่เล่นไฟล์ Role.'

BDD ตอบคำถามต่อไปนี้เพิ่มเติม -

คำถาม ตอบ
ต้องทดสอบเท่าไหร่ในครั้งเดียว? เน้นน้อยมาก
สิ่งที่เรียกว่าการทดสอบของพวกเขา? เทมเพลตประโยค
จะเข้าใจได้อย่างไรว่าทำไมการทดสอบจึงล้มเหลว เอกสารประกอบ

คำตอบเหล่านี้ทำให้เกิดกรอบตัวอย่างดังนี้ -

Example Framework

Given บริบทเริ่มต้นบางส่วน

When เหตุการณ์เกิดขึ้น

Then ตรวจสอบผลลัพธ์บางอย่าง

ซึ่งหมายความว่า 'เริ่มจากบริบทเริ่มต้นเมื่อมีเหตุการณ์ใดเหตุการณ์หนึ่งเกิดขึ้นเรารู้ว่าผลลัพธ์เป็นอย่างไร should be. '

ดังนั้นตัวอย่างแสดงพฤติกรรมที่คาดหวังของระบบ ตัวอย่างนี้ใช้เพื่อแสดงสถานการณ์ต่างๆของระบบ

เรื่องราวและสถานการณ์

ขอให้เราพิจารณาภาพประกอบต่อไปนี้โดย Dan North เกี่ยวกับระบบ ATM

เรื่องราว

As a ลูกค้า,

I want ถอนเงินสดจากตู้เอทีเอ็ม

so that ฉันไม่ต้องรอเข้าแถวที่ธนาคาร

สถานการณ์

มีสองสถานการณ์ที่เป็นไปได้สำหรับเรื่องราวนี้

Scenario 1 - บัญชีเป็นเครดิต

Given บัญชีเป็นเครดิต

And บัตรถูกต้อง

And ตู้มีเงินสด

When ลูกค้าขอเงินสด

Then ตรวจสอบให้แน่ใจว่าบัญชีถูกหัก

And ตรวจสอบให้แน่ใจว่ามีการจ่ายเงินสด

And ตรวจสอบให้แน่ใจว่าบัตรถูกส่งคืน

Scenario 2 - บัญชีถูกถอนเกินขีด จำกัด เงินเบิกเกินบัญชี

Given บัญชีถูกถอนออกไป

And บัตรถูกต้อง

When ลูกค้าขอเงินสด

Then ตรวจสอบว่าข้อความปฏิเสธปรากฏขึ้น

And ตรวจสอบให้แน่ใจว่าไม่มีการจ่ายเงินสด

And ตรวจสอบให้แน่ใจว่าบัตรถูกส่งคืน

เหตุการณ์เหมือนกันในทั้งสองสถานการณ์ แต่บริบทแตกต่างกัน ดังนั้นผลลัพธ์จึงแตกต่างกัน

วงจรการพัฒนา

วัฏจักรการพัฒนาสำหรับ BDD คือไฟล์ outside-in แนวทาง

Step 1- เขียนตัวอย่างมูลค่าทางธุรกิจระดับสูง (ภายนอก) (โดยใช้ Cucumber หรือ RSpec / Capybara) ที่เป็นสีแดง (RSpec สร้างเฟรมเวิร์ก BDD ในภาษา Ruby)

Step 2 - เขียนตัวอย่าง RSpec ระดับล่าง (ด้านใน) สำหรับขั้นตอนแรกของการใช้งานที่เป็นสีแดง

Step 3 - ใช้รหัสขั้นต่ำเพื่อส่งผ่านตัวอย่างระดับล่างนั้นดูเป็นสีเขียว

Step 4 - เขียนตัวอย่าง RSpec ระดับล่างถัดไปที่ผลักไปสู่ขั้นตอนที่ 1 ซึ่งจะเป็นสีแดง

Step 5 - ทำซ้ำขั้นตอนที่ 3 และขั้นตอนที่ 4 จนกระทั่งตัวอย่างระดับสูงในขั้นตอนที่ 1 เป็นสีเขียว

Note - ควรคำนึงถึงประเด็นต่อไปนี้ -

  • Red/green state คือสถานะการอนุญาต

  • เมื่อการทดสอบระดับต่ำของคุณเป็นสีเขียวคุณจะมีสิทธิ์ในการเขียนตัวอย่างใหม่หรือปรับเปลี่ยนการใช้งานที่มีอยู่ คุณต้องไม่เพิ่มฟังก์ชัน / ความยืดหยุ่นใหม่ในบริบทของการปรับโครงสร้างใหม่

  • เมื่อการทดสอบระดับต่ำของคุณเป็นสีแดงคุณจะมีสิทธิ์เขียนหรือเปลี่ยนโค้ดการใช้งานได้เฉพาะเมื่อทำให้การทดสอบที่มีอยู่กลายเป็นสีเขียว คุณต้องต่อต้านการกระตุ้นให้เขียนโค้ดเพื่อผ่านการทดสอบครั้งต่อไปซึ่งไม่มีอยู่หรือใช้คุณสมบัติที่คุณคิดว่าดี (ลูกค้าคงไม่ได้ถาม)