Fake data บน Postman
การ Fake data
Fake คือ การจำลองข้อมูลที่ส่งเข้าไปในระบบให้ใกล้เคียงกับของจริง เพื่อที่จะได้ไม่ต้องนำ data จริงมาทำการทดสอบ ซึ่งในบทความนี้เราจะเน้นที่การ Fake data ใน postman
แทนที่เราจะต้องมานั่งพิมพิ์หรือ copy data ซ้ำๆ เราสามารถใช้เทคนิคต่างๆที่เราจะแนะนำหลังจากนี้ไปประยุกต์ใช้จะได้มีข้อมูลที่ใกล้เคียงกับของจริงมากขึ้นและยังช่วยไม่ให้เราต้องมานั่งทำงานซ้ำๆอีกด้วย
Mock และ Fake ต่างกันอย่างไร
คำว่า Mock และ Fake เป็นคำที่ชวนสับสนมากๆ สำหรับการทำ Test เราลองมาดูความหมายของแต่ละคำกัน
Mock Server
การ Mock จะเป็นการสร้างผลลัพธ์แบบ Static คือ เป็นตัวปลอมที่ไม่สามารถจำลองการทำงานจริงของระบบได้ จะมี ผลลัพธ์ที่ Return กลับไปเหมือนเดิมทุกครั้ง (ระบุ input และ output ที่แน่นอน) โดยถ้า input ที่เข้าไม่ตรงกับที่กำหนดไว้ก็สามารถ throw exception ออกมาได้
จุดประสงค์ของการ Mock คือการจำลอง Service ขึ้นมาโดยอาจเป็น service ที่เราจะพัฒนาในลำดับต่อไป หรืออาจเป็น service ที่มีอยู่แล้วแต่ยังไม่อยากเข้าไปเชื่อมต่อตอนนี้
Mocks are pre-programmed with expectations which form a specification of the calls they are expected to receive. They can throw an exception if they receive a call they don’t expect and are checked during verification to ensure they got all the calls they were expecting.
– Martin Fowler –
Faker
แต่ในขณะที่ Fake จะเป็นการจำลองการทำงานที่เหมือนกับระบบจริงแต่ไม่สามารถใช้แทนระบบจริงได้ เช่น เราอาจทดสอบการ Insert Update และ delete ข้อมูลโดยใช้ In-Memory Database หรืออาจ Return ผลลัพธ์ที่เปลี่ยนไปเรื่อยๆ ตาม Schema หรือ Contract ที่เราได้กำหนดไว้ เช่น Json-Server, Dredd และอื่นๆ
Fake objects actually have working implementations, but usually take some shortcut which makes them not suitable for production (an InMemoryTestDatabase is a good example).
– Martin Fowler –
ใน Postman นั้นสามารถทำงานเป็น Mock Server ก็ได้ ซึ่งสามารถอ่านบทความเรื่องการสร้าง Mock Server ด้วย postman ได้ที่นี่
Fake data ใน Postman
ใน postman เราสามารถทำการ fake data ได้ด้วยวิธีการต่างๆ ดังนี้่
- ใช้ Dynamic Variable
- ใช้ functions ใน Lodash
- Fake data ด้วย Mockaroo
Dynamic Variables
Dynamic Variables จะเป็นตัวแปรที่เป็น dynamic คือค่ามันจะเปลี่ยนไปเรื่อยๆ โดย postman จะทำการ random data ออกมาให้ ซึ่งวิธีนี้จะเป็นวิธีการที่ง่ายที่สุด
การใช้ dynamic variables จะมีข้อแตกต่างจากการประกาศตัวแปรทั่วไป(Static Variables) ดังนี้
- เราจะใช้เครื่องหมาย $ นำหน้า
- ชื่อตัวแปรต้องเป็นไปตามที่ postman กำหนดให้มา
โดย Dynamic Variables ที่น่าสนใจมีดังนี้
ชื่อตัวแปร | คำอธีบาย |
---|---|
$guid | random id ที่จะไม่ซ้ำกัน |
$timstamp | เวลาปัจจุบัน อันนี้ไม่ random |
$randomUserAgent | random browser |
$randomInt | random ตัวเลข |
$randomDatePast | random วันที่ที่ผ่านมาแล้ว |
$randomDateFuture | random วันที่ที่ยังไม่ถึง |
$randomDateRecent | random เวลาที่เพิ่งผ่านมาไม่นาน |
$radomIP, $randomIPV6 | radom ip address |
$randomEmail | random e-mail |
$randomURL | random url ทั่วๆไป |
$randomImageURL | radom url ที่ fake รูปภาพให้เรา โดยสามารถระบุประเภทของ image ต่างๆได้ด้วย เช่น $randomFoodImage |
$randomLoremSentence | random ประโยค ถ้าอยากได้่มากกว่า 1 ประโยคให้ใช้ $randomLoremSentences |
$randomLoremWord | random เป็นคำๆ ถ้าอยากได้มากกว่า 1 คำให้ใช้ $randomLoremWords |
ซึ่งเราสามารถพิมพิ์ {{$ชื่อตัวแปร}} ได้ทุกส่วนของ request ไม่ว่าจะเป็นบน URL, ใน Headers หรือ Parametes(Form data)
Dynamic Variables ใน Script
แต่ถ้าต้องการใช้งาน dynamic variable ในหน้าที่ต้องเขียน script เราจะต้องใช้คำสั่ง
pm.variables.replaceIn("{{$ชื่อตัวแปร}}")
เรา generate sample data ก่อนที่จะส่ง request ไปยัง server ได้ด้วย script แบบนี้
const people = []
for(let i =0; i<10; i++){
people.push({
'firstname' : pm.variables.replaceIn("{{$randomFirstName}}"),
'lastname' : pm.variables.replaceIn("{{$randomLastName}}")
});
}
pm.variables.set("REQUEST_BODY", JSON.stringify(people))
pm.variables เป็นตัวแปรที่เอาไว้ share จากหน้า pre-request script ไปยัง request
ต่อไปเราก็เอาตัวแปรนี้ไปใส่ใน request body โดยกำหนดประเภทของ data ที่จะส่งเป็น JSON แล้วก็นำตัวแปรนี้ไปใส่ใน request body
{{REQUEST_BODY}}
ไม่มี $ เพราะเป็น static variable ที่ถูกเก็บอยู่ใน pm.variables
ใช้ Functions ใน Lodash
ในวิธีต่อมาเราจะใช้ JavaScript Library ที่ชื่อว่า Lodash โดย Lodash นั้นจะถูกมัดรวมเข้ามาใน postman อยู่แล้วเราเลยสามารถเรียก lodash ขึ้นมาใช้งานได้เลย โดย functions ใน lodash ที่เกี่ยวข้องกับการ fake data มีดังนี้
- sample เป็นการเลือกสมาชิกใน array ออกมา 1 ตัว
- sampleSize เหมือนกับ sample แต่กำหนดจำนวนของ object ที่ต้องการได้
- random เป็นการ random ตัวเลข สามารถกำหนดตัวเลขต่ำสุดและสูงสุดได้
- shuffle เป็นการสลับลำดับของสมาชิกใน array
ตัวอย่างการใช้งาน
|
|
ทั้ง _.random() และ _.sample() นั้นจะใช้บ่อยมากเพราะข้อมูลที่เป็นตัวเลขหลายๆตัว มันต้องมีค่าสูงสุดหรือต่ำสุด ไม่ได้เป็นตัวเลขอะไรก็ได้ และในหลายๆกรณี data ของเราก็ต้องเลือกมาจาก list รายการของ master data(ข้อมูลที่เป็น enumeration)
Fake data ด้วย Mockaroo
นอกจากนี้เรายังสามารถใช้ Cloud service อย่าง Mockaroo ในการ Mock และ Fake data ซึ่ง mockaroo จะช่วยให้เราสามารถ Fake data ได้ใกล้เคียงมากขึ้นเพราะมี schema ที่หลากหลายเช่น ฺBuzzword, Car Make, Car Model, Bitcoin Address และอื่นๆอีกมากมาย ซึ่งจะช่วยให้เราได้ data ที่ใกล้เคียงกับของจริงมากขึ้น ลองเข้าไปดูตัวอย่างการใช้งานเพิ่มเติมได้ที่ https://www.mockaroo.com
ขั้นตอนแรกเราจะเข้าไปสร้าง schema ชื่อว่า gists(เวลาเรียกผ่าน api จะต้องใช้ gists.json) โดยใน gist นั้นมี 2 field ดังนี้
field | data type |
---|---|
content | Paragraphs |
description | Sentence |
หลังจากเราสร้าง schema ใน Mockaroo เรียบร้อยเราจะสามารถ call api ของ Mockaroo เพื่อนำ data ไปใช้ต่อได้ โดยเราจะเขียน pre-request script ไปเรียก api ของ Mockaroo และหลังจากที่เราได้ data มาเราก็จะนำไปเก็บไว้ใน pm.variables เพื่อใช้งานต่อไป
pm.sendRequest("https://my.api.mockaroo.com/gists.json?key=XXXXXXXX", function(err, response){
const gists = response.json();
pm.variables.set("REQUEST_BODY", JSON.stringify(gists));
})
หวังว่าทุกท่านคงจะสนุกกับการ Fake data และการใช้่งาน postman มากขึ้นนะครับ