Cloud Code Functions
Test Unitari del Cloud Code con Parse e Jasmine
22 min
come creare un test unitario attraverso le loro funzioni cloud code introduzione questa sezione ti permetterĂ di controllare il funzionamento e il test delle tue funzioni localmente utilizzando la libreria https //github com/ampme/parse server test runner prerequisiti per completare questo tutorial, avrai bisogno di un ambiente locale con node js installato per applicare i test unitari puoi seguire il https //nodejs org/en/download/package manager/ per installare correttamente node js nel tuo terminale un'app creata su back4app segui il https //www back4app com/docs/get started/new parse app per imparare come creare un'app su back4app back4app command line configurato con il progetto segui il https //www back4app com/docs/local development/parse cli per imparare come impostare il codice cloud per un progetto prima di tutto, dobbiamo parlare di test unitari! quando gli sviluppatori iniziano a scrivere una funzione con diverse intenzioni in mente, un punto principale evidente nella comunitĂ del software è l'applicazione di scenari immaginari affinchĂŠ il codice creato venga testato è necessario eseguire la procedura di test unitari poichĂŠ consente di testare il codice in parti, il che garantisce che il tuo codice principale rimanga intatto e non compromesso e ora, che ne dici di un semplice esempio pratico? supponiamo che tu debba scrivere una funzione per mostrare in una frase completa, il nome del lavoratore, la posizione e l'azienda dovremo scrivere la funzione per ottenere i seguenti elementi di input azienda posizione nome del lavoratore passaggi per completare il semplice test nel tuo terminale, inizialmente, creeremo una directory e configureremo prima la tua app di test (package json), utilizzando il seguente comando $ mkdir unit test sample && cd unit test sample $ npm init suggerimento utilizzando il npm init npm init comando, potrai creare il file package json copre solo gli elementi piĂš comuni e cerca di indovinare valori predefiniti sensati per questo motivo, renderemo disponibili le dipendenze necessarie affinchĂŠ il codice funzioni il risultato da âpackage jsonâ sarĂ qualcosa di simile all'esempio qui sotto { "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" "" } ora, creiamo il file (index js) utilizzando il comando qui sotto /unit test sample$ touch index js ora inseriremo il codice qui sotto nel file precedentemente creato, e la funzione inserirĂ un esempio che può dimostrare questo test con il codice 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 }; in nodejs, il modulo racchiude il codice correlato in un'unitĂ di codice singola, e quando usi module exports , aumenta il codice incapsulato che può essere utilizzato in altri file testiamo 0/ infine, puoi lavorare con il tuo terminale /unit test sample$ node \> var moduleback4app = require(' /index js'); undefined \> moduleback4app("jonathan", "developer", "back4app") ciao, jonathan! sei developer in back4app company suggerimento utilizzando la require() require() funzione, puoi importare ed esportare moduli, e nel caso sopra, stiamo usando questa funzione per richiedere un file all'interno di un'applicazione e utilizzando parse, posso testare la mia funzione? certo, come parametro di test, creeremo un backend per controllare le informazioni dei dipendenti di un'azienda strutturiamo le classi come parse user (riferimento per i dipendenti) username, email, password (richiesti) ti consigliamo di dare un'occhiata dettagliata alla http //docs parseplatform org/js/guide/#users per ottenere ulteriori informazioni sulle proprietĂ degli utenti infoemployee posizione dipartimento turno di lavoro userid (puntatore) 1 comprendere la nostra struttura finale iniziamo! useremo il https //www back4app com/docs/cloud code functions/docs parseplatform org/js/guide/ come parametro per lo sviluppo delle nostre funzioni innanzitutto, dopo aver completato la configurazione utilizzando l'interfaccia della riga di comando https //www back4app com/docs/cloud code functions/unit tests#content prerequisites ), comprenderemo come funzionerĂ con la struttura finale dei file âââback4appproject â âââ cloud â â âââ functions js â â âââ main js â âââ public â âââ package json â âââ index js â âââ node modules â âââ src â â âââ jasmine js avviso quando carichi i file nel tuo cloud code, l'interfaccia della riga di comando (vedi https //www back4app com/docs/cloud code functions/unit tests#content prerequisites ) ignorerĂ gli altri file e caricherĂ solo quelli che si trovano nella cartella pubblica e cloud 2 scrivere la nostra funzione dopo aver configurato l'ambiente per l'interfaccia della riga di comando, scriveremo la funzione per costruire il processo di registrazione dell'employee e salvare le informazioni aggiuntive rifattorizzando il codice, nel file main js, importeremo queste funzioni in main, come 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)); l'idea è di separare le funzioni dall'interfaccia cloud in modo da poterle testare senza inviare richieste http in modo inefficiente questo avrĂ molto senso mentre creiamo la suite di test 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 configurare l'ambiente per testare il codice sopra! per la nostra suite di test, utilizzeremo https //jasmine github io/ , un framework di test javascript molto popolare tuttavia, il nostro codice finora è completamente indipendente dai nostri test, quindi puoi utilizzare qualsiasi framework o piattaforma tu preferisca installa le dipendenze di sviluppo installiamo jasmine globalmente e utilizziamo, con i comandi qui sotto /back4appproject$ sudo npm install g jasmine /back4appproject$ jasmine randomizzato con seed 48094 iniziato nessuna specifica trovata finito in 0 002 secondi incompleto nessuna specifica trovata 4 configurare il parse server test runner nella cartella con i nostri metodi implementati nella cartella cloud del progetto in back4app, creeremo nuovi file nel nostro progetto su node js che configureranno questa interazione /back4appprojectsrc$ touch index js /back4appproject$ mkdir src && cd src /back4appproject/src$ touch jasmine js ora configureremo i file creati sopra con i codici mostrati di seguito 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 }); l'ultimo passo è configurare il package json, utilizzando il comando $ npm init $ npm init nella directory radice (il file qui sotto è solo un esempio con i moduli richiesti) 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 } e ora, verificherai che ci avviciniamo alla struttura descritta in https //www back4app com/docs/cloud code functions/unit tests#content structure passi ) 5 tornando al terminale inizieremo a configurare il test locale, per questo seguiremo il comando qui sotto per impostare programmaticamente per scopi di test /back4appproject$ # nella stessa directory di package json /back4appproject$ npm install dopo l'installazione riuscita, puoi controllare il tuo test unitario localmente con il comando descritto e ricevere il risultato, come /back4appproject$ jasmine src/jasmine js randomizzato con seed 79055 iniziato â scaricato mongodb 3 6 5 \[] 1 spec, 0 fallimenti finito in 19 983 secondi randomizzato con seed 79055 (jasmine random=true seed=79055) meraviglioso, è pronto! con la guida descritta sopra, sei in grado di lavorare con il parse server test runner e le tue funzioni sviluppate per il cloud code su back4app