KAROUSHI -Japanese Engineer Blog-

コボルドからドラゴンへ -Kobold to Dragon-

システムエンジニアのブログです。サイト名は「雑魚キャラからボスキャラへレベルアップしたい!」という思いを込めて命名しました。自分はやっとリザードマンになったくらいです。

Windows10にRubyをインストールする手順

Javaが有償化するので他の言語を学ぼうと思いたり、PythonRuby、Goどれがいいかなと調べてみたらRuby on Railsというフレームワークが便利そうなのでひとまずRubyをインストールしてみました。(Ruby on Railsはまた別途)
というわけで今日はRubyをWindows10にインストールしてみます。

環境

OS:Windows10
RubyRuby+Devkit 2.5.1-1 (x64)

Rubyをインストール

まずは以下からRuby+Devkit 2.5.1-1 (x64) をダウンロードします。
https://rubyinstaller.org/downloads/
f:id:jainders:20180521014342j:plain

"I accept the Licence"を選択して"Next"を押します。
f:id:jainders:20180521014345j:plain

"Use UTF-8 as default external encording."にチェックを入れて"Install"を押します。
他はそのままでOKです。
f:id:jainders:20180521014348j:plain

そのまま"Next"を押します。
f:id:jainders:20180521014351j:plain

インストール中です。完了するまで待ちます。
f:id:jainders:20180521014354j:plain

そのまま"Finish"を押します。
f:id:jainders:20180521014357j:plain

以下のような画面が立ち上がるのでそのままEnterキーを押して続行します。
f:id:jainders:20180521014401j:plain

そのままEnterキーを押して終了します。
f:id:jainders:20180521014404j:plain

Windowsの検索から"Intaractive Ruby"を起動すると以下のような画面が立ち上がります。
f:id:jainders:20180521014407j:plain

またコマンドプロンプトで実行するためにはWindows環境変数を編集を起動して、ユーザ環境変数の”Path”にRubyがインストールされたディレクトリを設定します。(今回は”C:\Ruby25-x64\bin”)
その後、コマンドプロンプトを起動して"ruby -v"を実行して動作確認してみましょう。
バージョンが表示されれば問題ありません。
f:id:jainders:20180522012753j:plain

以上でRubyのインストールは完了です。

WindowsにOpenJDKをインストールする手順

2018年9月のJava11からOracleJDKが有償化され、今後は有償プランか、OpenJDKへ移行になると思います。
個人利用する方はOpenJDK一択になるため、今回Windowsのインストールを試してみました。

OpenJDK(RedHat)のダウンロード

以下RedHatからOpenJDK(Windows Installer)をダウロードしてください。
OpenJDK Download | Red Hat Developers

ダウンロードのためにはRedHatアカウントが必要です。
f:id:jainders:20180415192957p:plain

OpenJDK(RedHat)のインストール

OpenJDKのインストールはJavaFXが必要な場合、インストール時にチェックしてください。
あとは環境変数のPathにOpenJDKのjava.exeが存在するディレクトリを指定すれば動きます。
ただし、OracleJDK8以降が事前にインストールされていた場合、環境変数JAVA_HOMEやPathを設定するだけではないので口述します。

環境変数の設定

Windows検索欄に"システムの詳細設定の表示"と入力→「環境変数」を押す。

OracleJDK8以前と以降で参照する環境変数が異なります。
OracleJDK8以前:JAVA_HOMEにパスを設定
OracleJDK8以降:システム環境変数の"Path"の"C:\ProgramData\Oracle\Java\javapath"

それぞれ以下のように対策します。
OracleJDK8以前:JAVA_HOMEのパスを変更
OracleJDK8以降:システム環境変数の"Path"の"C:\ProgramData\Oracle\Java\javapath"の優先度を下げ、それより上にOpenJDKのディレクトリを設定する。

右側の「下へ」を押して"C:\ProgramData\Oracle\Java\javapath"の優先度を下げてください。
またOpenJDKのディレクトリを直接入力せず、「%JAVA_HOME%\bin」を入れてJAVA_HOMEにJDKディレクトリを入れると、今までと同様に運用できる。
f:id:jainders:20180415212510p:plain

Grailsで起動時のポート番号を変更

Grailsでrun-appを実行するとデフォルトではポート番号:8080で起動します。
このポート番号を変更する方法がいくつかあったので整理してみました。

grails> run-app
・・・中略・・・
Grails application running at http://localhost:9090 in environment: development

目次

■application.ymlに記述
application.ymlの冒頭に以下を追加する。

---
server:
    port: 9090

■起動コマンド実行時にオプションで指定
起動コマンド実行時にportオプションで番号を指定する。

>grails run-app -port 8090

環境変数で指定
環境変数GRAILS_OPTSに"-Dserver.port"に指定する。

Windows10のpowershellを使ってる場合、set-itemで環境変数に設定できる。

>set-item env:GRAILS_OPTS -value "-Dserver.port=8100"
>get-item env:GRAILS_OPTS

Name                           Value
----                           -----
GRAILS_OPTS                    -Dserver.port=8100

IntelliJ IDEAでPlantUMLプラグインをインストールしてリアルタイムにUMLをプレビュー表示する

UMLツールの代表だったastahが有料になってしまったため代替を探していたら、PlantUMLという無料UMLツールを見つけたので紹介します。
PlantUMLを使うことによって以下のようなメリットがあります。
メリット:

  1. テキストで保存できるためGitやSVNリポジトリ管理できるので差分確認が可能
  2. 図の見栄えの統一
  3. シーケンス図やクラス図への追加削除が容易
  4. 無償

目次

PlantUMLプラグインのインストール

IntelliJ IDEAを起動してメニュより「File」→「Settings」→「Plugins」の画面の下部にある「Browse repositories...」を押下します。そこで開いた画面上部の検索ボックスに"PlantUML"と入力すると、"PlantUML integration"というプラグインが出てくるので「install」を押してインストールしましょう。
インストールが完了したら、IntelliJ IDEAを再起動して有効化します。
f:id:jainders:20180216153840p:plain
f:id:jainders:20180216153846p:plain

Graphvizをダウンロード

図の表示にはGraphvizを使用します。以下からサイトにアクセスしてstable版(msiまたはzip)をダウンロードしてきます。
http://www.graphviz.org/download/
ダウンロードしたら解凍して"C:\Program Files (x86)\graphviz-2.38\"のように配置します。
f:id:jainders:20180216154117p:plain

IntelliJ IDEAでGraphvizの設定

メニュより「File」→「Settings」→「Other Settings」を選択すると画面に"PlantUML"のリンクがあるのでクリックします。
Graphviz dot executable」の入力欄に先ほど配置したgraphviz配下にあるdot.exeのパスを入力します。
例:C:\Program Files (x86)\graphviz-2.38\release\bin\dot.exe
f:id:jainders:20180216154452p:plain

UMLの作成

適当なプロジェクト上で右クリックして「UML xxxx」を選択して作成します。今回はUML Classでファイル名はSampleClassで決定にします。
f:id:jainders:20180216154504p:plain
するとSample.pumlというファイルが作成され、デフォルトで以下が記述されており、右側に図が表示されます。

@startuml
Alice -> Bob: Authentication Request
Bob --> Alice: Authentication Response

Alice -> Bob: Another authentication Request
Alice <-- Bob: another authentication Response
@enduml

f:id:jainders:20180216154627j:plain

CodeceptionのRESTでsetCookieを実行したい

CodeceptionのRESTでsetCookieをしようとするとsetCookieがないというエラーがでる。こんな感じ。

  [RuntimeException] Call to undefined method ApiTester::setCookie  

よくよく公式サイトを調べてみると、確かにRESTはsetCookieメソッドが存在しない。
REST - Codeception - Documentation

でもRESTでCookieを設定するテストがあるため、どうにかできないか悩んでアレコレやっていたらHelperに自作メソッドを作るしかない!という感じになりました。
が、、、、これも日本語のサイトでドンピシャな内容が全然ないため、すっごい悩んでたら今さっきやっと解決したので載せておきます。

目次

RESTでsetCookieを呼び出す方法

前提

プロジェクト名: api

yamlにHelperを記述

yamlファイルに以下のようににHelperを記述する。(プロジェクト生成時にデフォルトで記載されている)
このHeplerにsetCookieメソッドを作成する。

$ vim tests/api.suite.yml
actor: ApiTester
modules:
    enabled:
        - REST:
            url: http://localhost/
            depends: PhpBrowser
            part: Json
        - \Helper\Api

setCookieメソッドを作成

setCookieメソッドも1から作る必要はありません。getModule()を使えば他モジュールのメソッドを呼び出すことができるようになります。あとはPhpBrowserのものを同じメソッド名でラッパーするだけです。

$ vim tests/support/Helper/Api.php
<?php
namespace Helper;

// here you can define custom actions
// all public methods declared in helper class will be available in $I

class Api extends \Codeception\Module
{
  function setCookie($name, $value) {
    $this->getModule('PhpBrowser')->setCookie($name, $value);
  }
}

クッキーをセットしてGET送信

今回実行する受け入れテストは以下のようなもの。

$ vim tests/api/SampleTestCept.php
<?php
$I = new ApiTester($scenario);
$I->wantTo('perform actions and see result');
$I->setCookie('sessionid', 'el4ukv0kqbvoirg7nkp4dncpk3');
$I->sendGET('/');
$I->seeResponseCodeIs(200);

debugモードで実行してリクエストの中身を確認してみます。

$ php codecept run api --debug
・・・中略・・・
SampleTestCept: Perform actions and see result
Signature: SampleTestCept
Test: tests/api/SampleTestCept.php
Scenario --
 I set cookie "sessionid","el4ukv0kqbvoirg7nkp4dncpk3"
  [Cookie Jar] ["sessionid=el4ukv0kqbvoirg7nkp4dncpk3; path=/; httponly"]
 I send get "/"
・・・中略・・・

念のためnginxのログも事前にログフォーマットで"sessionid"のCookieを表示するように設定しておき、ちゃんと受信できているか確認してみます。
nginxのコンフィグ設定はこんな感じ。

$ sudo vim /etc/nginx/nginx.conf
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" "$cookie_sessionid"';

    access_log  /var/log/nginx/access.log  main;

ログを確認結果。

$ sudo tail /var/log/nginx/access.log 
127.0.0.1 - - [14/Feb/2018:16:37:44 +0000] "GET // HTTP/1.1" 200 3770 "-" "Symfony BrowserKit" "-" "el4ukv0kqbvoirg7nkp4dncpk3"

CodeceptionでREST APIの受け入れテストを作成

CodeceptionではREST APIの受け入れテストも可能ですので紹介します。

目次

REST APIの受け入れテスト手順

プロジェクトの作成

実行ファイルがある場所へ移動して雛型を作成します。そうするとtests配下にapi(任意)のプロジェクトが作成されます。

$ cd Codeception
$ php codecept generate:suite api
Helper \Helper\Api was created in /home/hoge-user/Codeception/tests/support/Helper/Api.php
Actor ApiTester was created in /home/hoge-user/Codeception/tests/support/ApiTester.php
Suite config api.suite.yml was created.
 
Next steps:
1. Edit api.suite.yml to enable modules for this suite
2. Create first test with generate:cest testName ( or test|cept) command
3. Run tests of this suite with codecept run api command
Suite api generated

試しにプロジェクトの実行

runすればすべてのプロジェクトのテストを実行できます。今回はapiのみを実行してみます。
まだ何もシナリオを記述してないのでテスト実施結果は空です。

$ php codecept run api
Codeception PHP Testing Framework v2.3.8
Powered by PHPUnit 6.5.6 by Sebastian Bergmann and contributors.

Api Tests (0) -------------
 --------------------------

Time: 59 ms, Memory: 8.00MB

アクターを記述

プロジェクト作成時に以下のようにアクターが自動生成されます。

actor: ApiTester
modules:
    enabled:
        - \Helper\Api

これを以下のように修正します。
url:接続先
depends: 接続時にPhpBrowserを利用
part: デフォルトはXMLJsonを受け取る。どちらか片方のみしか受け取らない場合、明示が可能。

actor: ApiTester
modules:
    enabled:
        - REST:
            url: http://localhost/
            depends: PhpBrowser
            part: Json

受け入れテスト作成

以下コマンドを実行してapiにCept形式の受け入れテストを生成します。

$ php codecept generate:cept api SampleTest
Test was created in /home/hoge-user/Codeception/tests/api/SampleTestCept.php

$ vim tests/api/SampleTestCept.php

今回はGETでアクセスして、200応答が返ってくることを確認してみます。

<?php
$I = new ApiTester($scenario);
$I->wantTo('perform actions and see result');
$I->sendGET('/');
$I->seeResponseCodeIs(200);

事前にnginxを立てておきます。

$ sudo yum install -y nginx
$ sudo service nginx restart

受け入れテスト実行

ではapiプロジェクトを実行してみましょう。

$ php codecept run api
Codeception PHP Testing Framework v2.3.8
Powered by PHPUnit 6.5.6 by Sebastian Bergmann and contributors.

Api Tests (1) ----------------------------------------------------
✔ SampleTestCept: Perform actions and see result (0.01s)
------------------------------------------------------------------

Time: 80 ms, Memory: 10.00MB

OK (1 test, 0 assertions)

wantToで記述されていた内容が表示されているのが分かるかと思います。
また以下のように「--steps」を付与することで詳細結果を表示することも可能です。

$ php codecept run api --steps
Api Tests (1) ---------------------------------------
SampleTestCept: Perform actions and see result
Signature: SampleTestCept
Test: tests/api/SampleTestCept.php
Scenario --
 I send get "/"
 I see response code is 200
 PASSED 
-----------------------------------------------------

Time: 76 ms, Memory: 10.00MB

debugモードでより詳細に。

$ php codecept run api --debug
Codeception PHP Testing Framework v2.3.8
Powered by PHPUnit 6.5.6 by Sebastian Bergmann and contributors.

Api Tests (1) ----------------------------------------
Modules: REST, PhpBrowser
------------------------------------------------------
SampleTestCept: Perform actions and see result
Signature: SampleTestCept
Test: tests/api/SampleTestCept.php
Scenario --
 I send get "/"
  [Request] GET http://localhost//
  [Request Headers] []
  [Page] http://localhost//
  [Response] 200
  [Request Cookies] []
  [Response Headers] {"Server":["nginx/1.12.1"],"Date":["Wed, 14 Feb 2018 15:50:51 GMT"],"Content-Type":["text/html;charset=UTF-8"],"Content-Length":["3770"],"Last-Modified":["Mon, 11 Sep 2017 19:56:09 GMT"],"Connection":["keep-alive"],"ETag":[""59b6ea59-eba""],"Accept-Ranges":["bytes"]}
  [Response] <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  
  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
      <head>
・・・省略・・・

PHPのテストフレームワークCodeceptionのインストール手順

今回は今はやりのPHPのBDDテストフレームワークであるCodeceptionをインストールする手順を紹介します。CodeceptionはCept/Cestと従来のPHPUnitと同様の形式でテストを記述することが可能です。
本記事の最後でCeptとCestそれぞれの雛型を作成するので違いが良く分かると思います。

目次

Codeceptionのインストール

環境

OS: AmazonLinux

手順

Remiリポジトリを追加する。

$ rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

php-bcmathをインストールする。

$ sudo yum install -y --enablerepo=remi php71 php71-bcmath php71-mbstring

またgitもインストールしておきます。

$ sudo yum install -y git

Codeceptionをインストールする。

$ git clone https://github.com/Codeception/Codeception.git
$ cd Codeception
$ curl -s http://getcomposer.org/installer | php
$ php composer.phar install

codeceptの実行ファイルがある場所で以下コマンドを打つとバージョンとヘルプが表示されます。

$ php codecept
Codeception 2.3.8