RSpec,Ruby

こんにちは、しきゆらです。
今回はRSpecで特定の場合だけ動く・動かないようなテストを書く方法を知ったのでメモしておきます。

やりたいこと

ログイン周りのテストをCIで実行したくない

書いていたコードとしては、Seleniumを使ってWebサービスのテストを書いていました。
諸々のテストはいいんですが、ログイン周りのテストは2段階認証などがあるため、Waitをかけて人の手で操作していました。

このRSpecをCI上で動かそうとしたとき、ログイン周りだけは止めたい!
というのが一番初めにあったやりたいことでした。

特定のクラスを継承している場合は実行したくない

合わせて、コードの中で特定のクラスを継承している場合のみこのテストを実行したい、ということもありました。
RSpecはテストを共通化する仕組みがあるので、それを使ってテストコードを共通化していたのですが
一部共通化していたテストの中で、ちょっとまずい事態が出てきました。
上記に関連してSelenium周りなんですが、Seleniumを使うクラスとSeleniumを使わないクラスが出てきたことで共通化していたテストの一部がSeleniumを使わないクラスでは必要なくなるということが起きました。
共通化していた部分を分けてSelenium用の共通コードとSelenium使わないクラスの共通コードに分ければいいんでしょうが、両方とも分類的には同じくくりなので名前を分けるだけだと、名前が似てしまってごちゃっとしてしまいそうでした。

これを回避するために、共通化しているSpec側で実行されているクラスを判定して、必要ない場合は実行しないような世界を作りたかったんです。
こちらも併せて方法が分かったのでメモしておきます。

Linux,Windows,環境構築

こんにちは、しきゆらです。
今回は、MySQLをまっさらな状態からインストールして最初にはまるであろうルートパスワードの設定方法で詰まったのでメモしておきます。

毎回MySQLの初期ルートパスワードで詰まる

これまで、5.xのころからMySQLさんを使ってきましたが、バージョンの違いなのかディストリビューションごとの差異なのかはわかりませんが、初期状態のルートパスワードが変わります。
パスワードなしでログインできたり、どこかにあるログファイルにかかれていたり、いくつかバリエーションがあるようです。

今回、MySQL8.xをインストール後にルートユーザとしてログインしようとしてもログインできませんでした。
パスワードなしでアクセスしても怒られ、ログがそもそもどこにあるのかわからず完全に詰んでいました。
そんな中、過去の記憶を掘り起こしたところ、MySQLの初期化コマンドでルートパスワードを設定していたことを思い出しました。
secure_mysql_installationコマンドです。

Ruby

こんにちは、しきゆらです。
今回は、Rubocopの更新を追っていたときに初めて知ったことをメモしておきます。

Rubocopさんは、Rubyを書く方は大半使っているのではないか、と思われる静的コード解析ツールです。
設定により、メソッドの長さやネストの深さなどを制限することで読みやすいコードを書く手伝いをしてくれる頼もしいツールですね。

そんなRubocopさんですが、先日0.90.0がリリースされました。
使っているGemの更新履歴をある程度追っているため、更新内容を確認していたところ今回の更新でも新しい項目が追加されていました。
それが、Lint/UselessMethodDefinitionです。

There are at least 2 cases:
・empty constructors – this may be just overriding parent’s constructor, but this is bad anyway
・methods just calling super

https://github.com/rubocop-hq/rubocop/issues/8472

ということで、空のinitializeメソッドやsuperしか呼び出していないメソッドを怒ってくれるというものです。
内容的には妥当なcopではないかと思います。
必要ないものは書くべきではないですね。

Ruby

こんにちは、しきゆらです。
今回は、タイトル通り`URI.join`の挙動で詰まったのでメモしておきます。

URI.joinとは

join(uri_str, *path) -> object
文字列 uri_str と path … を URI として連結して得られる URI オブジェクトを返します。

https://docs.ruby-lang.org/ja/latest/method/URI/s/parse.html

ということで、URIの文字列にpathを良しなに結合してくれるメソッドです。
しかし、単に`/`を付けるだけの挙動をしているわけではありませんでした。

Windows,環境構築

こんにちは、しきゆらです。
今回はWindows用のランチャーソフトの「Keypirinha」を紹介します。

私は、Win -> Mac -> Win & Macと使うOSが変化しています。
少し前まではWindowsは開発には向かないと思っておりWin上にLinuxを仮想環境に立ち上げて利用したりもしていました。
Windowsでコード書くのがつらすぎてMacも利用していました。

今となっては、ターミナル環境も良くなり、WSLというほぼLinuxと同等環境が仮想的ではなく直接Windows上で動くようになっているため、あえて別環境を持つ必要はないかな、と思っている今日この頃です。

しかし、Mac環境にあった便利機能がWindowsになくて微妙につらいことがあります。
AlfredさんやSpotlightが良く上げられるものではないでしょうか。
調べてみると、windows上でも似たようなことができるアプリが公開されていました。
そこで、今回はSpotlight風軽量ランチャーである「Keypirinha」を紹介します。
(Windowsをクリーンインストールするたびに、名前なんだっけ・・・となるのでそれ対策でもあります)

Ruby

Rakeといえは、RubyでかけるMakefileのようなもの。
しかし、私はMakefileを書いたことがないので、単にRubyでちょっとしたタスクをコマンドとして呼び出せる便利ツールくらいに思っている。

このRakeだが、タスクの追加方法や設定等について調べて出てくるのはどうしてもRails環境が多い。
railsは内部的にはRakeを呼んでいる(?)っぽいので、しょうがないといえばしょうがないが、素のRubyでRakeタスクを作って実行する方法をメモしておく。

準備

Rakeといっても、Gemとして配布されている。
default gemとしてすでに入っているとは思うが、必要であればGemfileに入れてあげるとよい。

gem "rake"

そしてbundle install
ほかのGemと同じなので困ることはないはず。

Rakefile

基本的にはRakefileにタスクを追加してあげればよい。
Railsと同じようにlib/tasks/*.rakeという感じでタスクを個別のファイルで定義したい場合はRakefileに以下のように書いてあげればよい。

Dir["./lib/tasks/*.rake"].sort.each {|file| load file}

注意としては、requireではなくloadということ。
Railsさんも、内部でload使っているし、そういうことです。
(#TODO: 理由は後ほど調べる)

個別のタスク

個別は、普通にタスクを定義してあげればよい。

 namespace :task do
   # シンプルなタスク
   desc "test"
   task :test do
     puts "test task!"
   end
   
   desc "引数ありの場合"
   task :arg_task, [:hoge] do |_, args|
     puts args[:hoge]
   end
 end

ファイル名ごとにnamespaceを切ってあげると、タスク名に困ることはなくなると思います。

そして、rakeタスクを実行するときに引数を渡して実行することができます。
例えば、bundle exec rake task:arg_task[hogehoge]とするとコマンドラインから値を渡すことができます。

二つ目のタスクの通り、タスク名の後に配列で引数の名前を付けてあげる。
そしてブロックに2つの変数を作ってあげて、二つ目の変数に引数が入ってくるので指定した名前でアクセスすると取得できます。

まとめ

今回は、非Rails環境でRakeタスクを追加する方法をメモしておきました。
覚えておくと、ちょっとしたコマンドをRuby/Rakeで作れるので便利です。

RakeタスクはRails環境でしか使ったことがなかったので、素のRubyでも使えることが分かったのと、
ついでに実行時に引数を渡す方法もわかったので、簡単なコマンドをRakeで実装できるようになりました。
Rubyで良しなにスクリプトを書いた後、コマンドっぽく実行したいときに使えそうですね。

今回はここまで。
おわり。

Windows,プログラミング,環境構築

こんにちは、しきゆらです。
今回は、何度も書いていますがUbuntu20.04にてPID1をSystemdにする方法を改めてメモしておきます。

というのも、最近Windowsをクリーンインストールしたので改めて環境を構築していたんですが、
前回メモした内容ではうまくいかなかったからです。
何か変化したのかしら。

というわけで、何度かメモしていますが改めてメモしておきます。
なお、以下が関連する過去記事です。

Ruby,Windows,環境構築

こんにちは、しきゆらです。
ちょっと前まで気が狂うかと思うくらい雨続きでしたが、今度は溶けるほどの暑さにやられています。
良しなに均していただけないものかと毎年思っています。

昔、【Ruby/Win】Windows上のAtomからWSL2上のrubocopを利用するという記事にて、Windows上のAtomからWSL上のRubocopを使って文法チェックを行う方法をメモしました。
しかし、現在ではうまく動かないようです。
そこで、執筆時現在動作する方法をメモしておきます。

linter-rubocopにて以下のように指定してあげるだけ。

これにて、設定完了。
では動作確認してみます。

きちんと動いてくれているようです。
これにて、Windows上にRuby環境を構築せずともWSL上のRubocopを使ってチェックすることができるようになりました。

今回は、短いですがWindowsのAtomからWSL上のRubocopを使ってコードチェックを行う方法を改めてメモしました。
同じように設定すれば、ほかのツール等も利用できるのではないかと思います。

それでは、今回はここまで。
おわり

Ruby,読書

こんにちは、しきゆらです。
今回は、人生初の洋書である「Effective Testing with RSpec 3」を購入したので、洋書ってどうなの?というところをメモしておきます。

購入した本

購入したのは、先述の通り「Effective Testing with RSpec 3: Build Ruby Apps with Confidence」です。

数年前に発売されたRSpecの本です。
RSpecの書籍といえば、長年参照されていたのは「The RSpec Book」ではないでしょうか。

これは、日本語で読める数少ないRSpecの書籍ですが、内容としてはRSpecよりもCucumberなどの別ツールの話が多いことや、バージョンが古いなどの理由で、純粋にRSpecについてきちんと学ぼうと思って買うにはちょっとなぁ、という印象でした。

そんな中で発売された「Effective Testing with RSpec 3: Build Ruby Apps with Confidenc」。
こちらは英語ではありますが、RSpec 3で書かれており、純粋なRSpecについての説明がメインなのでRSpecを学ぶ上ではよさそうな本です。

しかし、洋書ということでハードルが高そう。
私もそう思っていました。
そんな中で、なぜ買ったのかをいかにまとめておきます。

洋書を買ってみて

そもそも、洋書とはいえ今回購入したのはRuby/RSpecの本です。
小説などと違い、スクリプトが読めればたいていの内容は理解できるはずです。
そんな軽いノリで買ってみました。

あとは、以下のブログを読んだから。
【洋書Q&A】どうやって洋書を読んでるの?どれくらい時間がかかるの?という質問に答えてみた – give IT a try | https://blog.jnito.com/entry/017/09/12/072903

正直に言うと、翻訳されたら買おうと思っていたのですが一向にそのような話が出てこないので早く読みたい、というモチベが勝ってしまった形です。

実際に読んでみると、英語が苦手な私でもある程度雰囲気で理解できている印象です。
要所でサンプルコードを提示してくれているので、単語がわからないから理解できない、ということはあまりありません。
単語的にも比較的簡単なほうなのではないでしょうか。

まだすべてを読み切ったわけではないので、内容的な話は控えますが
洋書を読むというハードルは思っているより低いようです。
洋書を買うという心理的なハードルを越えることができれば、意外とすんなり進んでいけそうな印象でした。

まとめ

今回は、人生で初めて洋書を買ったので、買うまで思っていたことや読んだ印象をさっくりメモしておきました。
洋書に手を出そうかと考えている方の参考になれば幸いです。
(そもそも、情報がほぼないですが・・・)

今回は、ここまで。
おわり

git

こんにちは、しきゆらです。
今回は、タイトルの通りGitにファイルを置いておきたいが、そのファイルの変更自体は管理しなくてよい場合にどうすればいいかをメモしておきます。

どんな状況か

そもそも、なんでこんなことが必要になったのかを簡単に書いておきます。
状況としては、Jiraにある未完了チケットを取得し、特定のものをチャットに飛ばす、というスクリプトを作っていました。
この時、前回実行時に取得したチケットのIDを保持するようにしていました。
これは、定期実行で動かしていて、最初に実行したときに未完了のものが、次に実行したときも未完了なチケットが通知されないようにするためのものです。
(そもそも、このチケットIDを記録するファイルは、もしかしたらGitに置いておかなくてもよいかもしれません)

さて、このような状態でチケットIDを記録していたファイルは、そこに存在してくれていればOKであり
ファイルの中身が実行されるたびにgitの変更差分として出てきてしまいます。
これは鬱陶しいですよね。
これを回避する方法をメモしておきます。

対応策

調べてみると、Gitさんは管理下にあるファイルの更新を無視するような設定をいくつか用意してくれていました。
ドキュメント:Git – git-update-index Documentation | https://git-scm.com/docs/git-update-index

assume-unchangedskip-worktreeというものが、この状況に使えそうなものです。
それぞれの違いとしては、正確にはドキュメントを参照してほしいのですが、印象としては以下のように感じました。

  • assume-unchanged
    • マージ、リセット等するとき、リポジトリの状態が正
  • skip-worktree
    • マージ、リセット等するとき、手元の状態が正

今回の状況的には、リポジトリにおいてある内容に特に重要な意味はなく、手元の環境でIDがガシガシ更新されているので
手元の状態を保持してくれるskip-worktreeを設定しました。
git update-index --skip-worktree ファイル名

これにて、手元にあるファイルの更新をGit側で無視しつつ、マージ等で変更がある場合に上書きされないようにできました。
解決です。

検索時のメモ

今回、このような状況で検索するときになんというキーワードで検索すれば出てくるのかわかりませんでした。
そこで、適当に英単語を並べていく作戦をとってみました。
gitkeepで空フォルダをGitの配下にすることを知っていたので、「gitkeep file」とキーワードを検索欄に入力してみました。
すると、「gitkeep file but ignore changes」とサジェストしてくれました。
まさにほしい情報はこれです。
さすがはグーグル先生、感謝です。

何が言いたいかというと、ほしい状況は分かっているが、それをどう探せばいいかわからないとき
それっぽい単語をGoogle先生の検索欄に並べると、もしかしたらサジェストしてくれるかもしれません。
困ったときは、それっぽい単語をGoogle先生に並べてみましょう。

 

まとめ

今回は、Git管理下にあるファイルの変更を無視する方法をメモしました。
やはりというかなんというか、Gitさんはきちんとこういう状況の設定も用意してくれていました。

今回は、ここまで。
おしまい