Cloud Code Functions
สร้างและทดสอบฟังก์ชัน Cloud Code สำหรับนักพัฒนา
20 นาที
วิธีสร้างการทดสอบหน่วยผ่านฟังก์ชัน cloud code ของพวกเขา บทนำ ส่วนนี้จะช่วยให้คุณตรวจสอบการทำงานและการทดสอบฟังก์ชันของคุณในท้องถิ่นโดยใช้ไลบรารี parse server test runner ข้อกำหนดเบื้องต้น ในการทำตามบทเรียนนี้ คุณจะต้อง สภาพแวดล้อมในเครื่องที่ติดตั้ง node js เพื่อใช้ในการทดสอบหน่วย คุณสามารถติดตาม บทเรียน nodejs อย่างเป็นทางการ เพื่อทำการติดตั้ง node js อย่างสำเร็จที่เทอร์มินัลของคุณ แอปที่สร้างขึ้นที่ back4app ติดตาม บทเรียนการสร้างแอปใหม่ เพื่อเรียนรู้วิธีการสร้างแอปที่ back4app back4app command line ที่กำหนดค่าไว้กับโปรเจกต์ ติดตาม บทเรียนการตั้งค่า cloud code เพื่อเรียนรู้วิธีการตั้งค่า cloud code สำหรับโปรเจกต์ ก่อนอื่นเราต้องพูดถึงการทดสอบหน่วย! เมื่อผู้พัฒนเริ่มเขียนฟังก์ชันด้วยเจตนาที่แตกต่างกัน จุดสำคัญที่เห็นได้ชัดในชุมชนซอฟต์แวร์คือการใช้สถานการณ์ที่จินตนาการไว้เพื่อให้โค้ดที่สร้างขึ้นได้รับการทดสอบ จำเป็นต้องดำเนินการตามขั้นตอนการทดสอบหน่วย เนื่องจากช่วยให้คุณทดสอบโค้ดเป็นส่วนๆ ซึ่งทำให้แน่ใจว่าโค้ดหลักของคุณยังคงอยู่ในสภาพสมบูรณ์และไม่ถูกทำลาย และตอนนี้ ลองดูตัวอย่างที่ใช้งานง่ายกันไหม? สมมติว่าคุณต้องเขียนฟังก์ชันเพื่อแสดงในประโยคที่สมบูรณ์ ชื่อจากพนักงาน ตำแหน่งและบริษัท เราจะต้องเขียนฟังก์ชันเพื่อรับรายการข้อมูลต่อไปนี้ บริษัท ตำแหน่ง ชื่อพนักงาน ขั้นตอนในการทำแบบทดสอบง่ายๆ ในเทอร์มินัลของคุณ ในเบื้องต้นเราจะสร้างไดเรกทอรีและกำหนดค่าแอปทดสอบของคุณ (package json) ก่อน โดยใช้คำสั่งต่อไปนี้ คำแนะนำ ใช้คำสั่ง npm init npm init คุณจะสามารถสร้างไฟล์ package json ได้ มันจะครอบคลุมรายการที่พบบ่อยที่สุดและพยายามเดาค่าที่เหมาะสม เนื่องจากเหตุนี้ เราจะทำให้มีการพึ่งพาที่จำเป็นสำหรับโค้ดในการทำงาน ผลลัพธ์จาก “package json” จะมีลักษณะคล้ายกับตัวอย่างด้านล่าง { "name" "yourfoldername", "version" "1 0 0", "description" "just a unit test with using a simple function ", "main" "index js", "scripts" { "test" "echo \\"error no test specified\\" && exit 1" }, "repository" { "type" "git", "url" "" }, "author" "your name", "license" "isc", "bugs" { "url" "{url}/issues" }, "homepage" "" } ตอนนี้เรามาสร้างไฟล์ (index js) โดยใช้คำสั่งด้านล่าง เราจะใส่โค้ดด้านล่างลงในไฟล์ที่สร้างขึ้นก่อนหน้านี้ และฟังก์ชันจะใส่ตัวอย่างที่สามารถแสดงการทดสอบนี้ด้วยโค้ด 1 // index js 2 module exports = function(name, position, company) { 3 let sentence = "hi, " + name + "! you are " + position + " in " + company + " company "; 4 return sentence; 5 }; ใน nodejs โมดูลจะรวมโค้ดที่เกี่ยวข้องเข้าด้วยกันเป็นหน่วยเดียว และเมื่อคุณใช้ module exports , มันจะเพิ่มโค้ดที่ถูกห่อหุ้มซึ่งสามารถนำไปใช้ในไฟล์อื่นได้ มาทดสอบ 0/ สุดท้ายคุณสามารถทำงานกับเทอร์มินัลของคุณ คำแนะนำ โดยการใช้ require() require() ฟังก์ชัน คุณสามารถนำเข้าและส่งออกโมดูล และในกรณีข้างต้น เรากำลังใช้ฟังก์ชันนี้เพื่อเรียกไฟล์ภายในแอปพลิเคชัน และการใช้ parse, ฉันสามารถทดสอบฟังก์ชันของฉันได้ไหม? แน่นอน ในฐานะพารามิเตอร์การทดสอบ เราจะสร้างแบ็คเอนด์เพื่อควบคุมข้อมูลของพนักงานในบริษัท มาจัดโครงสร้างคลาสกัน parse user (อ้างอิงสำหรับพนักงาน) ชื่อผู้ใช้, อีเมล, รหัสผ่าน (จำเป็น) เราขอแนะนำให้คุณดูรายละเอียดที่ parse server เพื่อให้ได้ข้อมูลเพิ่มเติมเกี่ยวกับคุณสมบัติของผู้ใช้ infoemployee ตำแหน่ง แผนก กะทำงาน userid (pointer) 1 เข้าใจโครงสร้างสุดท้ายของเรา เริ่มกันเลย! เราจะใช้ คู่มือ parse server javascript เป็นพารามิเตอร์สำหรับการพัฒนาฟังก์ชันของเรา ก่อนอื่น หลังจากที่ตั้งค่าเสร็จสิ้นโดยใช้ command line interface (ดูข้อกำหนดเบื้องต้น https //www back4app com/docs/cloud code functions/unit tests#content prerequisites ), เราจะเข้าใจว่ามันจะทำงานอย่างไรกับโครงสร้างสุดท้ายจากไฟล์ หมายเหตุ เมื่อคุณอัปโหลดไฟล์ไปยัง cloud code ของคุณ command line interface (ดู ข้อกำหนดเบื้องต้น ) จะละเว้นไฟล์อื่น ๆ และอัปโหลดเฉพาะไฟล์ที่อยู่ในโฟลเดอร์สาธารณะและคลาวด์เท่านั้น 2 การเขียนฟังก์ชันของเรา หลังจากกำหนดค่าบริการสำหรับ command line interface เราจะเขียนฟังก์ชันเพื่อสร้างกระบวนการลงทะเบียนพนักงานและบันทึกข้อมูลเพิ่มเติม โดยการปรับโค้ดในไฟล์ main js เราจะนำเข้าฟังก์ชันเหล่านี้เข้าสู่ main เช่น 1 //in 1cloud/main js 2 3 var cloudfunctions = require(" /functions"); 4 5 / it's necessary to insert the parse instance in our code, 6 because at local context not is referenced / 7 8 parse cloud define("registeruser", cloudfunctions registeruser(parse)); 9 10 parse cloud beforesave("infoemployee", infoemployee infoemployee(parse)); แนวคิดคือการแยกฟังก์ชันออกจากอินเทอร์เฟซคลาวด์เพื่อที่เราจะได้ทดสอบพวกมันโดยไม่ต้องส่งคำขอ http อย่างไม่มีประสิทธิภาพ สิ่งนี้จะมีความหมายมากเมื่อเราสร้างชุดทดสอบ parse server 3 x 1 //in cloud/functions js 2 3 module exports registeruser = function(parse){ 4 return async(request) =>{ 5 let params = request params; //parameters received 6 let infoemployee = parse object extend("infoemployee"); //store information 7 8 let usercreated = new parse user({ 9 "email" params email, 10 "username" params username, 11 "password" params password 12 }) 13 14 //save relation 15 try { 16 let result = await usercreated save(); 17 18 let information = new infoemployee({ 19 "position" params position, 20 "department" params department, 21 "workshift" params shift, 22 "user" result 23 }); 24 25 return information save(); 26 } catch (e) { 27 return e message; 28 } 29 } 30 } 31 32 module exports infoemployee = function(parse){ 33 return async (request) =>{ 34 let req = request object; 35 36 if (!req get("position") || !req get("department") || !req get("workshift")) { 37 throw new error("missing params! the required parameters are position, department workshift"); 38 } else { 39 return; 40 } 41 } 42 } parse server 2 x 1 //in cloud/functions js 2 3 module exports registeruser = function(parse){ 4 return function (request, response){ 5 var params = request params; //parameters received 6 7 var infoemployee = parse object extend("infoemployee"); //store information 8 9 var usercreated = new parse user({ 10 "email" params email, 11 "username" params username, 12 "password" params password 13 }) 14 15 //save relation 16 usercreated save() then((updateduser) => { 17 var information = new infoemployee({ 18 "position" params position, 19 "department" params department, 20 "workshift" params shift, 21 "user" updateduser 22 }); 23 return information save(); 24 }) then((info) => response success(info)) 25 catch((e) => { 26 response error(e message); 27 }) 28 } 29 } 30 31 module exports infoemployee = function(parse){ 32 return function (request, response){ 33 var req = request object; 34 35 if (!req get("position") || !req get("department") || !req get("workshift")) { 36 response error("missing params! the required parameters are position, department workshift"); 37 } else { 38 response success(); 39 } 40 } 41 } 3 การตั้งค่าสภาพแวดล้อมเพื่อทดสอบโค้ดข้างต้น! สำหรับชุดทดสอบของเรา เราจะใช้ jasmine , ซึ่งเป็นเฟรมเวิร์กการทดสอบ javascript ที่ได้รับความนิยมอย่างสูง อย่างไรก็ตาม โค้ดของเราจนถึงตอนนี้ไม่มีความเกี่ยวข้องกับการทดสอบของเราเลย ดังนั้นคุณสามารถใช้เฟรมเวิร์กหรือแพลตฟอร์มใดก็ได้ที่คุณต้องการ ติดตั้งการพัฒนาขึ้นอยู่ มาติดตั้ง jasmine ทั่วไปและใช้ด้วยคำสั่งด้านล่าง 4 การกำหนดค่าตัวทดสอบ parse server ในโฟลเดอร์ ด้วยวิธีการของเราได้ถูกนำไปใช้ในโฟลเดอร์โปรเจกต์ cloud ใน back4app เราจะสร้างไฟล์ใหม่ในโปรเจกต์ของเราบน node js ที่จะกำหนดการโต้ตอบนี้ ตอนนี้เราจะกำหนดค่าไฟล์ที่สร้างขึ้นข้างต้นด้วยรหัสที่แสดงด้านล่าง index js 1 const promise = require('bluebird'); 2 const express = require('express'); 3 const http = require('http'); 4 const {mongoclient} = require('mongodb'); 5 const {parseserver} = require('parse server'); 6 7 const mongodbrunnerstart = require('mongodb runner/mocha/before') bind({ 8 timeout() { 9 }, 10 slow() { 11 }, 12 }); 13 const mongodbrunnerstop = require('mongodb runner/mocha/after'); 14 15 const startdb = () => ( 16 new promise((done, reject) => { 17 done fail = reject; 18 mongodbrunnerstart(done); 19 }) 20 ); 21 22 const stopdb = () => ( 23 new promise((done, reject) => { 24 done fail = reject; 25 mongodbrunnerstop(done); 26 }) 27 ); 28 29 const connectdb = (databaseuri) => new promise((resolve, reject) => { 30 mongoclient connect(databaseuri, (err, db) => { 31 if (err) { 32 reject(err); 33 } else { 34 resolve(db); 35 } 36 }); 37 }); 38 39 let parseserverstate = {}; 40 41 const dropdb = () => { 42 const {mongoconnection} = parseserverstate; 43 return mongoconnection dropdatabaseasync(); 44 }; 45 46 / 47 starts the parseserver idropdatabaseasyncnstance 48 @param {object} parseserveroptions used for creating the `parseserver` 49 @return {promise} runner state 50 / 51 function startparseserver(parseserveroptions = {}) { 52 const mongodbport = process env mongodb port || 27017; 53 const { 54 databasename = 'parse test', 55 databaseuri = 'mongodb //localhost ${mongodbport}/${databasename}', 56 masterkey = 'test', 57 javascriptkey = 'test', 58 appid = 'test', 59 60 port = 30001, 61 mountpath = '/1', 62 serverurl = 'http //localhost ${port}${mountpath}', 63 } = parseserveroptions; 64 65 return startdb() 66 then(() => connectdb(databaseuri)) 67 then((mongoconnection) => { 68 parseserveroptions = object assign({ 69 masterkey, javascriptkey, appid, 70 serverurl, 71 databaseuri, 72 silent process env verbose !== '1', 73 }, parseserveroptions); 74 const app = express(); 75 const parseserver = new parseserver(parseserveroptions); 76 77 app use(mountpath, parseserver); 78 79 const httpserver = http createserver(app); 80 81 promise promisifyall(httpserver); 82 promise promisifyall(mongoconnection); 83 84 return httpserver listenasync(port) 85 then(() => object assign(parseserverstate, { 86 parseserver, 87 httpserver, 88 mongoconnection, 89 expressapp app, 90 parseserveroptions, 91 })); 92 }); 93 } 94 95 / 96 stops the parseserver instance 97 @return {promise} 98 / 99 function stopparseserver() { 100 const {httpserver} = parseserverstate; 101 return httpserver closeasync() 102 then(stopdb) 103 then(() => parseserverstate = {}); 104 } 105 106 module exports = { 107 dropdb, 108 startparseserver, 109 stopparseserver, 110 parseserverstate, 111 }; jasmine js 1 const { startparseserver, stopparseserver, dropdb } = require('parse server test runner'); 2 3 describe('registeruser', () => { 4 beforeall((done) => { 5 const appid = 'test'; 6 const masterkey = 'test'; 7 const javascriptkey = 'test'; 8 9 startparseserver({ appid, masterkey, javascriptkey }) 10 then(() => { 11 parse initialize(appid, masterkey, javascriptkey); 12 parse serverurl = 'http //localhost 30001/1'; 13 }) 14 then(done) catch(done fail); 15 }, 300 60 2); 16 17 afterall((done) => { 18 stopparseserver() 19 then(done) catch(done fail); 20 }); 21 22 beforeeach((done) => { 23 dropdb() 24 then(done) catch(done fail); 25 }); 26 27 it('should work', (done) => { 28 const q = new parse query(' user') 29 q limit(5) 30 find({ usemasterkey true }) 31 then(console log) 32 then(done) catch(done fail); 33 }); 34 }); ขั้นตอนสุดท้ายคือการกำหนดค่า package json โดยใช้คำสั่ง $ npm init $ npm init ในไดเรกทอรีหลัก (ไฟล์ด้านล่างเป็นเพียงตัวอย่างพร้อมกับโมดูลที่จำเป็น) 1 { 2 "name" "back4approject", 3 "version" "1 0 0", 4 "description" "back4app guide using for reference the parse server test runner", 5 "main" "index js", 6 "engines" { 7 "node" ">=6" 8 }, 9 "repository" { 10 "type" "", 11 "url" "" 12 }, 13 "keywords" \[ 14 "parse", 15 "parse server", 16 "testing", 17 "tests" 18 ], 19 "author" "", 20 "license" "isc", 21 "dependencies" { 22 "bluebird" "^3 5 0", 23 "express" "latest", 24 "mongodb" "^2 2 30", 25 "mongodb runner" "^3 5 0", 26 "parse" "^1 10 0", 27 "parse server" "^2 5 3", 28 "parse server test runner" "^1 0 0" 29 } 30 } และตอนนี้ คุณจะตรวจสอบว่าเรามาถึงโครงสร้างที่อธิบายไว้ใน ขั้นตอนก่อนหน้านี้ https //www back4app com/docs/cloud code functions/unit tests#content structure ) 5 กลับไปที่เทอร์มินัล เราจะเริ่มการกำหนดค่าการทดสอบในท้องถิ่น สำหรับสิ่งนี้เราจะทำตามคำสั่งด้านล่างเพื่อเขียนโค้ดสำหรับการตั้งค่าในเชิงโปรแกรมเพื่อวัตถุประสงค์ในการทดสอบ หลังจากการติดตั้งสำเร็จ คุณสามารถตรวจสอบการทดสอบหน่วยของคุณในท้องถิ่นด้วยคำสั่งที่อธิบายไว้และรับผลลัพธ์ เช่น ยอดเยี่ยม มันพร้อมแล้ว! ด้วยคำแนะนำที่อธิบายไว้ข้างต้น คุณสามารถทำงานกับ parse server test runner และฟังก์ชันที่พัฒนาขึ้นสำหรับ cloud code ไปยัง back4app