Coding Gun

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 Variables

Dynamic Variables จะเป็นตัวแปรที่เป็น dynamic คือค่ามันจะเปลี่ยนไปเรื่อยๆ โดย postman จะทำการ random data ออกมาให้ ซึ่งวิธีนี้จะเป็นวิธีการที่ง่ายที่สุด

การใช้ dynamic variables จะมีข้อแตกต่างจากการประกาศตัวแปรทั่วไป(Static Variables) ดังนี้

  1. เราจะใช้เครื่องหมาย $ นำหน้า
  2. ชื่อตัวแปรต้องเป็นไปตามที่ 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 มีดังนี้

ตัวอย่างการใช้งาน

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
const people = [];
const browsers = ["Chrome", "Safari", "Firefox"];
for(let i =0; i<10; i++){
    people.push({
        'firstname' : pm.variables.replaceIn("{{$randomFirstName}}"),
        'lastname' : pm.variables.replaceIn("{{$randomLastName}}"),
        'age': _.random(1, 100),
        'faveriteBrowser': _.sample(browsers)
    });
}

pm.variables.set("REQUEST_BODY", JSON.stringify(people))

ทั้ง _.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 มากขึ้นนะครับ

Phanupong Permpimol
Follow me