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 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 tutorial oficial do nodejs para instalar o node js com sucesso no seu terminal um aplicativo criado no back4app siga o tutorial de criar novo app para aprender como criar um aplicativo no back4app back4app command line configurado com o projeto siga o tutorial de configuração do cloud code 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 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 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 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 parse server 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 guia do parse server javascript como parâmetro para o desenvolvimento de nossas funções primeiramente, após concluir a configuração usando a interface de linha de comando (veja os pré requisitos https //www back4app com/docs/cloud code functions/unit tests#content prerequisites ), entenderemos como funcionará com a estrutura final dos arquivos aviso quando você faz o upload dos arquivos para seu cloud code, a interface de linha de comando (veja pré requisitos ) 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 jasmine , 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 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 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 esses passos anteriores 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 após a instalação bem sucedida, você pode verificar seu teste unitário localmente com o comando descrito e receber o resultado, como 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