柴ブログ

プログラミング奮闘記

フィヨルドブートキャンプを卒業した。

はじめに

僕はフィヨルドブートキャンプというプログラミングスクールを2020年11月18日に卒業しました。

同年11月24日から都内の自社開発企業でRailsを扱うエンジニアとして働いています。

卒業してからバタバタしていましたが、少し落ち着いてきたので卒業エントリを書きます。

ちなみに僕のことや、プログラミング学習のきっかけ、フィヨルドブートキャンプに参加した経緯・学んだことは別記事で書いてますので本記事では触れません。 詳細は下記。

shibaaa647.hatenablog.com

shibaaa647.hatenablog.com

卒業までどれぐらいかかったか

フィヨルドブートキャンプに参加したのは2019年10月13日からなので、約1年間かかりました。

と言っても参加してすぐの頃はまだ前職の仕事をやりながらだったのであまり学習の進捗はなく、前職を辞めた2020年2月頃から本格的に学習を進めていきました。

時間数で数えると1099時間かかってました。 (フィヨルドブートキャンプ内の日報で計算)

日報を書き忘れた日も結構あったのでなんだかんだで1200時間はやっていたと思います。 我ながら長いことやっていたんだとしみじみ。

卒業までを振り返って

一言で言うと、本当に長かったw

先日フィヨルドブートキャンプ内で僕の卒業式をして頂いた際、コメントを求められて咄嗟に出たのも「長かった」でした。

1年近く色々我慢しながらやってきたのでもう少しエモい事を言えるかと思っていましたが、全然出てこなくて自分でも笑いました。

ですが後々冷静に考えてみたら、この1年間はやりたくて無我夢中でやってきたから自分の中では当たり前のことというか、特別な事をしたつもりがなかったからだと気付きました。

また、フィヨルドブートキャンプはスクールというよりコミュニティに近いので、わいわいやってたから楽しんでできた、というのもあると思います。

どう変わったか

学習に前向きになった

前職も常に専門的な内容をインプットする必要があったので、継続したインプットは得意な方でしたが、プログラミングを学習するにつれてどんどん学習に前向きになっていきました。

新しい事を覚える、それにより新しいことができるようになる、それが目に見える形になる、という一連のサイクルにより学習意欲が高まりました。

Webの基礎を学べた

Web開発を目的にするプログラミングスクールなのでそりゃそうだ、という感じですが本当に幅広く学べたと思います。

仕事に必要なのもそうですが、普段の生活でもWebは身近な存在なので、その基礎を学んだことで見方が変わりました。

どんなURLになっているか、どういうデザインをしているのか、など色々なところを見るようになりよりWebに関わるのが楽しくなりました。

できないことや分からないことへの耐性

これはプログラミングを学習していく上で、何度も壁にぶち当たったおかげで耐性というか対処法が身につきました。

なんでも新しいことは「できない・分からない」の連続で全然前が見えなくなります。

それでも少しずつ動いていると段々わかってきて、気づけば「なんであんなに悩んでいたんだ?」といつも思います。

この経験が何度もあり、新たに何かにトライしようとして「できない・分からない」があっても、あまり辛くならず色々アプローチができるようになりました。

あとは「そのうち分かるようになる」と根拠のない自信を持つようになりました。

これから

現在は冒頭でも述べたように主にRailsを扱うエンジニアとして働いています。

とはいえまだ研修期間で実際のサービス開発に関われていません。

今は基礎の復習と会社の雰囲気や人を知るという期間だと思い焦らずじっくりやっていこうと思います。

どういうエンジニアになりたいか、と考えてもまだそんな壮大なことは考えられません...。 目の前の事を一つ一つこなしていき成長していきたいと思います。

新たな人生のスタートを切ったので不安と期待でいっぱいですが、何事も楽しんでいければいいなと思います。

最後に

フィヨルドブートキャンプにいらっしゃるメンターやアドバイザーや生徒や卒業生の方々、ありがとうございました。

今後もコミュニティとしてゆるくお付き合いできればと思います。

f:id:shibaaa647:20201209194110p:plain
卒業Tシャツと修了証明書

RSpecでWebMockとVCRを使ったテストを書く

はじめに

表題の通り、RSpecでWebMockとVCRを使ったテストを初めて書いたのでその学びをまとめます。

Twitter APIを利用したRailsアプリでの実装。

環境

各gem

WebMock

外部APIを叩くアプリにおいて、テストを書く際に擬似的なAPIのレスポンスを作成し、そのレスポンスを元にテストを実行します。

その際のAPIレスポンス(モック)を定義できるgem。

VCR

上記のモックは基本的には自分で書いて用意しますが、その手間を省けるgem。

モックデータが存在していなければ、実際にAPIを叩いてそのリクエストとレスポンスをYAMLファイルとして自動で作成してくれる。

以降はそのYAMLファイルをモックとしてテストを実行できる。

セットアップ

Gemfileに以下を追加しbundleコマンド実行。

gem "webmock"
gem "vcr"

spec/rails_helper.rbに下記を追加し、RSpecでWebMockを使えるようにする。

require "webmock/rspec"

VCRの設定

spec/spec_helper.rb にVCRの設定を書いていきます。

require "vcr"
# ...

VCR.configure do |c|
  c.cassette_library_dir = "spec/vcr"
  c.hook_into :webmock 
  c.allow_http_connections_when_no_cassette = true
  c.configure_rspec_metadata! 
  c.ignore_localhost = true 
  c.ignore_hosts "chromedriver.storage.googleapis.com" 
  c.default_cassette_options = {
    record: :new_episodes, 
    match_requests_on: [:method, :path, :query, :body] 
  }
end

VCRはモックデータを「カセット」と呼ぶので、cassette = モックデータであり、カセットを使用することを「再生」と呼んでいます(シャレだ...)。

各設定については以下の通り。

  • cassette_library_dir = "spec/vcr"...カセットを保存するルートディレクト
  • hook_into :webmock...利用するモックライブラリを指定
  • allow_http_connections_when_no_cassette = true ...VCRを使わない場所ではHTTP通信を許可する
  • configure_rspec_metadata!...RSpecとの連携
  • ignore_localhost = true...ローカルホストのリクエストを無視し、Capybaraのリクエストに干渉しないようにする
  • ignore_hosts "chromedriver.storage.googleapis.com"...指定したホスト(chromedriver.storage.googleapis.com)へのリクエストを無視する
  • record: :new_episodes ...カセットがなければAPIをコールしてそれを記録する
  • match_requests_on: [:method, :path, :query, :body] ...カセットを引き当てる条件。今回はリクエストのメソッドとパス、 クエリそしてリクエストボディが一致するカセットを再生するという意味。

テストコードでVCRを使用

外部APIへのリクエストが生じるテストコードでVCRを使用するには以下のようにカセット名を指定します。

# テストコードを一部抜粋
describe "記事一覧", vcr: "twitter_api_response" do
  it "user_1の記事が表示される" do
    visit articles_path
    expect(page).to have_content "2020-10-17"
  end
end

もしくは以下のような書き方の方が明示的で読みやすい。

describe "記事一覧", vcr: { cassette_name: "twitter_api_response" } do
  it "user_1の記事が表示される" do
    visit articles_path
    expect(page).to have_content "2020-10-17"
  end
end

これでテストを実行すると、指定したカセットが存在していなければAPIを叩いてそのレスポンスをYAMLファイルで保存してくれます。

今回の場合はspec/vcr/twitter_api_response.yml が保存されます。

次またテストを実行するとこのファイルをモックとして参照してテストを実行してくれます。便利。

モックに秘密情報を載せたくない場合

今回はTwitter APIを叩いてテストを実行していますが、保存されたカセットにはリクエスト時のAPI Keyとアクセストークンが平文で記載され保存されていたので、これをいい感じにマスクしたい。

VCRの設定に以下を追記する。

# spec/spec_helper.rb

VCR.configure do |c|
# 省略
  c.filter_sensitive_data("<API_KEY>") { ENV["TWITTER_API_KEY"] }
  c.filter_sensitive_data("<ACCESS_TOKEN>") { ENV["ACCESS_TOKEN"] }
end

隠したい文字列(API Keyやアクセストークン)を完全一致で指定します。今回の例でいうとENV["TWITTER_API_KEY"] の部分。

実際にはこの環境変数API Keyを格納し、この設定上でも環境変数で指定しておく。

こうしておくとカセットに平文で乗っていたAPI Keyそのものが"<API_KEY>" という文字に置き換わる。

カセットを一度削除してからもう一度テストを実行すると上記の設定が反映されたモックが作成される。

参考

rails newコマンド実行時のオプション

はじめに

rails newコマンドを叩く機会は頻繁にはないが、いざ実行する時に「どんなオプションつけてたっけ?」となるのでメモ。

$ rails new hogehoge -TC -d postgresql --skip-action-mailbox --skip-turbolinks --skip-active-storage --skip-action-text --webpack=vue

オプションの一部補足

  • T...テストファイルのスキップ。minitest以外のテストを使用する場合は付ける。

  • C...--skip-action-cableエイリアス。Action Cableが不要なら付ける。

  • --webpack=vue... RailsとVueを連携したい場合、このオプションを付けておけば自分で設定する手間が省ける。その他指定できるフレームワークはreact, angular, elm, stimulusがある。例えばreactを指定するなら--webpack=reactとなる。