Spock Test Wording - สไตล์ BDD

Mar 19 2023
Spock Framework ใช้สำหรับ Behavioral Driven Development (BDD) BDD รับรองว่าการทดสอบนั้นมนุษย์สามารถอ่านได้ โดยไม่จำเป็นต้องลงลึกในโค้ด ก็สามารถอ่าน เขียน และบำรุงรักษาได้อย่างง่ายดาย

Spock Frameworkใช้สำหรับ Behavioral Driven Development ( BDD ) BDD รับรองว่าการทดสอบนั้นมนุษย์สามารถอ่านได้ โดยไม่จำเป็นต้องลงลึกในโค้ด ก็สามารถอ่าน เขียน และบำรุงรักษาได้อย่างง่ายดาย การใช้ถ้อยคำที่เหมาะสมยังช่วยให้แน่ใจว่าสามารถนำกลับมาใช้ใหม่ได้ เนื่องจากใคร ๆ ก็สามารถทราบได้อย่างง่ายดายว่าเมื่อใดที่สามารถนำรหัสทดสอบ (หรือรหัสแอปพลิเคชัน) กลับมาใช้ที่อื่นได้ เพื่อให้แน่ใจว่าสิ่งนี้ การทดสอบควรเขียนเป็นประโยคธรรมชาติในรูปแบบของข้อกำหนดของซอฟต์แวร์

กฎง่ายๆ เพื่อให้แน่ใจว่าการทดสอบของคุณเขียนได้ดีคือ:

อ่านออกเสียงประโยคในบล็อกโดยมีเครื่องหมายจุลภาคตามหลังแต่ละบล็อก หากประโยคฟังดูถูกต้องตามหลักไวยากรณ์ และฟังดูเหมือนข้อกำหนดซอฟต์แวร์มาตรฐาน แสดงว่าการทดสอบของคุณถูกต้อง

กรณีศึกษา

การทดสอบฟังก์ชัน getUser() ในบริการผู้ใช้ (สังเกตคีย์เวิร์ดเป็นตัวหนา)

ชื่อการทดสอบ (ข้อกำหนด):

getUser ควรส่งคืนผู้ใช้เมื่อมีผู้ใช้อยู่ในฐานข้อมูลผู้ใช้

รายละเอียดการทดสอบ (ข้อกำหนดในการกำหนดประโยคธรรมชาติที่ยาวขึ้น)

เนื่องจากที่เก็บจะส่งคืนผู้ใช้และบริการรายละเอียดจะส่งคืนรายละเอียดผู้ใช้เมื่อเรียกใช้getUser ก็ควรส่งคืนผู้ใช้ที่ถูกต้อง

ด้านล่างนี้เป็นส่วนที่สร้างการทดสอบ Spock BDD:

ชื่อการทดสอบ

ควรเขียนชื่อการทดสอบเป็นข้อกำหนด

คำค้น : ควร

ถูกต้อง: ✅

def "getUser should return a user when a user exists in the users db"
def "when a user exists in the db, getUser should return a user"

def "getUser returns user" //this is not describing what should happen
def "getUser test"
def "when user exists in db, getUser returns user"

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

คำค้น : จะ

ถูกต้อง: ✅

given: 'repository will return a user'
User user = User.builder().id(123).build()
1 * repository.findById(id) >> user
and:  'details service will return user details'
1 * detailsService.getUserDetails(id) >> userDetails

given: 'repository returns a user' //wrong tense
User user = User.builder().id(123).build()
given: 'user object' //this is not defining any data setup. this is simply a variable.
User user = User.builder().id(123).build()

เมื่อบล็อคควรมีการทดสอบการกระทำ

คำค้น : คือ

ถูกต้อง: ✅

when: 'getUser is invoked'

when: 'call getUser'

คำค้น : ควร

จากนั้นบล็อกควรระบุผลลัพธ์ที่คาดหวัง

ถูกต้อง: ✅

then: 'user should be returned'

then: 'reponse is correct'
then: 'user returned is correct'
then: 'assert reponse is correct'