Cloud Code Functions
Teste de Unidade para Funções do Cloud Code no Back4App
22 min
como criar um teste de unidade através das funções do cloud code introdução esta seção permitirá que você verifique a operação e o teste de suas funções localmente usando a biblioteca https //github com/ampme/parse server test runner pré requisitos para completar este tutorial, você precisará um ambiente local com node js instalado para aplicar testes de unidade você pode seguir o https //nodejs org/en/download/package manager/ para instalar o node js com sucesso no seu terminal um aplicativo criado no back4app siga o https //www back4app com/docs/get started/new parse app para aprender como criar um aplicativo no back4app back4app command line configurado com o projeto siga o https //www back4app com/docs/local development/parse cli para aprender como configurar o cloud code para um projeto primeiro, precisamos falar sobre teste de unidade! quando os desenvolvedores começam a escrever uma função com diferentes intenções em mente, um ponto importante evidente na comunidade de software é a aplicação de cenários imaginários para que o código criado seja testado é necessário realizar o procedimento de testes de unidade, pois isso permite que você teste o código em partes, o que garante que seu código principal permaneça intacto e não comprometido e agora, que tal um exemplo prático simples? vamos supor que você precise escrever uma função para mostrar em uma frase completa, o nome do trabalhador, a posição e a empresa precisaremos escrever a função para obter os seguintes itens de entrada empresa posição nome do trabalhador passos para completar o teste simples no seu terminal, inicialmente, criaremos um diretório e configuraremos seu app de teste (package json) primeiro, usando o seguinte comando $ mkdir unit test sample && cd unit test sample $ npm init dica usando o npm init npm init comando, você poderá criar o arquivo package json ele cobre apenas os itens mais comuns e tenta adivinhar padrões sensatos por causa disso, disponibilizaremos as dependências necessárias para que o código funcione o resultado de “package json” será algo como o exemplo abaixo { "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" "" } agora, vamos criar o arquivo (index js) usando o comando abaixo /unit test sample$ touch index js agora vamos inserir o código abaixo no arquivo criado anteriormente, e a função irá inserir um exemplo que pode demonstrar este teste com o código 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 }; no nodejs, o módulo encapsula o código relacionado em uma única unidade de código, e quando você está usando module exports , isso aumenta o código encapsulado que pode ser utilizado em outros arquivos vamos testar 0/ finalmente, você pode trabalhar com seu terminal /unit test sample$ node \> var moduleback4app = require(' /index js'); undefined \> moduleback4app("jonathan", "desenvolvedor", "back4app") oi, jonathan! você é desenvolvedor na empresa back4app dica usando a require() require() função, você pode importar e exportar módulos, e no caso acima, estamos usando essa função para requerer um arquivo dentro de uma aplicação e usando o parse, posso testar minha função? claro, como parâmetro de teste, vamos criar um backend para controlar as informações dos funcionários de uma empresa vamos estruturar as classes como parse user (referência para funcionários) nome de usuário, email, senha (obrigatório) recomendamos que você dê uma olhada detalhada no http //docs parseplatform org/js/guide/#users guia para obter mais informações sobre as propriedades do usuário infoemployee posição departamento turno de trabalho userid (ponteiro) 1 entender nossa estrutura final vamos começar! usaremos o https //www back4app com/docs/cloud code functions/docs parseplatform org/js/guide/ como parâmetro para o desenvolvimento de nossas funções primeiramente, após concluir a configuração usando a interface de linha de comando https //www back4app com/docs/cloud code functions/unit tests#content prerequisites ), entenderemos como funcionará com a estrutura final dos arquivos ├──back4appproject │ ├── cloud │ │ ├── functions js │ │ ├── main js │ ├── public │ ├── package json │ ├── index js │ ├── node modules │ ├── src │ │ ├── jasmine js aviso quando você faz o upload dos arquivos para seu cloud code, a interface de linha de comando (veja https //www back4app com/docs/cloud code functions/unit tests#content prerequisites ) ignorará os outros arquivos e fará o upload apenas dos que estão na pasta pública e na pasta cloud 2 escrevendo nossa função após configurar o ambiente para a interface de linha de comando, escreveremos a função para construir o processo de registrar o funcionário e salvar as informações adicionais ao refatorar o código, no arquivo main js, importaremos essas funções para o main, como 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)); a ideia é desacoplar as funções da interface da nuvem para que possamos testá las sem enviar requisições http de forma ineficiente isso fará muito sentido à medida que criamos a suíte de testes 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 configurando o ambiente para testar o código acima! para nossa suíte de testes, usaremos https //jasmine github io/ , um framework de teste javascript altamente popular no entanto, nosso código até agora é completamente agnóstico em relação aos nossos testes, então você pode usar qualquer framework ou plataforma que preferir instale as dependências de desenvolvimento vamos instalar o jasmine globalmente e usar, com os comandos abaixo /back4appproject$ sudo npm install g jasmine /back4appproject$ jasmine aleatório com semente 48094 iniciado nenhum teste encontrado finalizado em 0 002 segundos incompleto nenhum teste encontrado 4 configurando o test runner do parse server na pasta com nossos métodos implementados na pasta do projeto cloud no back4app, criaremos novos arquivos em nosso projeto em node js que configurarão essa interação /back4appprojectsrc$ touch index js /back4appproject$ mkdir src && cd src /back4appproject/src$ touch jasmine js agora, vamos configurar os arquivos criados acima com os códigos mostrados abaixo 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 }); o último passo é configurar o package json, usando o comando $ npm init $ npm init no diretório raiz (o arquivo abaixo é apenas um exemplo com os módulos necessários) 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 agora, você vai verificar que nos aproximamos da estrutura descrita em https //www back4app com/docs/cloud code functions/unit tests#content structure ) 5 retornando ao terminal começaremos a configurar o teste local, para isso seguiremos o comando abaixo para configurar programaticamente para fins de teste /back4appproject$ # no mesmo diretório do package json /back4appproject$ npm install após a instalação bem sucedida, você pode verificar seu teste unitário localmente com o comando descrito e receber o resultado, como /back4appproject$ jasmine src/jasmine js randomizado com semente 79055 iniciado ✔ baixado mongodb 3 6 5 \[] 1 especificação, 0 falhas finalizado em 19 983 segundos randomizado com semente 79055 (jasmine random=true seed=79055) maravilhoso, está pronto! com o guia descrito acima, você pode trabalhar com o parse server test runner e suas funções desenvolvidas para o cloud code do back4app