明日から使えるテスト技法をざっくり社内で紹介した
弊社では月一で帰社日という全社員が集まるイベントがあります。
そこで有志が発表する枠があるのですが、そのなかでも「基調講演」と銘打ってまあちょっとだけ気合い入れて発表するコーナーがあるのですね。それが今月は僕の番ということで、テスト技法についてざっくり発表してきました。 以下がそのときの資料です。
…正直ざっくりとはいえ結構ボリュームあって規定の時間を大幅にオーバーして喋ってた気がします。
テスト技法と一言に言ってもかなり広くて奥が深い世界で、どこをどう説明しようか悩みました。主に仕事で使いやすいところを選んでみたつもりです。一見すると知ってるよ、という知識かもしれませんがちょっと踏み込むと新しいことが知れてたのしいです。
なんで今テスト技法なの、と思われたかもしれません。 テストってなんか地味なイメージあるけどやっぱりソフトウェアと切っては切れない関係なわけで、どうせテストするならしっかり基礎は押さえておきたいと思って、最近勉強していたのです。 鉄は熱いうちにということで、こうして発表ネタにしたというわけですね。そのかいあって自分自身学んだ知識や不明点が整理できて良かったです。
リソースの制約があってテストは手を抜かざるを得ない場面というのに出会うこともある思うのですが、手を抜くにしても分かった上でやるのとそうでないのとでは違いますよね。どう手を抜くの、どこにリスクを置いてどうカバーするのみたいなことをきちんと考えていきたいものだなーと思っています。
なお
弊社では一緒に働いてくれる仲間を募集中です!
native extension に openssl を使う gem のビルドに失敗するときの対処法
homebrew で openssl をインストールした場合、今までだとbrew link
するだけで特に問題なく使えていたが、最近ではbrew link
ができなくなった。
$ brew link openssl --force Warning: Refusing to link: openssl Linking keg-only openssl means you may end up linking against the insecure, deprecated system OpenSSL while using the headers from Homebrew's openssl. Instead, pass the full include/library paths to your compiler e.g.: -I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib
その結果、 native extension のビルドに openssl を使う gem が正しく include できなくなった。 なので次のように設定した。 (参考: rbenv/ruby-build: Compile and install Ruby)
$ cat ~/.zshrc if [ $(uname) = "Darwin" ]; then export CONFIGURE_OPTS="--with-opt-dir=`brew --prefix openssl`" export RUBY_CONFIGURE_OPTS="--with-opt-dir=`brew --prefix openssl`" fi $ source ~/.zshrc
それでruby再ビルドしたらいけた。
Rails 5.0.1 の変更点で個人的に気になったところ雑まとめ
先日12/21に Rails 5.0.1 が出ましたね。 CHANGELOG をざっと読みながら、個人的に気になったところを雑にまとめます。 雑まとめなので間違ってるかもしれません。正確な情報はリンク先を見てください〜。
3行で
ActionCable
https://github.com/rails/rails/blob/v5.0.1/actioncable/CHANGELOG.md
- Buffer writes to websocket connections, to avoid blocking threads that could be doing more useful things.
- 遅いクライアントからのリクエストでブロックされてしまってDoS攻撃とかに脆弱性があったのを対応
- https://blog.phusion.nl/2016/12/21/actioncable-under-stress-protecting-your-application-against-slow-clients-using-passenger/
ActionPack
https://github.com/rails/rails/blob/v5.0.1/actionpack/CHANGELOG.md
- Add ActionController::Parameters#merge!, which behaves the same as Hash#merge!.
- Added ActionController::Parameters#deep_dup which actually creates a params copy, instead of refereing to old references in params.
- Add to_param to ActionController::Parameters deprecations.
- AC::Parameters がHash継承しなくなった影響でto_paramsが従来の期待通りに動かなくなった(AC::Parametersを返す)
to_h
してからto_param
使ってくれとのこと- https://github.com/rails/rails/pull/26328
- SSL: Changes redirect behavior for all non-GET and non-HEAD requests
- Deprecated omitting the route path. Specify the path with a String or a Symbol instead.
- 内部実装の都合でこうなったっぽい?
- https://github.com/rails/rails/pull/25693
- Added new ActionDispatch::DebugLocks middleware that can be used to diagnose deadlocks in the autoload interlock
- ロックを検出できるミドルウェアができた
- Pumaがデフォルトになったので必要性が増えたっぽい
- もしデッドロックっぽいのが発生したら、ミドルウェアスタックにこいつを追加して
/rails/locks
でスレッド情報が見れる - https://github.com/rails/rails/pull/25344
ActionView
https://github.com/rails/rails/blob/v5.0.1/actionview/CHANGELOG.md
- Render now accepts any keys for locals, including reserved words
- renderに予約語もlocalとして渡せるようになった。
local_assigns[:class]
のようにして参照する
- renderに予約語もlocalとして渡せるようになった。
- Changed partial rendering with a collection to allow collections which implement to_a.
- Collection Rendering として Enumerable ならなんでも渡せるようになった
ActiveJob
https://github.com/rails/rails/blob/v5.0.1/activejob/CHANGELOG.md
- Added instance variable @queue to JobWrapper.
- rescue-scheduler への対応だけど、もしかしたらsidekiqとかでも便利になる?
ActiveRecord
https://github.com/rails/rails/blob/v5.0.1/activerecord/CHANGELOG.md
- バグフィックスたくさん。特に複数スレッドでうまく動くようにしてるのが多い(クエリキャッシュとかコネクションプーリングとか)
- Introduce Model#reload_
to bring back the behavior of Article.category(true) where category is a singular association. article.reload_category
のようにして特定のhas_one関連だけリロードできるようになった- 今までhas_one関連については
article.category(true)
でリロードできてたけど、それがRails5でdeprecatedになっていた。article.reload.category
では完全な代替にはならない(未保存の他の関連インスタンスの変更が消えるとか)という背景があった - https://github.com/rails/rails/pull/27133
- Always store errors details information with symbols.
- autosaveでバリデーションエラーが発生したときに保存するためのkeyをSymbolにした
- いままではStringだったけどそれだとエラーを保存する他の処理でSymbolにしているのでずれてて扱いづらい
- 場合によっては breaking change になるかもだけどほとんどのケースは大丈夫かな
- https://github.com/rails/rails/pull/26552
- Avoid loading records from database when they are already loaded using the pluck method on a collection.
- 地味に嬉しい。reload考慮する必要ありそう?
- Doing count on relations that contain LEFT OUTER JOIN Arel node no longer force a DISTINCT. This solves issues when using count after a left_joins.
- むしろいままでDISTINCTだったのか
ActiveSupport
https://github.com/rails/rails/blob/v5.0.1/activesupport/CHANGELOG.md
- サマータイム系のバグフィックスが多い
- Fix
thread_mattr_accessor
subclass no longer overwrites parent.- 親と子で別々に属性持てるようになった
Railtile
https://github.com/rails/rails/blob/v5.0.1/railties/CHANGELOG.md
- バグフィックスだけ
docker diff が勉強に便利
たとえば
% docker run -it --name hoge ubuntu /bin/bash root@db1da9fc72e9:/# useradd hoge root@db1da9fc72e9:/# exit % docker diff hoge C /etc C /etc/group A /etc/group- C /etc/gshadow A /etc/gshadow- C /etc/passwd A /etc/passwd- C /etc/shadow A /etc/shadow- C /etc/subgid A /etc/subgid- C /etc/subuid A /etc/subuid- C /root A /root/.bash_history C /var C /var/log C /var/log/faillog C /var/log/lastlog % docker start -i hoge root@db1da9fc72e9:/# diff /etc/passwd{,-} ...
みたいな感じにコマンドがどういう変更を行うのかを追いやすい。
ちなみに先頭のアルファベットの意味は下記の通り。
- A - Add
- D - Delete
- C - Change
差分も表示してくれると嬉しいがそういうオプションはなさそう。
そういうときはdocker export
してtarballを吐いて、コンテナ間の差分を見れば良いのかな。
Dockerコンテナに対してAnsibleで雑にプロビジョニングする
Packer の ansible provisioner とか使っていると、変更差分の動作確認したくなってくる。 毎回 packer build するのは時間がかかり休憩が捗りすぎて進捗がでないという問題点があり、なんとかしたい。
しかしそのために環境作るのも面倒だ。そこで前回出力した docker image を元にコンテナ立ち上げてそこに ansible 走らせたらええやんと思いつく。 といってもsshd立てるのも面倒だし微妙らしいので方法を探していたら、どうやら Docker Connection Plugin というものが標準装備されているらしい。
$ docker-compose run --rm -u root web bash $ ansible-playbook -i web_run_1, -c docker ansible/web.yml
-i (--inventory)
のhostsはコンテナ名-c (--connection)
にdocker
を指定
Pakcer の ansible provisioner が用意する ansible とローカルの ansible のバージョンが違うことがあるのでそれだけ注意。
参考
vimprocのビルドで失敗するとき
vimのプラグインマネージャをdein.vimにして(*1)、 Ubuntu 14.04.4 のVMで:call dein#install()
したら下記のような感じで怒られた。
(*1)たぶんdein.vimにしたことは関係ない
vimproc's DLL: "/home/vagrant/.vim/bundle/repos/github.com/Shougo/vimproc.vim/lib/vimproc_linux64.so" is not found. Please read :help vimproc and make it.
vimprocがないとUnite.vimで/async
とか/git
とか使えなくて困るのでなんとかする。
エラーメッセージによると、makeしてsoを作れば良いらしい。
% .vim/bundle/repos/github.com/Shougo/vimproc.vim % make clang -W -O2 -Wall -Wno-unused -Wno-unused-parameter -std=gnu99 -pedantic -shared -fPIC -o lib/vimproc_linux64.so src/proc.c -lutil make[1]: clang: コマンドが見つかりませんでした make[1]: *** [lib/vimproc_linux64.so] エラー 127 make[1]: ディレクトリ `/home/vagrant/.vim/bundle/repos/github.com/Shougo/vimproc.vim' から出ます make: *** [all] エラー 2
ふむ。
% which clang clang not found % which gcc /usr/bin/gcc
gccならある。
% make CC=gcc % file lib/vimproc_linux64.so lib/vimproc_linux64.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=c624b2200f2f23cfff02e7c019707d36d0bff381, not stripped
OK。
(本当はclang入れたほうが良いんだろうけど面倒くさくて…)
ブログタイトルと説明を少し変えた
具体的にはこんな感じ:
- upinetree's tech blog + upinetree's memo
Qiitaに書き始めてからこのブログ全然書いてないのでもったいないなーと思い、ブログを書く敷居を少し下げてみました。
Qiitaにはちゃんと検証した技術ネタを書いて、こちらにはメモ的なものを残していければなと。
あと気が向いたら日常とか考えていることとか書くのも良いですね。気が向くかわからんけど。