Cloud Code Functions
クラウドコードのユニットテストでソフトウェアデベロッパーをサポート
19 分
クラウドコード関数を通じてユニットテストを作成する方法 はじめに このセクションでは、ライブラリを使用してローカルで関数の動作とテストを確認できます parse server test runner 前提条件 このチュートリアルを完了するには、以下が必要です ユニットテストを適用するためにnode jsがインストールされたローカル環境。ターミナルでnode jsを正常にインストールするために、 公式nodejsチュートリアル を参照してください。 back4appで作成されたアプリ。 back4appでアプリを作成する方法を学ぶために、 新しいアプリを作成するチュートリアル を参照してください。 プロジェクトに設定されたback4appコマンドライン。 プロジェクトのクラウドコードを設定する方法を学ぶために、 クラウドコードの設定チュートリアル を参照してください。 まず、ユニットテストについて話しましょう! 開発者が異なる意図を持って関数を書くとき、ソフトウェアコミュニティで明らかになる重要なポイントは、作成されたコードをテストするための想像上のシナリオの適用です。ユニットテストの手順を実行することは、コードを部分的にテストできるため、メインコードが無傷で妥協されないことを保証します。 では、シンプルな実践例はどうですか? あなたが労働者の名前、職位、会社を完全な文で表示する関数を書く必要があると仮定しましょう。次の入力項目を取得するために関数を書く必要があります 会社 職位 労働者の名前 簡単なテストを完了するためのステップ 最初に、ターミナルでディレクトリを作成し、次のコマンドを使用してテストアプリ(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ファイルにこれらの関数をインポートします。次のように 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テストランナーの設定 back4appのプロジェクトのcloudフォルダーに実装された私たちのメソッドを使用して、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 ルートディレクトリで(以下のファイルは必要なモジュールの例です) ローカルテストの設定を開始します。これには、テスト目的でプログラム的に設定するためのコードに以下のコマンドに従います。 成功裏にインストールが完了したら、記載されたコマンドでローカルのユニットテストを確認し、以下のような結果を受け取ることができます 素晴らしい、準備が整いました! 上記のガイドに従って、parse server test runnerとback4appのために開発したcloud code用の関数を使用することができます。