[Elixir]concurrent integration test with Hound and handle it with tag

雑にしか書きませんが、Phoenixのcontrollerのテストでは、あるURLへの操作に対する結果のチェックにはstatus codeが何か、そのtitle要素は何かといった簡単なHTML要素をみます。そこは静的な要素をチェックできるのですが、画面の遷移が絡んでくるとintegration testと呼ばれる段階のテストを用意する必要があります。 Elixirでは、その手のツールに以下の2つがあります。 Hound Wallaby Wallabyのほうが後発です。これはconcurrentなテストを主眼に開発されているようです。ただ、対応ブラウザがPhantomJSだけだったので、私はHoundを選びました。 そして、concurrent integration testを行うにはphoenix_ecto3.0 + Ecto 2.0を使う必要があります。これは、Ecto2.0から入ったownership制のsandbox環境を使い、concurrentなテストを実行する必要があるためです。 ※Ectoのこのownership制の話とか気になる人はこちらを読むと良いと思います。コード 設定 以下の設定説明を参考にすると、基本的なところは完了。サクッと実行できます。なのでここではリンクだけ… https://github.com/phoenixframework/phoenix_ecto#concurrent-acceptance-tests https://github.com/phoenixframework/phoenix_ecto#hound 私はfirefoxとWebDriverのstandaloneを使ってサクッと実行しました。 WebDriverはこちらからダウンドード可能です=> https://selenium-release.storage.googleapis.com/index.html tips 通常、この手のintegration testはブラウザを使うのでテスト実行が遅かったり不安定だったりします。そのため、その他のmodelやcontrollerのテストとは別に制御できるようにして、不要なときはskipするなりしたいです。 ここでは、tagを使って制御しましょう。ただ、よくあるメソッドごとに @tag をつけるのでは煩雑になるいっぽうなので、 integration_case.ex なんかを作って、それを読み込んだ全てのモジュールに対して勝手にtagがつくようなやり方です。 tagを付与する support/integration_case.ex にtagを設定する 以下のようにヘルパーを作ってあげると、 use MyApp.IntegrationCase したモジュールは自動的に @moduletag :integration のtagが付与されます。 This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than…More

とてか04で多くのものを拾ってきた

とてか04とは 『とちぎテストの会議04』が正式名称。 toRubyを主催している方々が、主に”テスト”に関わる何かを主において開くイベントです。 その中で、今回は以下の通り「つくるいとなむ」を主なタイトルとして開かれました。 http://d.hatena.ne.jp/tochigitestnokaigi/20160423 私 私は以下のようにLTの1番目として発表いたしました。 これ自体は私の普段の学び方だったり、その中で特に業務に活かすために特に疑問に感じていたことをお話し致しました。 「チョットデキル人に訊け!」ででた”テストをうまくなるには?” こちら、何が自分、ひいては周りの向上を誘うか、ですよね。私も考えてみたのですが、やっぱり以下のようにやりたいことベースでいろいろ学ぶなーと感じました。それ以外だと、業務上だったり一時の知的好奇心から、というのはちらほら。 うまくなるには、みたいな話、私なりに考えてみると結局はやりたいことあるからベースが一番強そうです。 #toteka — KazuCocoa (@Kazu_cocoa) April 25, 2016 これ以外だと、何か興味を持っていることの周辺でテストに絡めて学ぶ、というのが面白いのでないですかね。 拾ってきたもの 多くの方々とのつながり。 とてか03で初めて足を運んだとてか。そこから1年後の2回目。前回よりもいろいろな人と話をしましたし、つながりもできました。これは私にとってとても良いつながりだと感じます。ありがとうございました。More

[Elixir]Ecto.RepoのRepository Patternを見る

Mediumでたまたま Repository Pattern を見たこともあって、 Ecto.Repo を見てみました。こういうまとまっているフレームワーク見ると、手軽なデザインパターンの理解や頭の整理にもなりますよね。 Ecto.Query付近は随分前にざっと見ているので、今回は別。 [Elixir]EctoのQueryを少し読み解く ~ コードに前提条件が書かれるので読み解きやすいですね ~ Ecto 2.0から、 Ecto.Repo.first とかもdeprecatedになったので、その対応をついでにメモ。 以下の User は、 Ecto.scheme によって定義されたmodelです。それに対して、1件のemailに合致するデータを引っ張ってくるという処理です。 この Repo.first がdeprecatedなので、それをQueryを使って書き直すと以下のように書くことができます。 この時、 Ecto.Query.first の結果は以下のようになります。 ここは、実際にSQLを出す前のQueryを構築するところです。この Repo.one が実施されると、SQLが発行されてその結果がmodelの結果として得られます。以下は Repo.one まで行われた結果です。 Ecto.Query.first ではリクエストしたいSQLの構築、 Repo.one で実行と、クエリ構築とその実行が分離されていますね。 変更したdiffを合わせて置いておきます。 https://github.com/KazuCocoa/web_qa_vote/commit/4a0242455fb3b9c15d5c68d5e8e78336a2474b54More

[Elixir]マクロ defptとdefp、def

友人が作成していた https://github.com/skirino/croma に、 Mix.env の値によってコンパイル時に def として解釈するか、 defp として解釈するマクロがあります。 その使われ方が面白かったのでメモ。 その箇所だけ切り出して、参照値を環境変数のMIX_ENVにしたものが以下の Functions モジュールです。それをimportする Defpt モジュール、利用する Alexa と Alexaを呼び出す Me 。この Alexa で定義している defpt が今回の対象です。 これを見ると、 Me の中の Alexa.hello が、MIX_ENV == “test” の時はアクセス可能だけれど、それ以外ではundefined function errorになることがわかります。 This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review,…More

[Elixir]withとelseとguardsと。

Elixir 1.3では、 with に対して else や guards を使えるということで、少し試してみました。1.3の時と、1.2.4の時で無理やり書いた時。 http://tuvistavie.com/tokyo.ex 簡単な、 %{width: 10, height: 20} から値を取得して、それに対して幾つかのエラーケースを実践するという内容です。 1.3 さっとまとまる。 This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters…More

[Erlang][Elixir]erlyberlyでErlang/Elixirのdebugをサポート

Erlang/Elixirのdebugを楽にするツールを知ったのでメモ。 https://github.com/andytill/erlyberly http://blog.plataformatec.com.br/2016/04/how-to-trace-elixir-nodes-with-erlyberly/ 実行のワンライナーは以下。 これが全て終わって、JavaのGUIが表示されたら、例えば以下のようにnodeを指定してアプリを起動します。 起動後、Javaで表示されているtarget nodeに “foo@127.0.0.1” を指定。 すると、メモリ使用量とか、諸々を確認することができる以下のような画面を確認できるようになります。 以下は、この簡単なPhoenixアプリケーションに対して実行した時。 対象 https://github.com/KazuCocoa/web_qa_vote 以下は、http_proxyに対して。 対象 https://github.com/KazuCocoa/http_proxy いずれも、BEAM VMのprocessやatomなどのメモリ使用量が計測できてとても良いですね。atomがGCされないので、これが過度に大きいとメモリ圧迫している、とか簡単にわかりますし。あとはfunctionsの名前空間の形もパッと見ることができますね。 https://github.com/andytill/erlyberly#get-the-process-state にあるように、processの状態を抜くこともできるようです。 ある程度はObserverでも見ることができますが、メモリ使用量をこんな感じでグラフにしてくれるのは解りやすい。Java製。More

[Elixir]Structs, String-keyed Maps, Atom-keyed Maps

Elixirの実装を書いている時、データを保持したりする時にStructs、String-keyed Maps、Atom-keyed Mapsのどれを使えばいいかよく悩んでいました。今日も悩んでいて、何かベストプラクティスないかな、と考えていたところ、ちょうど私の考えと同じものがあったのでメモ。 それぞれは以下な感じで書くことができます。 BEAM VMにおいて、atomはCGされません。そのため、どうてきにatomを生成することは良くない、と知っていました。その上で、何が一番妥当なのかなーと思ってたら、以下ページが見つかりました。 https://engineering.appcues.com/2016/02/02/too-many-dicts.html ルールは以下。 1. Always Use String-Keyed Maps for External Data 2. Convert External Data to Structs ASAP 3. Use Structs in All Other Code 4. Use Structs for Output Data 5. Avoid Using Atom-keyed Maps That Aren’t Structs 6. Use Keyword Lists Only for Function Arguments Structsで定義していたら、 defprot や…More

[Alexa]learn skill kit more

Alexaは、単にテキストを話すほかに、意図した感じでテキストを話させることが可能です。 そのために、SSML(Speech Synthesis Markup Language)形式でテキストを書きます。 Speech Synthesis Markup Language (SSML) Reference https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/speech-synthesis-markup-language-ssml-reference 例 以下のように type と speech を与えると、Alexaは “Hoge (0.5秒間を開けて..) Hoge” と話します。 また、以下のようにすることで、音楽も流すことができるみたいです。実際、流れました。 2016年4月9日現在、サポートされているタグは以下のようです audio break p phoneme s say-as speak https://github.com/KazuCocoa/alexa-wise-guy また、Alexaは外部に向けてHTTP通信で取得した値を使うこともできるみたいです。 参考に、以下では取得した情報を話していました。 https://github.com/KazuCocoa/alexa-tide-pooler/blob/master/src/index.js#L341 参考 https://github.com/KazuCocoa/alexa-tide-pooler https://github.com/KazuCocoa/alexa-wise-guy ここまで調べて、やりたいことはできそう、までわかった。More

[Elixir]PubSub機構をサクッとつくる

Elixirは receive があらかじめ用意されている。そのため、 send で特定のプロセスに送ったメッセージを受け取って、何らかの処理をするというコードが容易にかける。それを使い、PubSubをするコード。 This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters Show hidden characters defmodule PubSubServer do def start(subscriber_callback \\ nil) do spawn…More