1. shinofara

    Posted

    shinofara
Changes in title
+# jenkinsでのunitテストは、dockerでクリーン環境を作って行おう
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,194 @@
+## 準備
+
+### docker
+
+[dockerに関してはこちら(導入手順もあります)](http://shinofara.hateblo.jp/entry/2014/01/23/120430)
+
+### jenkins
+
+[jenkins構築に関してはこちら(centos編)](http://shinofara.hateblo.jp/entry/2014/02/09/185913)
+
+### jenkinsがdockerを利用するために、グループ追加
+
+```
+sudo gpasswd -a jenkins docker
+```
+
+## CI用Dockerの環境定義
+
+### Dockerfileで環境定義
+
+```
+# cat Dockerfile
+FROM centos
+
+RUN yum install -y git man
+
+# NVM インストール
+RUN git clone --depth 1 https://github.com/creationix/nvm.git ~/.nvm
+
+# nodejs インストール
+RUN bash -c ". /.nvm/nvm.sh; nvm install 0.10"
+
+# スクリプト実行ユーザの作成
+RUN useradd -u 45678 -s /bin/bash -m worker
+
+# ワークスペースのマウント先を作成
+RUN mkdir /workspace
+
+ENTRYPOINT ["/bin/bash", "-c"]
+```
+
+
+
+## jenkinsのjob作成
+
+### 新規job作成
+
+ジョブ名を今回は「docker_test」と入力して、フリースタイルを選択
+
+### jobの設定内容
+
+ビルド->シェルの実行を選択して、以下を記述
+
+```
+#job名をIMAGEに保存
+IMAGE=$JOB_NAME
+
+#dockerで作成するときのimage名定義
+#ワークスペースをjenkinsのワークスペースに設定
+docker build -t $IMAGE $WORKSPACE
+docker run -v $WORKSPACE:/workspace -w /workspace $IMAGE "$(cat <<EOL
+source ~/.nvm/nvm.sh
+nvm use 0.10
+npm install jasmine-node -g
+jasmine-node --junitreport --output junit-reports/ spec
+EOL
+)"
+
+#nvmを読み込み
+#nvm0.10を使用
+#jasmine-nodeをglobalでインストール
+#jasmineでjsのunitテストを実行
+# - --junitreportでjunit形式のレポートを出力する
+# - --outputでレポート出力先をjunit-reportsに設定
+# specディレクトリ以下のspecを実行
+```
+
+### ビルド後の処理
+
+JUnitテスト結果の集計
+
+```
+junit-reports/*xml
+```
+
+## ワークスペースにサンプルでテストを作成する
+
+### テスト対象のjsを作成
+
+```
+# cat lib/stylist.js
+var Stylist, exports;
+Stylist = (function() {
+ function Stylist() {}
+ Stylist.prototype.styles = {};
+ Stylist.prototype.decorate = function(target, options) {
+ var key, value, _ref;
+ if (!target) {
+ return this.styles[options.style];
+ }
+ _ref = this.styles[options.style];
+ for (key in _ref) {
+ value = _ref[key];
+ if (options.override || !target[key]) {
+ target[key] = value;
+ }
+ }
+ return target;
+ };
+ return Stylist;
+})();
+if (!exports) {
+ exports = {};
+}
+exports.Stylist = Stylist;
+```
+
+### specを作成
+
+```
+# cat spec/stylist_spec.js
+var Stylist = require('lib/stylist').Stylist;
+
+describe('Stylist', function() {
+ beforeEach(function() {
+ this.stylist = new Stylist;
+ this.stylist.styles["normal"] = {
+ width: '50',
+ height: '100'
+ };
+ this.stylist.styles["double height"] = {
+ width: '50',
+ height: '200'
+ };
+ });
+ describe('オブジェクトをデコレートした場合', function() {
+ it('オブジェクトに指定されたスタイルを付与すること', function() {
+ var obj = { name: 'マネキン' };
+ this.stylist.decorate(obj, {
+ style: "double height"
+ });
+ expect(obj.width).toEqual('51');
+ expect(obj.height).toEqual('200');
+ expect(obj.name).toEqual('マネキン');
+ });
+ describe('オブジェクトにスタイルと同名のプロパティがあった場合', function() {
+ it('プロパティを上書きしないこと', function() {
+ var obj = {
+ name: 'マネキン',
+ width: '1000'
+ };
+ this.stylist.decorate(obj, {
+ style: "double height"
+ });
+ expect(obj.width).toEqual('1000');
+ expect(obj.height).toEqual('200');
+ expect(obj.name).toEqual('マネキン');
+ });
+ it('上書きフラグが立っていればプロパティを上書きすること', function() {
+ var obj = {
+ name: 'マネキン',
+ width: '1000'
+ };
+ this.stylist.decorate(obj, {
+ style: "normal",
+ override: true
+ });
+ expect(obj.width).toEqual('50');
+ expect(obj.name).toEqual('マネキン');
+ });
+ });
+ });
+});
+
+```
+
+これで、jenkins,docker,js,unitテストの準備が完了!
+
+## jenkinsでjobを実行
+
+http://localhost:8080/job/docker_test/
+を開いて、左カラムのビルド実行を押下
+するとテストが走ります。
+左下に結果が表示されます。
+
+## おわりに
+
+今回は、ワークスペースにjs,unit testファイルを事前に準備しましたが
+gitrepositoryを定義して、jobが走るごとに、checkoutしてきて
+テストする。とすると
+なんかCIぽくなります
+
+今回は、dockerを使って、テストをするまでだったので
+そういったところは、省きましたが次回、テスト部分をもっと書いていきたいです。