②Meteorに触ってみる(クラウド環境へのデプロイ)

Meteorで作成したWEBアプリケーションをクラウド環境にデプロイしてみます。


今回は、Meteor公式から提供されているクラウド環境を使用してみます。


■デプロイ
下記コマンドで、クラウド環境へデプロイします。※「hogehogehoge」の部分は、任意のサイト名を指定します

meteor deploy hogehogehoge.meteor.com


http://hogehogehoge.meteor.comにブラウザでアクセスしてみます。



う〜ん、簡単ですね!

①Meteorに触ってみる(インストールと初めてのアプリ作成)

簡単にWebアプリケーションが作れるMeteorを触ってみます。


■Meteorとは?
Webアプリケーション開発プラットフォームです。
JavaScriptとHTML+CSSだけで、Webアプリケーションが作成できます。


・公式サイト
https://www.meteor.com/


■インストール
MacLinuxの場合は、下記コマンドで、簡単にインストールできます。

curl https://install.meteor.com/ | sh


Windowsインストーラもあるので、Windowsにもインストールできるみたいです。
今回は、Ubuntu環境に入れてみます。


■アプリ作成
下記コマンドで、アプリを作成します。※「HelloWorld」部分は任意のアプリ名を指定します

meteor create HelloWorld


下記コマンドで、アプリを実行してみます。

cd HelloWorld
meteor


Webアプリケーションサーバも内蔵されているので、
ApacheTomcat等のインストールは不要です。


また、データベースは、MongoDBが組み込まれています。


・MongoDB
https://ja.wikipedia.org/wiki/MongoDB


MongoDBは、NoSQLデータベースです。
NoSQLデータベースは、データを階層構造で格納するので、
RDBMSで必要な、テーブル作成(CreateTable文)は不要です。
事前準備なしで、直ぐに使用できます。


http://localhost:3000に、ブラウザでアクセスしてみます。

AntからGroovyスクリプトを実行してみる⑨

AntからGroovyスクリプトを実行してみます。

<?xml version="1.0" ?>
<project name="sample" default="test">

	<!-- groovy-all-*.jar を指定 -->
	<taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy" classpath="groovy-all-2.3.7.jar" />

	<target name="test">
		<groovy><![CDATA[
			
			// Eclipse上から実行する場合は、groovy-all-X.X.X.jarのクラスパス追加が必要
			//
			// 1)「build.xml」を右クリック→「実行」→「Antビルド(3)」
			// 2)「クラスパス」タブの「追加タスクおよびサポート」に「groovy-all-X.X.X.jar」を追加する
			
			// groovyスクリプトを自由に記述できる。
			// 下記変数は、暗黙的に利用可能。
			//
			// ant        …AntBuilder
			// project    …ビルドしているプロジェクト
			// properties …プロパティ (変更可能)
			// target     …実行しているターゲット
			// task       …Groovyをラップしているタスク
			
			println "Hello World!!"
			
		]]></groovy>
	</target>
</project>


groovy-all-*.jarのパスを通すと、タグが使用可能になります。
タグ内に、自由にGroovyスクリプトを記述することができます。


Antでも、条件分岐やループ等の処理を記述する事は可能なのですが、
Groovyスクリプトで記述した方が分かりやすいですね!


また、AntからGroovyスクリプトを実行することで、
(Antでは実現できない)複雑な処理を、Antから実行することができます。

自宅開発環境のアップデート

自宅開発環境アップデートです。
前回の教訓を生かして、こまめにアップデートします。自分への覚書を残しておきます。


Ubuntuアップデート
VirtualBox上のEclipse等を詰め込んだ、Ubuntu開発環境をアップデート。
特に問題なく終了。


Hyper-V Serverアップデート
古くなったPCに、Hyper-V 2012 Server Consoleを入れています。
Hyper-V ServerのWindows Updateを実行。特に問題なく終了。


Hyper-V上のCentOS5.10は、yum update でアップデート。特に問題なく終了。
Hyper-V上のJenkinsとJenkinsプラグインもアップデート。特に問題なく終了。


Windowsのアップデート
Windows8.1→Windows10にアップデート。
アップデート直後は、画面の解像度が変更できなかったり、
Google Chromeが強制終了するなどで、ちょっとビビりましたが、
Windows Updateとディスプレイドライバを更新したら治りました。
今のところ、問題なく使えています。なんとなく、OS自体が軽くなった気がする。(気分的に)


Windows10にしてしまったので、 Hyper-VServerのリモート管理ができなくなった・・・
Windows10用のリモート サーバー管理ツールと、hvremoteの配布待ちですね。


https://code.msdn.microsoft.com/windowsdesktop/Hyper-V-Remote-Management-26d127c6

Groovyでユニットテストを書いてみる(DbUnit)⑧

Groovyでユニットテストを書いてみます。
今回は、DbUnitを使用してみます。

■Groovyでユニットテスト

package sample

// いろいろと方法がありますが、今回は、spockを使用します。
// spock:https://code.google.com/p/spock/

// spockのJARファイルは、下記からダウンロードしました。
// http://repo1.maven.org/maven2/org/spockframework/spock-core/1.0-groovy-2.3/

// spockのテストをEclipseで実行するには、
//「Preferences ⇒ Groovy ⇒ Use monospace font for JUnit」をチェックする。

import static org.junit.Assert.*
import groovy.sql.Sql
import mockit.*

import org.dbunit.Assertion
import org.dbunit.database.DatabaseConnection
import org.dbunit.dataset.IDataSet
import org.dbunit.dataset.excel.XlsDataSet
import org.dbunit.operation.DatabaseOperation
import org.junit.*

import spock.lang.*


class ユニットテスト extends Specification {

	@Test
	def "DbUnitを使ってみる(参照)"() {

		// DbUnitのJARファイルは、下記からダウンロードしました。
		// http://sourceforge.net/projects/dbunit/files/dbunit/

		// SLF4Jも必要です。
		// slf4j-nop-X.X.X.jar、slf4j-api-X.X.X.jar
		// http://www.slf4j.org/download.html

		// Apache POIも必要です。
		// https://poi.apache.org/download.html

		setup:	// 前準備

		// H2データベースを起動
		def server = org.h2.tools.Server.createTcpServer().start()

		// DB接続
		def sql = Sql.newInstance( 'jdbc:h2:tcp://localhost/~/test', 'sa', '', 'org.h2.Driver' )

		// テーブル作成
		try { sql.execute( "CREATE TABLE TEST ( NAME varchar(50), TEXT varchar(100) )" ) } catch( Throwable t ) {} // 既にテーブルがある場合のエラーは無視

		// 初期データ投入
		IDataSet xls = new XlsDataSet( new File( './TEST.xls' ) ) // .xlsx形式だと動かない・・・
		DatabaseConnection connection = new DatabaseConnection( sql.getConnection() )
		DatabaseOperation.CLEAN_INSERT.execute( connection, xls )

		when: // SELECT実行
		def rows = sql.rows( "select * from TEST" )

		then: // 実行結果を検証
		rows.size() == 1			// 取得行は1件であるか
		rows[ 0 ].NAME == 'test'	// NAMEカラムの値が'test'であるか
		rows[ 0 ].TEXT == 'text'	// TEXTカラムの値が'text'であるか

		cleanup: // 後処理
		sql.close()
		server.stop()
	}

	@Test
	def "DbUnitを使ってみる(更新)"() {

		setup:	// 前準備

		// H2データベースを起動
		def server = org.h2.tools.Server.createTcpServer().start()

		// DB接続
		def sql = Sql.newInstance( 'jdbc:h2:tcp://localhost/~/test', 'sa', '', 'org.h2.Driver' )

		// テーブル作成
		try { sql.execute( "CREATE TABLE TEST ( NAME varchar(50), TEXT varchar(100) )" ) } catch( Throwable t ) {} // 既にテーブルがある場合のエラーは無視

		// 初期化(全レコード削除)
		IDataSet xls = new XlsDataSet( new File( './TEST.xls' ) ) // .xlsx形式だと動かない・・・
		DatabaseConnection connection = new DatabaseConnection( sql.getConnection() )
		DatabaseOperation.DELETE_ALL.execute( connection, xls )

		when: // INSERT実行
		sql.execute( "INSERT INTO TEST( NAME, TEXT ) values ( 'test', 'text' )" )

		then: // 期待値Excelと比較
		IDataSet actual = connection.createDataSet()
		Assertion.assertEquals( xls.getTable( 'TEST' ), actual.getTable( 'TEST' ) )	// テーブルと期待値Excelが一致するか

		cleanup:// 後処理
		sql.close()
		server.stop()
	}
}


DbUnitで、データベース操作のユニットテストをしてみました。
参照系は、Excelファイルから初期データを投入しておき、SELECTの取得結果が想定どおりであるかを確認。
更新系は、INSERTを実行し、INSERT結果が期待値Excelファイルと一致するかを確認します。


初期データおよび期待値のExcelファイルは下記の形式です。
シート名がテーブル名、1行目がカラム名、2行目移行がデータです。

Groovyでユニットテストを書いてみる(Mock)⑦

Groovyでユニットテストを書いてみます。
今回は、Mockを使用してみます。

■Groovyでユニットテスト

package sample

// いろいろと方法がありますが、今回は、spockを使用します。
// spock:https://code.google.com/p/spock/

// spockのJARファイルは、下記からダウンロードしました。
// http://repo1.maven.org/maven2/org/spockframework/spock-core/1.0-groovy-2.3/

// spockのテストをEclipseで実行するには、
//「Preferences ⇒ Groovy ⇒ Use monospace font for JUnit」をチェックする。

import static org.junit.Assert.*
import groovy.sql.Sql
import mockit.*

import org.dbunit.Assertion
import org.dbunit.database.DatabaseConnection
import org.dbunit.dataset.IDataSet
import org.dbunit.dataset.excel.XlsDataSet
import org.dbunit.operation.DatabaseOperation
import org.junit.*

import spock.lang.*


class ユニットテスト extends Specification {

	@Test
	def "Mockを使ってみる"() {

		// Mockを使って、既存クラスの挙動を変更する事ができる。
		// 異常系の試験が簡単になります。(わざとエラーコードを返却させるなど)

		// JMockitを使います。
		// JMockitのJARファイルは、下記からダウンロードしました。
		// http://jmockit.org/
		// JMockit.jarをjunit.jarより上位のクラスパスに設定します。(JMockit.jarを先に読み込む必要がある為)

		setup:	// 前準備
		// System.currentTimeMillis()にMockを設定し、現在時刻でなく、0を返却する
		new MockUp<java.lang.System>() {
			@Mock
			long currentTimeMillis() { return 0 }
		}

		cleanup:// 後処理

		when:
		def x = System.currentTimeMillis()
		then:
		x == 0 // 0で返却されるのでテストOK
	}
}


JMockitで、Mockを使ってユニットテストをしてみました。
System.currentTimeMillis()は、Javaの標準ライブラリですが、
Mockにすり替えて、戻り値を0に変更しています。


このように、Mockを使うと、
Java標準APIの挙動を自由に操作できるので、ユニットテストが簡単になります。(ラップする必要がなくなります)

Groovyでユニットテストを書いてみる⑥

Groovyでユニットテストを書いてみます。

■Groovyでユニットテスト

package sample

// いろいろと方法がありますが、今回は、spockを使用します。
// spock:https://code.google.com/p/spock/

// spockのJARファイルは、下記からダウンロードしました。
// http://repo1.maven.org/maven2/org/spockframework/spock-core/1.0-groovy-2.3/

// spockのテストをEclipseで実行するには、
//「Preferences ⇒ Groovy ⇒ Use monospace font for JUnit」をチェックする。

import static org.junit.Assert.*
import groovy.sql.Sql
import mockit.*

import org.dbunit.Assertion
import org.dbunit.database.DatabaseConnection
import org.dbunit.dataset.IDataSet
import org.dbunit.dataset.excel.XlsDataSet
import org.dbunit.operation.DatabaseOperation
import org.junit.*

import spock.lang.*


class ユニットテスト extends Specification {

	@Test
	def "java.lang.Mathのテスト(基本)"() {

		setup:	// 前準備
		cleanup:// 後処理

		// when: テストしたいことを実行
		// then: 実行結果をチェック
		when:
		def x1 = Math.max( 1, 2 )
		then:
		x1 == 2

		// when 〜 then は複数記載できる

		when: def x2 = Math.max( 0, 2 )
		then: x2 == 2

		when: def x3 = Math.max( 1, 0 )
		then: x3 == 1
	}

	@Test
	def "java.lang.Mathのテスト(応用)"() {

		setup:	// 前準備
		cleanup:// 後処理

		// expect 〜 where で、引数と戻り値の複数パターンをまとめて記載できる

		expect:
		Math.max( a, b ) == c

		where:
		a | b || c
		1 | 2 || 2
		0 | 2 || 2
		1 | 0 || 1
	}
}


spockを使うと簡潔に書けます。
JUnitを使った事がある人は、なんとなくコードからイメージが掴めると思います。


特筆すべきは、パラメータと戻り値の複数パターンテストですね。
where句にマトリックスのイメージで、テストパターンが記述できます。
テストパターンが一目瞭然です。


spockをEclipseで使用するには、設定を1箇所変更する必要があります。
Eclipseメニューの「ウィンドウ」→「設定」を選択。


「Groovy」→「Use monospace font for JUnit」をチェックします。


実行してみます。実行方法はJUnitと同じです。
ソースファイルを選択して、右クリック。
コンテキストメニューから「実行」→「JUnit テスト」を選択します。


ユニットテストでエラーになると、こうなります。


Eclipse上だとインデントがズレるので、ちょっと見にくいですが、
テキストをコピーすると下記のようになります。
spockの場合、引数や期待値、実際の値を示してくれるので、わかりやすいですね。
(引数a=0、b=2、期待値は3だけど、実際の値は2で一致してないよ。といっています)

Condition not satisfied:

Math.max( a, b ) == c
     |    |  |   |  |
     2    0  2   |  3
                 false

	at sample.UnitTest.java.lang.Mathのテスト(応用)(UnitTest.groovy:59)