JJUG CCC Fall 2017に行ってきました

JJUG CCC Fall

まえがき

自分用のメモではありますが、役に立つ人がいるかもしれないと思いメモったことと簡単な感想をブログに乗せておきます。 間違いに気づいたら後から訂正しますが、速度優先と自分用メモなので正確な情報は登壇者があとからあげているスライドを見ることをおすすめします。


Selenide or Geb ? あなたはその時どちらを使う?

はじめに

  • Seleniumを使う上でSelenide, Gebどちらを使えば良いのかを考える

Codezin

  • selenideとgebの本が出る

概略

Selenide

  • エストニアのcodeborne社のandreiが作ったJava製WebDriverラッパー
  • DSLを用いたjQueryセレクタ
  • IDEによる補完機能を駆使
  • 要素取得時の待ちを暗黙的に行う
    • AJAXなどの非同期処理の返りの処理記述が容易
  • 呼び方は?
    • せれないど?せれにど?
      • 英語だと「せれにど」、ロシア語だと「せれないど」
        • 製作者的には「どっちでもいい」
      • 日本語だと「せれにど」だからせれにどでいいのかなぁ

Geb

  • 読み方は「じぇぶ」
  • Groovy製のSeleniumラッパー
    • バージョンは2.0
  • DSLを用いたjQueryセレクタ(selenideと一緒)
  • groovyの機能をふんだんに利用した、簡潔な記述が売り
  • selenideよりもより簡潔にかける

selenide Pros and Cons

Pros

  • 簡単に利用できて学習コストが低い
  • Seleniumの知識はほぼ不要
  • IDEとの親和性が高い
  • 標準でAJAXの待ち処理対応
  • Enterprise Support
  • Java(JVM上で動くと言う意味で)

Cons

  • 日本語情報がまだ少ない
  • 対話的に使うことができない

ちょっと質問

  • コンソールでjQueryで書いてみて、それをコピペする
  • developerツールで検討をつけてから、コードを書く
  • selenideは補完が強いので初見でも書ける
  • eclipseも補完効く?
    • 効く

geb Pros and Cons

Pros

  • 簡潔な記述
  • 豊富な機能
  • 豊富なエコシステム
    • 特にgradleか
  • 日本語情報はselenideよりも多め
  • 簡単に利用できる

Cons

  • 学習コストが高い
    • Gebそのものもそうだが、GroovyやGradleも手を出すと大変
      • 今書いている機能がgebなのかgroovyなのかgradleのタスクランナーからきたのかわからなくて混乱することがある
  • IDEの補完が弱い
    • Intellij IDEAを利用したり、多少を補完は効かせる方法はある

体験談

初めてのSelenium(Selenide)

  • SeleniumでのE2Eテスト導入を担当
    • Selenium,Selenide未経験
    • サイト見ただけ
  • Selenideのサンプル通りに書いたら、特につまずかずにかけた

Jenkinsで不安定

  • 手元で通るのにJenkinsだと失敗
  • デフォルトで待ち処理が入ってるのに。
  • 録画機能などを使わないと原因追求が困難
  • 生のSeleniumよりましだけど、安定化はやはり大変
  • 画面キャプチャが残る
    • キャプチャじゃわからないような原因でfailしていたりする
  • waitがうまく入らない、でハマる事が多い
    • 都度都度waitを差し込んで対策していく

geb/selenideが話が出て来る文脈

  • レガシーなシステムのQAコスト下げたい、とか
    • QAは6時間が20分になるかもしれないけどシナリオのメンテナンスはしなきゃなので、それはそれで辛い
    • シナリオを作り込むのにも時間かかる

マルチブラウザテストの導入

  • マルチブラウザのテストがしたい
    • でも最初に辛い思いはしたくない
      • 開発時にphantomjsを利用
    • chrome -> firefoxと展開
    • 開発中はphantomjs -> chromeでも動くようにする -> firefox、、、とやっていったほうが良い
      • IEはやるな
  • クラウド上のブラウザでやりたい
    • sauce labs
  • GebConfigの書き換え(Driverの生成処理の変更)で実現でき、対応が楽
    • Selenideも似たようなことができる
      • Configと起動引数のどちらかが使える

ちょっとQA

  • phantomjsが早い?
    • phantomjsのほうが早かった経験はまだ無い
    • chromeのほうが早かった…
    • seleniumって本物のブラウザを操作していることがウリ
      • phantomjsは偽物だから、使うなっていう話がある
  • seleniumはE2Eテストなんだからユーザが使う本物のブラウザを使いなさい

Selenide or Geb

外的要因

  • groovyが使えるか
  • 知名度/利用実績
    • 実績はある
    • Selenideは弱い
  • 商用サポートの有無
    • Selenideは日本語ではないが、商用サポートがある
      • 今は問合せベースなので、サポートプランが具体的にあるわけじゃない
    • gebはまったくない

読むか書くか

  • 記述量/記述性どちらを優先させるか
    • Gebは記述量が少ない
    • Selenideは記述性(IDEの保管)が良い

学習コスト

  • SelenideはIDEのちからを借りやすく、所見でもある程度かける
  • Gebは相対的に習得コストは高め。ただし機能は豊富なのでなれると手放せない

テスティングフレームワーク

  • Spockが使える
  • SelenideはJUnit/TestNG
  • データ駆動などをするならSpockが優位
  • Junit5は両方対応している

さくっと動かす

  • 対話環境
  • Gebはgroovysh

まとめ

  • コンテクストはさまざま
    • その時時で良し悪しは変わる

感想

  • 学習コストの低さという意味ではSelenideのほうが導入しやすそう
  • jQueryライクということなので、どちらを使うにしてもそこは勉強すべきか
  • QAコストを下げるために導入したとしても今度はメンテナンスコストが発生する
    • ただし、シナリオが変わればテストケースも変更が入るのだからそこは相殺な気がする
    • ただ、シナリオをコードに落とし込むところが時間がかかりそう
      • エクセルでテストケース書くのに比べたらそれすらも楽しい気はする

Aapache Camel + howtio + Spring Bootによるモダンなインテグレーション・マイクロサービス

howtio

  • 「ほーとあいおー」と読むらしい

AGENDA

  1. インテグレーションマイクロサービス
  2. Apache Camelとは
  3. インテグレーションマイクロサービスの作り方
  4. howtioによるモニタリング

インテグレーションマイクロサービス

  • 賢いエンドポイント単純なパイプ(Smart endpoints and dumb pipes)
    • マイクロサービスの中に連携するためのロジックが入り込んでくる
    • 連携するためのプロトコルにはhttpやメッセージキューイングなどのパイプ役をライトウェイトな技術をを使っていく
  • SOAはEnterpriseService Busと言われるプロセスが間に入って、各サービスを統合する
  • MSAでは各サービスの中にルーティングのロジックが入ってる
    • 他のサービスをいろいろ叩いて一つのサービスを提供するようなものを出て来る
      • そういうのを指してインテグレーションマイクロサービスと呼んでいる
      • SOAではインテグレーションスパゲッティと揶揄されてアンチテーゼだった流れからESB導入された
        • 揺り戻しっぽい
  • MSAを推し進めると各サービスが十分小さくなり、それを担当するチームなら十分複雑さに立ち向かえるだろうという流れがありそう

Apache Camel

  • 軽量なインテグレーションフレームワーク
    • camel-core.jar 4.8M
  • 直感的なルーティングDSL
    • 流れるようなインターフェース
  • Enterprise Integration Patterns
  • 軽量だが汎用性も高い
  • 280+の接続コンポーネント
    • まだ日本で流行ってないようなものでも既に公式サポートされてたりする
  • GUI開発環境(Eclipse)
  • マイクロサービスのサポート

Camelでできることの例

  1. Http/RESTで受け取ったリクエストをTwitterにツイートする
  2. SOAPで受け取ったリクエストをKafkaへ流す
  3. ActiveMQから受け取ったJMSメッセージを、データの内容に応じて

Java DSL

  • RouteBuilderを継承してconfigure()メソッドをoverrideする
  • fromは一つ、toは複数書ける
  • ルートの定義は、fromから始まるメソッドチェーンをまた書けば良い。
  • 別のクラスを書いてもよい
  • ALT JAVAでもOK
  • Spring XML DSL
    • の中に定義する
    • Eclipse pluginはこの形式しかサポートしてないのでGUIで書きたいならこれ一択

Enterpise Integration Patternsをサポートしてる

  • システム間連携のベストプラクティス
  • 65のパターン
例えばCONTENT-BASED ROUTER
  • choice/whenで条件分岐できる

280+のコンポーネント

  • 殆どの物があるので見つかると思う

ECLIPSE プラグイン

インテグレーションマイクロサービスの作り方

CAMEL Spring Boot

  1. Spring Bootプロジェクトを作成
  2. CamelコンポーネントStarterを依存に追加
  3. @ComponentをつけたCamelルートを定義

ComponentをつけたCamelルートを定義

  • RouteBuilderをかいて@Componentをつければよい
  • xmlでやるときは@ImportResourceで。

howtioによるモニタリング

JVMの監視といえば

howtio

howtio x Spring Boot

  • 依存に追加するだけ

Demo

  • Camelのサポートが充実している
  • グラフィカルにルートを見ることができる

QA

  • 単体テストのサポートはどんなふうになってる?
    • あるよ。CamelTestSupport
  • 失敗談や落とし穴は?
    • コンポーネント毎に癖がある
      • 認証コードをどうやって渡すかとか、そこが超えなきゃいけないハードルではある

感想

  • パイプとなるprotocolを強く意識せずに透過的に扱えそう
    • 調べる価値がある ‐ちゃんとCamelのサポートが熱い監視ライブラリの紹介があったのがとてもgoodだと思った

DDD x CQRS - コマンドとクエリでORMを使い分けた話

  • 既に資料があがってるので細かいメモは割愛

  • CQRSはイベントソーシングとセットだと誤解されている?

    • CQRSは単独でも使えるよ
  • twitterで質問受付

感想

  • モデルが参照に引っ張られるって話は、「そうだよね!」って思った
    • 参照にモデルが引っ張られてるな‐と思ったらCRQS(チックな)パターンを導入してみようと思う

劇的改善 CI4時間から5分へ〜私がやった10のこと〜

スライド

対象のアプリ

  • Spring Boot / Web APIアプリ
  • Controller -> Service -> Repository
  • 主にRDBへ接続してデータを取得
  • CIで主に実行していたのはビルドとテスト

テストクラスの責務の明確化

  • 層をまたいだテスト、クラスを結合したテストは禁止
    • クラス単位のテスト
  • ただし、RDBへのアクセス(SQL含む)は業務上十分にテストすべき
    • Repository -> RDBはまとめてテスト

Controllerテストのアノテーション変更

  • こんな感じの表があった
@SpringBootTest @WebMvcTest
概要 Spring applicationを起動してテストする Spring MVC infrastructureをAuto-configurerdしてテストする
bean 全てのBean @Controller,@ControllerAdvice,@JsonComponent, Filter,WebMvcCOnfigurer,HandlerMethodArgumentResolver
テスト時間 Webサーバまで起動するため非常に遅い Spring MVCに必要なBeanしか登録されないため早い
類似 - @JsonTest, @DataJpaTest, @JdbcTest ... etc

ServiceテストでDIを使わない

  • Service層はアプリケーション外とのやり取りがないようにする
    • Springを使わない、シンプルなJunitテスト
    • 依存しているオブジェクトはMock

RepositoryはfilterによるBean選択

  • @MyBatisTestで必要なBeanのみを登録できるようになった
  • 必要ならBeanをフィルタリングする必要はあると思う

負債となったテストの改善

  • テストはある程度の規模の開発では爆発的に増える。結果、負債となる。
    • ひとつひとつ潰すしかないよ

テストの削除

  • 時にはテスト自体を削除する決断も必要
    • 不安定
    • 保守しにくい
    • テスト責務が広すぎる
    • 過度なもの

CIの再構築&並列テスト環境の構築

  • 性能が良くない社内サーバからWAWSへ(性能&安定性UP)
  • ジョブ数に応じて、AMIからNodeを自動生成するようにして自動でスケール
  • RDS内部でスキーマを切り、Node毎に別の仮想DBを用意
  • テストの並列実行が可能に

テストサイズの導入

  • こんな感じの表があった
Small Medium Large
時間的目標(メソッドごと) 100ms未満で実行 1s未満で実行 出来る限り高速に実行
ネットワーク モック localhostのみ
データベース モック
他システムへのアクセス モック 非推奨
実行タイミング プルリクエストごと ベースブランチにマージ 任意、またはリリース毎に
  • JUnitの@Categoryとmaven-surefire-pluginのgroupsで実現
  • mvnのprofileで切り替える
$ mvn -P Small
$ mvn -P Mediam
$ mvn

プルリクエストFeedBack

  • プルリクエスト単位でCIの結果をフィードバックできるようにした
    • Lintの指摘(lint-review)
    • カバレッジの可視化(CodeCov)
    • 負債の指摘(SonarQube)
    • チーム独自のルール(Danger)

感想

  • テストサイズという概念を知ることができてよかった
    • 普段テスト書くときにモックするかどうか悩んだりするけど、自分がどのサイズのテストを書きたいと思っているのかで判断してもいいかも

Spring Securityにできること・できないこと

感想

  • とても良くまとまっていて自身の知識の整理になった
  • Spring Securityが具体的に何に対してよしなにやってくれてるのか把握してなかったが、そこが明確化された
  • opengl 8080さんのQiitaの存在をしれたことも良かった
    • いろいろなことをよくまとめてあるので、眺めると勉強になりそう

入社してから運用しているサービスの運用改善奮闘記

感想

  • The Twelve-Factor Appという言葉をしれたことが良かった
  • frontend maven pluginなるもののgradle版はあるのか疑問
    • あとで調べてみる
  • guageが良さそう
    • 部品をエンジニアは書くけど、それを組み合わせたシナリオを日本語で非エンジニアにシナリオ書いてもらえたりする
      • それでも抵抗はあるだろうけど、非エンジニアにテスト参加させられる
    • まだベータなのが残念

Spring BootとKafkaでCQRSなアプリを動かしてみる

CQRS

  • Command and Query Responsibility Segregation
    • コマンドクエリ責務分離
    • named by Greg Young
    • だいたいマーチン・ファウラーがかかわってる
  • コマンドとクエリを別のオブジェクトに分ける
  • 更新するやつはvoid、クエリは副作用無いようにする
    • クラスを分ける
  • コマンドとクエリを分けるという点だけがCQRSの定義

今日のお話

  • 業務で使いたいことを勉強してることを発表

今日のゴール

  • CQRS面白そうっておもらいたい

第1話:僕とDDD

DDDの印象

  • 依存関係を切り離して複雑さを閉じ込めているっぽい

境界づけられたコンテキスト

  • コンテキストを切り離す

ドメインモデル

  • DBやUIに関係することを切り離す

集約

まとめ

  • 複雑さを凝縮

感想

  • DBからの開放、最高
  • UIからの開放、むずい
    • 複数の集約を繋いだ情報が必要だったり
    • 集約から導出した値で検索が必要だったり

第2話:CQRS

  • 書き込みも参照も一つのモデルにとらわれる必要がない!
  • DB分けても良いし
  • Query側にはDomain Modelを置かないという方法も取れる
  • 書き込み用のモデルが参照のモデルに引っ張られてたな、というのはある
  • クエリからの開放!

第3話:僕とDomain Event

  • コンテキストや集約を切り離したら、これまでトランザクションで繋いでた情報をどうやって伝えよう?
  • 何かが実際に起こった、という事実をモデル化
    • CoffeeOrdered
    • CoffeeBrewed
    • CoffeeDelivered
  • 発生したイベントを受け取って情報を更新していく
  • 内部の動きを想像するんじゃなくて起きた事象をベースにするとビジネスの人とでも会話できそう

第4話:僕とEvent sourcing

  • 状態自体を書き換えるのはステートソーシング
    • きっとみんながやってる方法
  • イベントの積み重ねによって今の状態があるという考え方がイベントソーシング
  • でもこれやるとクエリ困る
    • ここでCRQSが出てくる
  • イベントストアにイベントを入れてき、そのイベントを拾って今の状態を持つデータベースを持つ

A Decade of DDD, CQRS, Event Sourcing

  • CQRSはEvent SourcingへのStepping-Stone
  • CQRS/Event Sourcingを全体に適用しない
  • いろんな実現方法が合って良い
  • 複雑なので実現にはコストがかかる
    • 必要な箇所だけに局所的に適用していったほうが良さそう

CQRSとEvent Sourcingはセットなの?

  • 共生関係にはあるけど、別々の考え
  • 組み合わせると2PCなくて良さそう

第5話:僕とCQRS

  • 似たようなことやってる
    • クエリ油のDB
    • レポート用のテーブル
    • サーチは別のシステム
  • トリガーはさまざま
    • DBに保存するときに頑張る
    • 定期実行のバッチ
    • APIを呼び出したり
  • それもいいね
  • ドメインイベント駆動型でもやってみたい

第6話:CQRSとKafkaとSpring Boot

Messagin System

  • kafka
    • 過去の分も残ってるのがなんかいいなって。

感想

  • domaはDDDと親和性が低いかと思っていたが、コマンドとクエリを分ける方法なら逆に親和性が高そう
  • 2PCを回避する方法って何かないかな

CPUからみたG1GC

感想

  • 難しくて正直ついていけなかったが、よくわからない(デフォルトだから)G1GCにしとこうという安易な考えは危険だってことだけはわかりました。

以上。