[Cloud, JavaScript] Mocha.js for Test Automation of Node.js REST API on Oracle Developer Cloud Service

原文はこちら。
https://community.oracle.com/community/cloud_computing/platform-as-a-service-paas/oracle-developer-cloud-service/blog/2017/06/04/mochajs-for-test-automation-of-nodejs-rest-api-on-oracle-developer-cloud-service

このエントリでは、Oracle Developer Cloud Service上でMocha.jsという人気のあるテスティングフレームワークを使ったNode.jsベースのRESTサービスアプリケーションのテスト自動化を取り扱います。このNode.jsアプリケーションをOracle Application Container Cloud Serviceにデプロイします。

(注意)Developer Cloud Serviceを使ったNode.js RESTアプリケーションの開発、およびApplication Containerへのデプロイに関する詳細は、以下のエントリをご覧ください。
Oracle Developer Cloud to build and deploy Nodejs REST project on Application Container Cloud
https://community.oracle.com/community/cloud_computing/platform-as-a-service-paas/oracle-developer-cloud-service/blog/2016/09/07/oracle-developer-cloud-to-build-and-deploy-nodejs-rest-project-on-application-container-cloud

Tech Stack Used

Eclipse: Node.jsアプリケーション開発に使用するIDE
Express.js: REST Webサービス開発に使用するNode.jsモジュール
Grunt: デプロイ用にNode.jsコードアーカイブを生成するためのツール
Testing Framework: Mocha.js
Oracle Developer Cloud: Node.jsアプリケーションのCI、CDおよびその一環でのテスト自動化
Oracle Application Container Cloud: Node.jsベースのREST Webサービスデプロイ先のクラウドサービス

About Mocha framework:

Mochaは機能が豊富なJavaScriptテストフレームワークで、Node.jsならびにブラウザで動作します。Mochaテストフレームワークの主目的は非同期テストをシンプルにすることにあります。Mochaテストは所定の順番で動作します。これにより、柔軟で正確なレポートが作成しつつ、捕捉されない例外を正しいテストケースにマッピングできます。

Some of the salient features of Mocha framework:

  • ブラウザのサポート
  • シンプルな非同期サポート(promiseを含む)
  • テストカバレッジのレポート
  • テスト実行のためのJavaScript API
  • 捕捉されない例外を正しいテストケースにマッピング
  • 非同期テストタイムアウトのサポート
  • テスト再実行のサポート
  • テスト固有のタイムアウト
  • グローバル変数のリーク検知
  • 正規表現に一致するテストをオプションで実行
  • done()への複数呼び出しの検知
  • 利用したい任意のアサーションライブラリの利用

Setting up Mocha for Node.js application Testing:

以下のブログエントリに従ってNode.js RESTサービスアプリケーションを開発すると、Oracle Application Container Cloud Service上のNode.jsにデプロイされたRESTアプリケーションがあります。 このエントリではMochaTestという名前を付けました(もちろん自由に名前を付けることができます)。
Oracle Developer Cloud to build and deploy Nodejs REST project on Application Container Cloud
https://community.oracle.com/community/cloud_computing/platform-as-a-service-paas/oracle-developer-cloud-service/blog/2016/09/07/oracle-developer-cloud-to-build-and-deploy-nodejs-rest-project-on-application-container-cloud
サンプルを簡単にするため、Mocha.jsのテストスクリプトを 'MochaTest'フォルダに含めましたが、分離の観点から別のフォルダを選択することもできます。今回は、Mocha.jsベースのテスト自動化がDeveloper Cloud Serviceを使ってどのように動作するかを確認するためのサンプルアプリケーションゆえ、テストスクリプトを同じアプリケーションプロジェクトに保存することにしました。しかし、大規模なプロジェクトでは、包括的なテストスクリプトを使用して、テストスクリプトのために個別のGitリポジトリとプロジェクト(Developer Cloud Serviceの同じプロジェクトではあるものの、アプリケーション・プロジェクト・フォルダは異なります)を選択することができます。

下図はEclipseのMochaTestプロジェクトのスクリーンショットです。
2017-05-25 13_21_58-Java EE - Eclipse.png

Files for the Nodejs REST service:

  1. Gruntfile.js – ビルドタスクを定義
  2. manifest.json - main.jsという実行対象のmainファイルを定義(ACCSへのデプロイにおいて重要なファイル)
  3. main.js – 実際に実行されるサービスのコード
  4. package.json – 依存性を定義するファイル

File(s) for the test scripts:

test.js

このファイルにはNode.js REST Webサービスのテストスクリプトが含まれています。

Mocha.jsフレームワークの詳細を理解するには以下のリンクを参照してください。
Mocha - the fun, simple, flexible JavaScript test framework
https://mochajs.org/

A peek into the code snippets of the Nodejs application:

Gruntfile.js

アーカイブをOracle Application Container Cloud Serviceに正常にデプロイするため、manifest.jsonファイルを含めることが重要です。expressやbody-parserといったモジュールは、main.jsにおいてRESTサービスの実装に使用されるため、デプロイメントアーカイブ 'nodeappl.zip' に含める必要があります。
module.exports = function(grunt) {  
      
      require('load-grunt-tasks')(grunt);  

      grunt.initConfig({  
        compress: {  
          main: {  
            options: {  
              archive: 'nodeappl.zip',  
              pretty: true  
            },  
           expand: true,  
            cwd: './',  
            src: ['./main.js','./manifest.json','./package.json','./node_modules/express/**/*','./node_modules/body-parser/**/*'],  
            dest: './'  
          }  
        }  
      });

      grunt.registerTask('default', ['compress']);  
    };  

manifest.json

属性 majorVersion はNode.jsのランタイムバージョンを定義します。これは今回は0.12で、属性 command はアーカイブデプロイメントで実行対象のmain.jsというメインサービスファイルを定義する必要があります。
{  
    "runtime":{
        "majorVersion":"0.12"
    },
    "command": "node main.js",
    "release": {},
    "notes": ""
}
(訳注)
Oracle Application Container Cloud Serviceで利用可能なランタイムバージョンは以下のURLを参照してください。
Oracle® Cloud Using Oracle Application Container Cloud Service
Creating an Application
http://docs.oracle.com/en/cloud/paas/app-container-cloud/csjse/creating-application.html#GUID-695C9491-2927-4E7A-AA14-754CEFE07D35__THISTABLEDESCRIBESADDITIONALFIELDSI-620AD53E

package.json

テストスクリプトを実行するためのコマンド 'mocha test.js' を実行する npm testが利用できるよう、Mochaテストフレームワーク・モジュールを開発依存性として含める必要があります。
{
    "name": "MochaTest",  
    "version": "0.0.1",  
    "scripts": {  
        "start": "node main.js",  
        "test": "mocha test.js"  
    },  
    "dependencies": {  
        "body-parser": "^1.13.2",  
        "express": "^4.13.1",  
        "grunt": "^0.4.5",  
        "grunt-contrib-compress": "^1.3.0",  
        "grunt-hook": "^0.3.1",  
        "load-grunt-tasks": "^3.5.2",  
        "request": ""  
    },  
    "devDependencies": {  
        "mocha": "^3.3.0"  
    }  
}  

main.js

main.js ファイルにはget/post関数が含まれています。get関数は、静的なメッセージおよびfalseというエラー属性をレスポンスとして返します。post関数の 'add' は2個の数値をサービスの入力として受け取り、その和を返します。

Node.jsモジュールであるexpressおよびbodyParserはRESTサービス作成のために使っています。
ar express = require("express");  
    var bodyParser = require("body-parser");  
    var app = express();  
    app.use(bodyParser.urlencoded());  
    app.use(bodyParser.json());  
    var router = express.Router();  
      
      
    router.get('/',function(req,res){  
      res.json({"error" : false, "message" : "Hello Abhinav!"});  
    });  
      
      
    router.post('/add',function(req,res){  
      res.json({"error" : false, "message" : "success", "data" : req.body.num1 + req.body.num2});  
    });  
      
      
    app.use('/',router);  
      
      
    app.listen(process.env.PORT || 3000,function(){  
      console.log("I am listening at PORT 3000");  
    })  

A peek into the code snippet of the test script for the Nodejs application:

test.js

スクリプト中に3個のテストがあり、1個目はサービスが立ち上がっているかどうかを確かめるもの、2個目はadd関数が正しく動作しているかどうかを確かめるもの、最後の3個目はランダムなリソースをリクエストした場合に404を返すことを確かめるものです。

It uses the ‘request’ Node.jsモジュールを使ってテスト用アプリケーションURLを取得します。assert Node.jsモジュールも使っています。
var assert = require('assert');  
var request = require('request');  
// UNIT test begin  

describe("Unit Tests for the REST Service",function(){  

    // #1 should return home page  
    it("should find the service to be running",function(){  
        // calling home page api  
        request('https://mochatest-paasdemo015.apaas.us6.oraclecloud.com', function (error, response, body) {
            assert.equal(response.statusCode, 200, 'rest url is up');    
        });  
    });

    it("should add two number",function(){  
        request({  
            url: 'https://mochatest-paasdemo015.apaas.us6.oraclecloud.com/add',  
            method: 'POST',  
            json: {num1: 10, num2: 20}  
        }, function(error, response, body){  
            assert.equal(body.data, 30, 'correct total');  
        });  
    });  

    it("should return 404",function(){  
        request('https://mochatest-paasdemo015.apaas.us6.oraclecloud.com/random',
        function (error, response, body) {  
            assert.equal(response.statusCode, 404, '404 error for random url');    
        });
    })  
});

Build Configuration:

テストケースを実行するため、個別のビルドジョブをDeveloper Cloud Serviceで構成します。下図はビルドジョブの呼び出しの流れを示したものです。


下図は、Node.jsアプリケーションをビルド、デプロイするNodeApplBuildJobビルドジョブの構成画面のスクリーンショットです。ビルドジョブの名前は自由に設定できます。今回は‘NodeApplBuildJob’としています。これはNode.jsアプリケーションなので、JDKはデフォルトのままにしておきます。

Node.jsアプリケーションコードをアップロードしたリポジトリを選択します。前述の通り、Node.jsアプリケーション関連コードを含む同じプロジェクトに、このテストスクリプトが含まれています。


SCMポーリングをトリガーとして設定します。これにより、コードをGitリポジトリにアップロードするたびに、上のビルドトリガー図に示したように、'NodeApplBuildJob'が呼び出されます。
2017-05-26 17_18_10-Build_ BlogProject - Oracle Developer Cloud Service.png
今回は、実行シェル構築ステップを使います。ビルドステップの一環として、まずフォルダをプロジェクトフォルダ 'MochaTest'に変更します。以下のスクリーンショットのように、npm installを使用して、必要なNode.jsモジュールをすべてインストールします。続いて、grunt コマンドを使用して、デプロイ用のzipアーカイブを作成します。
2017-05-26 17_18_36-Build_ BlogProject - Oracle Developer Cloud Service.png
post buildのタブで、gruntビルドスクリプト実行の結果生成されたzipアーカイブを構成します。また、Application Container Cloud ServiceのNodeコンテナ上へのアーカイブのデプロイも構成します。
2017-05-26 17_19_07-Build_ BlogProject - Oracle Developer Cloud Service.png

下図では、Developer Cloud Serviceでビルド済みのアーカイブをApplication Container Cloud Serviceにデプロイするためにデプロイメントを構成しています。
2017-05-26 18_31_44-Deploy _ BlogProject.png
2017-05-26 18_31_11-Deploy _ BlogProject.png


以下は、Mochaテストスクリプトを実行するNodeTestBuildJobのビルドジョブ設定スクリーンショットです。
NodeApplBuildジョブの場合と同様に、ビルドジョブに名前を付けることができます。今回はNodeTestBuildJobという名前を付けました。これはNode.jsアプリケーションのため、JDKはデフォルトのままにしておくことができます。
2017-05-26 18_37_57-Build_ BlogProject - Oracle Developer Cloud Service.png
Node.jsアプリケーションは、test.jsがアプリケーションコードと同じリポジトリにあるため、同じリポジトリを使います。
2017-05-26 18_38_12-Build_ BlogProject - Oracle Developer Cloud Service.png

アプリケーションのビルドジョブであるNodeApplBuildJobの実行完了後、テストビルドジョブが呼び出されます。
2017-05-26 18_38_25-Build_ BlogProject - Oracle Developer Cloud Service.png

ここでも実行シェルビルドステップを使用します。test.jsがMochTestプロジェクトフォルダにあるので、フォルダを MochaTest に変更します。Node.jsモジュールのMochaを開発依存性としてインストールし、npm testを使用してpackage.jsonのscriptsの箇所に記載した 'mocha test.js'コマンドを実行を開始します。
2017-05-26 18_38_40-Build_ BlogProject - Oracle Developer Cloud Service.png

テストスクリプトをビルドジョブ実行時に実行します。以下がテスト結果で、ビルドジョブコンソールで見ることができます。
2017-05-26 18_39_02-Build_ BlogProject - Oracle Developer Cloud Service.png

0 件のコメント:

コメントを投稿