GitHub k0kubun
Comment4
Like
Created atMarch 23, 2018 22:30
Updated atMarch 23, 2018 22:30

Questions and feedbacks (4)

k0kubun
k0kubun commented over 1 year

Capybara でテストが不安定でつらいという話でしたが、遭遇したたまに落ちるテストの具体例とその対処を教えて欲しいです

テストケースはある障害に対する1つのテストだけだったんですが、落ちたパターンはいくつかありました。

1つは非同期でレンダリングされるボタンをクリックする処理が落ちるというもので、そのボタンがaタグやbuttonになっておらずdivのクリックを検知するものだったため click_buttonclick_link を使い「要素を見つけてクリック」するまでの一連の流れをリトライできず、 find(xxx).click していたのですが、 find(xxx) で要素を見つけるところまではcapybaraがリトライしてくれるものの、ブラウザのレンダリングの状態によっては別の要素がそのボタンの上に被ってしまいクリックできない、というものでした。これは仕方がないのでcapybaraの要素が見つからなかったエラーに対してテストコード側でリトライをかけるようにしています。

もう1つはいくつかの非同期のリクエストがstaging環境だとあまりにも時間がかかり、タイムアウトを10秒→30秒と伸ばしてもタイムアウトするような状態になっていたもので、その次は面倒なので2分にタイムアウトを伸ばしました。理想的にはstagingサーバーのスペックをマシにするとか、そもそも何故パフォーマンスが悪いのかも見るべきだと思います。

Like(0)

k0kubun
k0kubun commented over 1 year

切り出し元から切り出し先を起動してテストされていたということですが、その起動のプログラムやコンフィグはどちらで管理されているでしょうか?

切り出したサービスのmasterをgit cloneして、そこにcdしてbundle install, rails sしている状態なので、起動するプログラムの設定は切り出したサービスに全て入っている状態で起動できています。起動するために必要なRubyのバージョンも.ruby-versionから取るようになっています(最初は同じバージョンを使っていたためそうなっておらず壊れましたが)。

また、変な質問になりますが、テストコードが関係性を持ってしまわないでしょうか?

FactoryBotを使っている間はDBを共有する都合強結合になってしまいますが、APIを叩いてリソースを作るように移行し終わった場合、APIのインターフェースが変わらない限りは動作するような関係性になっており、それはテストが期待する通りの関係性だと思っています。

Like(0)

k0kubun
k0kubun commented over 1 year

サービスを切り出す時に エンドポイント分割 or 内部API の話があったと思うんですが、内部APIを採用した理由をもう少し詳しく聞きたいです。

発表中に話した内容(モデルのvalidator等の内部からも利用されるリソースのためかなり多くのエンドポイントで切り出したリソースが必要になり、かつそこでは認証に必要な情報がないため、いずれにしても認証を不要とする内部APIは必要)以外だと、エンドポイント分割をした場合、後方互換性の都合usersテーブルやAPI keyのあるテーブルを持っていき全く同一の認証を実装する必要性がありますが、コンポーネントをシンプルに保つため、ユーザー管理と認証の責務は完全に切り出し元側に移譲しておきたかったという理由があります。

切り出し元の実装次第では、認証をしてAPI keyをuser_idに変換する処理だけして残りの処理を全て内部APIに任せるような実装にすればほぼエンドポイント分割に近い恩恵は受けられると思います。そうなっていない場所は単純に切り出し元のリソースが認可に必要なので、本質的にどちらでも処理が必要になってしまっている状態です。

Like(0)

k0kubun
k0kubun commented over 1 year

nested loop joinがnested loop join以外の手法と比べてどういうメリット/デメリットがあるのか知りたいです

Like(0)

This software is available as open source under the terms of the MIT License.
Copyright © 2018 Yoshiyuki Hirano