Cloud Code Functions
สร้างและทดสอบฟังก์ชัน Cloud Code สำหรับนักพัฒนา
20 นาที
วิธีสร้างการทดสอบหน่วยผ่านฟังก์ชัน cloud code ของพวกเขา บทนำ ส่วนนี้จะช่วยให้คุณตรวจสอบการทำงานและการทดสอบฟังก์ชันของคุณในท้องถิ่นโดยใช้ไลบรารี https //github com/ampme/parse server test runner ข้อกำหนดเบื้องต้น ในการทำตามบทเรียนนี้ คุณจะต้อง สภาพแวดล้อมในเครื่องที่ติดตั้ง node js เพื่อใช้ในการทดสอบหน่วย คุณสามารถติดตาม https //nodejs org/en/download/package manager/ เพื่อทำการติดตั้ง node js อย่างสำเร็จที่เทอร์มินัลของคุณ แอปที่สร้างขึ้นที่ back4app ติดตาม https //www back4app com/docs/get started/new parse app เพื่อเรียนรู้วิธีการสร้างแอปที่ back4app back4app command line ที่กำหนดค่าไว้กับโปรเจกต์ ติดตาม https //www back4app com/docs/local development/parse cli เพื่อเรียนรู้วิธีการตั้งค่า cloud code สำหรับโปรเจกต์ ก่อนอื่นเราต้องพูดถึงการทดสอบหน่วย! เมื่อผู้พัฒนเริ่มเขียนฟังก์ชันด้วยเจตนาที่แตกต่างกัน จุดสำคัญที่เห็นได้ชัดในชุมชนซอฟต์แวร์คือการใช้สถานการณ์ที่จินตนาการไว้เพื่อให้โค้ดที่สร้างขึ้นได้รับการทดสอบ จำเป็นต้องดำเนินการตามขั้นตอนการทดสอบหน่วย เนื่องจากช่วยให้คุณทดสอบโค้ดเป็นส่วนๆ ซึ่งทำให้แน่ใจว่าโค้ดหลักของคุณยังคงอยู่ในสภาพสมบูรณ์และไม่ถูกทำลาย และตอนนี้ ลองดูตัวอย่างที่ใช้งานง่ายกันไหม? สมมติว่าคุณต้องเขียนฟังก์ชันเพื่อแสดงในประโยคที่สมบูรณ์ ชื่อจากพนักงาน ตำแหน่งและบริษัท เราจะต้องเขียนฟังก์ชันเพื่อรับรายการข้อมูลต่อไปนี้ บริษัท ตำแหน่ง ชื่อพนักงาน ขั้นตอนในการทำแบบทดสอบง่ายๆ ในเทอร์มินัลของคุณ ในเบื้องต้นเราจะสร้างไดเรกทอรีและกำหนดค่าแอปทดสอบของคุณ (package json) ก่อน โดยใช้คำสั่งต่อไปนี้ $ mkdir unit test sample && cd unit test sample $ npm init คำแนะนำ ใช้คำสั่ง 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) โดยใช้คำสั่งด้านล่าง /unit test sample$ touch 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/ สุดท้ายคุณสามารถทำงานกับเทอร์มินัลของคุณ /unit test sample$ node \> var moduleback4app = require(' /index js'); undefined \> moduleback4app("jonathan", "developer", "back4app") สวัสดี, jonathan! คุณคือ developer ในบริษัท back4app คำแนะนำ โดยการใช้ require() require() ฟังก์ชัน คุณสามารถนำเข้าและส่งออกโมดูล และในกรณีข้างต้น เรากำลังใช้ฟังก์ชันนี้เพื่อเรียกไฟล์ภายในแอปพลิเคชัน และการใช้ parse, ฉันสามารถทดสอบฟังก์ชันของฉันได้ไหม? แน่นอน ในฐานะพารามิเตอร์การทดสอบ เราจะสร้างแบ็คเอนด์เพื่อควบคุมข้อมูลของพนักงานในบริษัท มาจัดโครงสร้างคลาสกัน parse user (อ้างอิงสำหรับพนักงาน) ชื่อผู้ใช้, อีเมล, รหัสผ่าน (จำเป็น) เราขอแนะนำให้คุณดูรายละเอียดที่ http //docs parseplatform org/js/guide/#users เพื่อให้ได้ข้อมูลเพิ่มเติมเกี่ยวกับคุณสมบัติของผู้ใช้ infoemployee ตำแหน่ง แผนก กะทำงาน userid (pointer) 1 เข้าใจโครงสร้างสุดท้ายของเรา เริ่มกันเลย! เราจะใช้ https //www back4app com/docs/cloud code functions/docs parseplatform org/js/guide/ เป็นพารามิเตอร์สำหรับการพัฒนาฟังก์ชันของเรา ก่อนอื่น หลังจากที่ตั้งค่าเสร็จสิ้นโดยใช้ command line interface https //www back4app com/docs/cloud code functions/unit tests#content prerequisites ), เราจะเข้าใจว่ามันจะทำงานอย่างไรกับโครงสร้างสุดท้ายจากไฟล์ ├──back4appproject │ ├── cloud │ │ ├── functions js │ │ ├── main js │ ├── public │ ├── package json │ ├── index js │ ├── node modules │ ├── src │ │ ├── jasmine js หมายเหตุ เมื่อคุณอัปโหลดไฟล์ไปยัง cloud code ของคุณ command line interface (ดู https //www back4app com/docs/cloud code functions/unit tests#content prerequisites ) จะละเว้นไฟล์อื่น ๆ และอัปโหลดเฉพาะไฟล์ที่อยู่ในโฟลเดอร์สาธารณะและคลาวด์เท่านั้น 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 การตั้งค่าสภาพแวดล้อมเพื่อทดสอบโค้ดข้างต้น! สำหรับชุดทดสอบของเรา เราจะใช้ https //jasmine github io/ , ซึ่งเป็นเฟรมเวิร์กการทดสอบ javascript ที่ได้รับความนิยมอย่างสูง อย่างไรก็ตาม โค้ดของเราจนถึงตอนนี้ไม่มีความเกี่ยวข้องกับการทดสอบของเราเลย ดังนั้นคุณสามารถใช้เฟรมเวิร์กหรือแพลตฟอร์มใดก็ได้ที่คุณต้องการ ติดตั้งการพัฒนาขึ้นอยู่ มาติดตั้ง jasmine ทั่วไปและใช้ด้วยคำสั่งด้านล่าง /back4appproject$ sudo npm install g jasmine /back4appproject$ jasmine สุ่มด้วยเมล็ด 48094 เริ่มต้น ไม่พบสเปค เสร็จสิ้นใน 0 002 วินาที ไม่สมบูรณ์ ไม่พบสเปค 4 การกำหนดค่าตัวทดสอบ parse server ในโฟลเดอร์ ด้วยวิธีการของเราได้ถูกนำไปใช้ในโฟลเดอร์โปรเจกต์ cloud ใน back4app เราจะสร้างไฟล์ใหม่ในโปรเจกต์ของเราบน node js ที่จะกำหนดการโต้ตอบนี้ /back4appprojectsrc$ touch index js /back4appproject$ mkdir src && cd src /back4appproject/src$ touch jasmine 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 กลับไปที่เทอร์มินัล เราจะเริ่มการกำหนดค่าการทดสอบในท้องถิ่น สำหรับสิ่งนี้เราจะทำตามคำสั่งด้านล่างเพื่อเขียนโค้ดสำหรับการตั้งค่าในเชิงโปรแกรมเพื่อวัตถุประสงค์ในการทดสอบ /back4appproject$ # ในไดเรกทอรีเดียวกันจาก package json /back4appproject$ npm install หลังจากการติดตั้งสำเร็จ คุณสามารถตรวจสอบการทดสอบหน่วยของคุณในท้องถิ่นด้วยคำสั่งที่อธิบายไว้และรับผลลัพธ์ เช่น /back4appproject$ jasmine src/jasmine js สุ่มด้วยเมล็ด 79055 เริ่มต้น ✔ ดาวน์โหลด mongodb 3 6 5 \[] 1 สเปค, 0 ความล้มเหลว เสร็จสิ้นใน 19 983 วินาที สุ่มด้วยเมล็ด 79055 (jasmine random=true seed=79055) ยอดเยี่ยม มันพร้อมแล้ว! ด้วยคำแนะนำที่อธิบายไว้ข้างต้น คุณสามารถทำงานกับ parse server test runner และฟังก์ชันที่พัฒนาขึ้นสำหรับ cloud code ไปยัง back4app