Poomjai Saeyong
2 min readJun 30, 2019

การทำ random string และเรียกใช้ใน cypress

เลือกรูปแต่ละทีช่างยากเย็นนน สื่อถึงการสุ่มนะครับ 5555

การทำเทสระบบที่มี member เรามักต้องสร้าง member ใหม่ๆด้วย unique email ไปเจอบทความที่เค้าพูดถึงการ manage test data มาครับ มีวิธีนึงที่เราใช้กันเป็นประจำแต่ไม่มีชื่อเรียก เห็นเค้าใช้คำเท่ดี เค้าเรียกวิธีนี้ ว่า The selfish data generation approach

ref : https://techbeacon.com/app-dev-testing/3-highly-effective-strategies-managing-test-data

วิธีนี้เกิดขึ้นจากเราไม่ต้องการ reset data สำหรับ SUT (system under test) เพราะยิ่งโปรแกรมเราใหญ่ การรีเซ็ทแต่ละครั้งใช้เวลานาน และเทสที่ดีไม่ควรมี dependencies ต่อกันกับเทสอื่น

การเทส sing up ปัญหาแรกที่เราจะเจอคือเรา ระบบส่วนใหญ่มักไม่อนุญาตให้ใช้ email ซ้ำในการ sign up

เลยจะมาแชร์วิธีการปั๊ม email ให้ uniqueเพื่อทดสอบระบบ signup ด้วย cypress นะครับ พร้อมกับประกาศแค่ครั้งเดียวในไฟล์ command.js

ก่อนอื่นเราต้องมี function ที่ใช้สุ่ม character เพื่อเอามาเป็นอีเมลนะครับ

ref2: https://stackoverflow.com/questions/54559089/how-to-reuse-a-function-from-an-existing-cypress-test-and-call-it-in-a-new-one

ผมเอาฟังก์ชั่นมาจากโพสข้างบน สิ่งที่ฟังก์ชั่นนี้ทำคือการ คืนค่า แบบสุ่มออกมา เช่นถ้าเราใช้ generate_random_string(5) ฟังก์ชั่นนี้ก็จะสุ่มเลขผสมตัวอักษรมาให้ ห้าหลัก ในไฟล์ support/commands.js ต้องมีการ export function

export const generate_random_string = string_length => {let random_string = ''let random_asciifor (let i = 0; i < string_length; i++) {random_ascii = Math.floor(Math.random() * 25 + 97)random_string += String.fromCharCode(random_ascii)}return random_string}

ในไฟล์เทสเราก็ต้องมีการประกาศ import สมมติชื่อไฟล์ signup_spec.js

import { generate_random_string } from '../support/commands.js'

ละก็เอาตัวแปรมารับค่าที่ได้จากฟังก์ชั่นครับ เทสข้างล่างเป็นการกรอก email แบบแรนด้อมห้าหลักแรกนะครับ ex. y231s@hotmail.com

import { generate_random_string } from '../support/commands.js'describe('Sign up', () => {var random_string = generate_random_string(5)it('A', () => {cy.get('#id_email')
.type(random_string)
.type('@hotmail.com')
)}
it('B', () => {cy.get('#id_email')
.type(random_string)
.type('@hotmail.com')
)}
)}

มีข้อระวังอย่างนึง คือถ้าในไฟล์เรามีสองเทสละเราประกาศตัวแปรมารับค่าครั้งเดียวใต้ describe ทั้งสองเทสจะใช้ random_string ที่มีค่าเดียวกันเด๊ะ เราก็แก้ด้วยการประกาศตัวแปรสองทีในเลเวลของ “it” แทนแบบข้างล่าง

describe('Sign up', () => {it('A', () => {
var random_string = generate_random_string(5)
cy.get('#id_email')
.type(random_string)
.type('@hotmail.com')
)}
it('B', () => {
var random_string = generate_random_string(5)
cy.get('#id_email')
.type(random_string)
.type('@hotmail.com')
)}
)}

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