2018/03/05 Osaka Venture Today Meetup #3 テスト自動化の発表資料です。 kintoneの開発で行っている自動テストと、APIパフォーマンスを測定するテストを追加したよという内容です。
サイボウズ株式会社鈴木 亜耶 @szkayeahkintoneをとりまく自動テストたちOsaka Venture Today Meetup #3 テスト自動化新メンバーも大紹介!キントーン
View Slide
はなすひと鈴木 亜耶 @szkayeah• サイボウズのエンジニア• 2017年1月に中途入社(大阪拠点)• 好き:CI・自動化・モニタリングすず き あ や
おしながき• kintoneってなーに?• kintoneの自動テスト• 新メンバー:APIパフォーマンステスト• どんな自動テスト?• 苦労したこと・工夫• まとめ
kintoneってなーに?
kintoneとはサイボウズのクラウド型のグループウェア
梅田で広告ありました!
ブラウザ上でアプリを作る
アプリにデータ登録コメントでやりとり
データをグラフ化
kintoneの自動テスト
kintoneのリリース1月 2月 3月 4月 5月開発期間 試験期間開発期間 試験期間開発期間 試験期間リリースリリースリリース
kintoneのリリース1月 2月開発期間 試験期間バックログ実装バックログ実装不具合改修不具合改修品質向上
kintoneのリリース1月 2月開発期間 試験期間バックログ実装バックログ実装不具合改修不具合改修品質向上スクラム
kintoneのリリース1月 2月開発期間 試験期間バックログ実装バックログ実装不具合改修不具合改修品質向上CIそして自動テスト
自動テストのタイミングdeveloptopic1topic2Localpushmergemerge
自動テストのタイミングdeveloptopic1topic2Localpushmergemergepush後のトピックブランチで自動テスト
自動テストのタイミングdeveloptopic1topic2Localpushmergemergeプルリクエストをマージ後のdevelopで自動テスト
自動テストのタイミング• 自動でテスト実行• ローカルブランチからリモートへpushした時• プルリクエストをdevelopにマージした時• 手動でも実行可能• ひとつひとつJenkinsのジョブになっている• テストが通らないとプルリクエストをマージできない
パイプライン
kintoneと自動テスト• めっちゃ頼りになる高めのカバレッジ
自動テストの種類• ユニットテスト• APIテスト• ブラウザテスト• その他• 静的コード解析• コードフォーマットチェック etc..適宜実装ツールを活用
自動テストの種類• ユニットテスト• Java:JUnit, Mockito(モック用)• Java Script:Mocha, Sinon(モック・スタブ用)• APIテスト• Junitを使用したE2Eテスト• ブラウザテスト• Selenium
APIテスト• APIにHTTPリクエストを送り、レスポンスを検証APIJSON JSON
新メンバー:APIパフォーマンステスト
APIパフォーマンステスト• 従来のAPIテストを性能検証に転用
従来の性能検証1月 2月開発期間 試験期間バックログ実装バックログ実装不具合改修品質向上性能検証脆弱性検証回帰試験移行試験
従来の性能検証1月 2月開発期間 試験期間バックログ実装バックログ実装不具合改修品質向上性能検証脆弱性検証回帰試験移行試験個々のタスクで検証することはあっても
従来の性能検証1月 2月開発期間 試験期間バックログ実装バックログ実装不具合改修品質向上性能検証脆弱性検証回帰試験移行試験必ず行う検証はQAさんにおまかせだった
従来の性能検証• 試験期間に実施• 負荷テスト• Scale Bench• ユーザー操作がシナリオ=ブラウザテストに近い
従来の性能検証• 試験期間に実施• 負荷テスト• Scale Bench• ユーザー操作がシナリオ=ブラウザテストに近い→より狭い範囲で開発期間にできる性能検証はないか?
APIパフォーマンステスト• 従来のAPIテストを性能検証に転用• API単位で性能検証• not 負荷テスト but パフォーマンステスト• レスポンスタイムを見る• 毎日まわせる
APIパフォーマンステスト測定開始測定終了測定結果記録劣化通知APIJSON JSONAPIテスト
苦労したこと・工夫• 測定結果の安定化・ゆらぎの考慮• 環境面• 測定方法• 性能劣化の検知ロジック
苦労したこと・工夫• 測定結果の安定化:環境面• 毎日VMを作り直す• VMは他用途では使用しない
苦労したこと・工夫• 測定結果の安定化:測定方法• テストを並列実行しない• ひとつのAPIで数十~数百回測定• ただし与えるinputはバラす(キャッシュに乗るのを避ける)• 中央値で集計• not平均値
「本日のAPI測定値」として複数回の測定結果をひとつの点に集計
測定値の集計100150200250300350400
測定値の集計100150200250300350400中央値:100平均値:150外れ値につよい中央値を採用
苦労したこと・工夫• 測定結果の安定化:性能劣化の検知ロジック• どのAPIも過去の中央値より●%以上遅かったら通知!• 中央値が小さいほど外れやすくなる• Jenkins先生が毎日怒っている状態に↓• APIごとに閾値を設定• 今までの実施値より決めた
苦労したこと・工夫• 測定結果の安定化:性能劣化の検知ロジック• APIごとに閾値を設定したものの…• 「その日だけ偶然遅かった」がまあまあある• 翌日しれっと戻っている↓• 3日連続で閾値より遅かったら通知• 苦肉の策(検知の質は上がるが検知が遅くなる)
まとめ
まとめ• kintoneの自動テストは心強い• kintoneの自動テストにパフォーマンステストを追加した• 性能検証は奥深い
ありがとうございました