1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

dockerでmongodb環境を構築してテストをする話

Posted at

dockerでmongodb構築

docker run -d --name dev-mongo -p 27017:27017 mvertes/alpine-mongo

-d:バックグラウンドで起動する
--name dev-mongo:dev-mongoという名前をつける
-p:ホストの27017ポートでアクセスしたら、コンテナの27017に転送する
mvertes/alpine-mongo:alpineを利用したmongoのイメージ

起動確認

この記事中は、起動させたままにします。

$ docker ps
CONTAINER ID        IMAGE                  COMMAND                 CREATED             STATUS              PORTS                                 NAMES
a3d250b5c18b        mvertes/alpine-mongo   "/root/run.sh mongod"   2 seconds ago       Up 3 seconds        0.0.0.0:27017->27017/tcp, 28017/tcp   dev-mongo

先ほどの設定が生きています。
IMAGEにはmvertes/alpine-mongo
PORTSでホストの27017からコンテナの27017に転送指定
NAMESにはdev-mongo

補足として、停止と削除は以下のコマンドから。

$ docker stop dev-mongo
$ docker rm dev-mongo

アクセス

dev-mongo内部のアクセス

docker exec -it dev-mongo /bin/sh

dev-mongo内でmongoコマンド

mongo

mongo関連のコマンドの抜粋

// 終了
quit()

// adminで操作
use admin

// コレクションの一覧
show collections

それらを実行した時のコード

$ docker exec -it dev-mongo /bin/sh
bash-4.3# psql -U postgres
psql (10.1)
> use admin
switched to db admin
> quit()
/ # exit

テスト準備

npmでmongodbをインストールします。
typescriptを使いたいので、@types/mongodbもインストールします。

npm install mongodb @types/mongodb --save

テストコード

test.ts
import * as mongodb from "mongodb";
import { Db } from "mongodb";

const MongoClient = new mongodb.MongoClient();
let mongoDb: Db;

// db名
const dbName = "TEST";

// allTest()メソッドを実行
allTest()
	.then( () => {
		// 成功した場合
		console.log( "Complete" );
	} )
	.catch( ( e ) => {
		// 失敗した場合
		console.warn( e );
	} );

/**
* 全テスト実行
**/
async function allTest() {
	await before();

	// 1000件インサート
	await insertTest();

	// todo 必要ならここに他のテストのメソッドを追加したり
}

/**
* 事前実行
**/
async function before(): Promise<any> {
	const db = await MongoClient.connect( "mongodb://localhost:27017/" );
	try {
		// テストで使用したいdb名と同名のdbがあったらdrop
		await db.dropCollection( dbName );
	} catch ( err ) {
		// 存在しない場合は無視
	}
	// 新しくdbを作る
	await db.createCollection( dbName );
	mongoDb = db;
}

/**
* 挿入テスト
**/
async function insertTest() {
	const coll = mongoDb.collection( dbName );

	const timeName = "1000件インサート";
	console.time( timeName );

	const len = 1000 | 0;
	let i = 0 | 0;
	while ( i < len ) {
		i = (i + 1) | 0;

		await coll.insertOne( {
			id: i,
			name: `username${i}`
		} );
	}
	console.timeEnd( timeName );

	const count = await coll.count( {} );
	if ( count === len ) {
		console.log( "SUCCESS" );
	} else {
		console.log( "FAILURE" );
	}
}

ちょっと訳あって普通にコード書いてますが、テストは普通にmocha使ってpower-assertで判定した方がいいと思います。
(というか実際はそうしているのであとで書き直すかも)

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?