subtitle

RaiseTechの各種コースをはじめとしたイロイロな学習の記録

Serverspecでテストコードを書いてみる:その2

Serverspecでの1回目のテストでは、mysqlに関するテストが上手くできなかったので、今回はちょっと試してみたいことがあったので、「Serverspecでテストコードを書いてみる」2回目。


気になっていることというのは、EC2にMySQLサーバーを入れて起動させた時のmysqlに関するテスト結果がどうなるのか見てみたい!

・・・という興味である(想像が苦手なので、実際にやってみてこの目で確かめたい!)


色々ごにょごにょしてみたいので、新しくテスト用にRailsアプリを作成することにした。

※これまで作成してきたRailsアプリは、データベースがデフォルトのSQLite3、もしくは、あとからSQLite3→MySQLに変更したパターンだったので、初めからデータベースをMySQL指定で作成してみたかった、という意図もある


それでは、早速EC2上にServerspecのテストを実施するために、新規でRailsアプリを作成する。

※ちなみに、本環境はAWS環境構築2で手動で作成したEC2を使用しており、すでに一度Railsの環境構築をしているので、そこそこ必要なものはインストール済みとなっている。



Railsアプリの新規作成

データベースをMySQLに指定して、Railsアプリを作成

rails new spectest_apl -d mysql


spectest_aplフォルダができた


GemFileを確認する

あれ?rubyのバージョンが2.7.2なのにmysql2がインストールされていることになっている??


前に、あとからインストールしようとして、あんなに苦労したのに・・・。謎すぎる。

そのからくりは後で調べるとして、とりあえず本来の目的地に向かおう。


database.ymlを確認する

config\database.ymlを開く

データベースがmysql2になっていることを確認。(とりあえず先に進みたいので権限設定などはあえてせず、そのまま突っ走る!)



MySQLにログインする

mysql -u root -p


むむ?!エラーが出た。

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)


ソケットファイルがないよ、ということらしい。

調べてみると、ソケットとは、プロセスやネットワークの間の通信の仕組みのことで、MySQLはソケットを通じてサーバーとクライアントが接続されるらしい。

つまり、このソケットファイルを通じて、MySQLのサーバーとクライアント間でやり取りしたいのに、そのファイルがないよ、というお叱りと言うことか。


確かに、確認してみると、そんなファイルはない。(そもそも、mysqlフォルダがないわw)


psコマンドで起動確認してみると、起動してない。

ps aux | grep mysqld


通常、mysqld(MySQLデーモン本体)が起動するときに、ソケットファイルを作成するらしいので、そもそもMySQLサーバーが起動してないから、ソケットファイルができないんじゃなかろうか。


じゃあ、MySQLサーバーはどうやったら起動するのーーーー!?

・・・これについては、どハマりしたので、別記事にまとめた

MySQLサーバーをインストールして使えるようにするまでの一連の作業をまとめたので、そっちを参照のこと。



~ 2日後 ~



Serverspecでの自動テスト再び

まあ、色々あーだこーだやって、悩みぬいた末、テストコード完成!

require 'spec_helper'
# 1
describe port(3000) do
  it { should be_listening }
end
# 2
describe command('rbenv -v') do
  its(:stdout) { should contain('1.1.2') }
end
# 3
describe package('rails') do
  it { should be_installed.by('gem') }
end
# 4
describe package('git') do
  it { should be_installed }
end
# 5
describe package('nodejs') do
  it { should be_installed }
end
# 6
describe package('yarn') do
  it { should be_installed }
end
# 7
describe package('mysql-community-server') do
  it { should be_installed }
end
# 8
describe service('mysqld') do
  it { should be_enabled }
  it { should be_running }
end


rake spec実行結果

Port "3000"
  is expected to be listening

Command "rbenv -v"
  stdout
    is expected to contain "1.1.2"

Package "rails"
  is expected to be installed by "gem"

Package "git"
  is expected to be installed

Package "nodejs"
  is expected to be installed

Package "yarn"
  is expected to be installed

Package "mysql-community-server"
  is expected to be installed

Service "mysqld"
  is expected to be enabled
  is expected to be running

Finished in 0.53112 seconds (files took 0.37901 seconds to load)
9 examples, 0 failures


テストコード全部Passできた!


分かったこと

serviceは、Linuxにおけるサービスやデーモンのことだった。

分かる人には当たり前のことなのかもしれないが、一般人にとってはサービスは一般用語のサービスとしてしかとらえられないのではないだろうか・・・。


この括弧の中のサービスには、何を入れたらいいんだろうって思ってたw


前回上手くいかなかったのは、そもそもMySQLサーバーがインストールされていなかったということもあるけど、mysqlじゃなくて、デーモンであるmysqldを指定しなければいけなかったのだ。


また、パッケージコマンドでmysqlのテストが上手くいかなかったのは、パッケージ名の指定の仕方がまずかったから。

Failedになる例↓

describe package('mysql') do
  it { should be_installed }
end

mysql-community-clientとか、mysql-community-commonとか、パッケージ名を正しく書かないとダメ

・・・ということだった。


なんか、ササッと終わらせる予定だったのに、びっくりするぐらい理解するのに時間がかかってしまった・・・。

でも、今回のハマりのおかげで、かなりいろんなことが結びついてきた。

結果オーライと言うことにしておく。