Cloud Code Functions
Модульное тестирование функций облачного кода в Back4App
22 мин
как создать модульный тест с помощью их функций облачного кода введение этот раздел позволит вам проверить работу и тестирование ваших функций локально с использованием библиотеки parse server test runner предварительные требования чтобы завершить этот учебник, вам потребуется локальная среда с установленным node js для применения модульных тестов вы можете следовать официальному учебнику по nodejs для успешной установки node js в вашем терминале приложение, созданное на back4app следуйте учебнику по созданию нового приложения чтобы узнать, как создать приложение на back4app back4app command line, настроенный с проектом следуйте учебнику по настройке облачного кода чтобы узнать, как настроить облачный код для проекта прежде всего, нам нужно поговорить о модульном тестировании! когда разработчики начинают писать функцию с разными намерениями, важным моментом, очевидным в сообществе разработчиков, является применение воображаемых сценариев для тестирования созданного кода необходимо выполнить процедуру модульного тестирования, так как это позволяет тестировать код по частям, что гарантирует, что ваш основной код остается целым и неповрежденным а теперь, как насчет простого практического примера? предположим, что вам нужно написать функцию, чтобы показать в полном предложении имя работника, должность и компанию нам нужно будет написать функцию, чтобы получить следующие входные элементы компания должность имя работника шаги для завершения простого теста в вашем терминале сначала мы создадим директорию и настроим ваше тестовое приложение (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 (указатель) 1 понять нашу окончательную структуру давайте начнем! мы будем использовать руководство по parse server javascript в качестве параметра для разработки наших функций во первых, после завершения настройки с использованием интерфейса командной строки (см предварительные требования https //www back4app com/docs/cloud code functions/unit tests#content prerequisites ), мы поймем, как это будет работать с окончательной структурой из файлов примечание когда вы загружаете файлы в свой cloud code, интерфейс командной строки (см предварительные требования ) проигнорирует другие файлы и загрузит только те, которые находятся в папке public и cloud 2 написание нашей функции после настройки окружения для интерфейса командной строки мы напишем функцию для построения процесса регистрации сотрудника и сохранения дополнительной информации рефакторинг кода в файле 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 folder в 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