チームスピリットデベロッパーブログ

チームスピリット開発者のブログ

勤怠計算ロジックのリファクタリング、はじめました

こんにちは。QAエンジニアの石原です。
この記事では、私が現在所属しているTSFエンジニアリングチームのサブチームである勤怠計算リファクタリングチームの活動ついてご紹介したいと思います。

勤怠計算リファクタリングチームのミッション

出社時刻や退社時刻などをもとに労働時間の算出をする機能が勤怠計算です。
多くのお客様にご利用いただいているTeamSpiritの勤怠管理機能の中で特に重要な機能の1つです。

先日投稿した下記の記事でも触れましたが、ドメイン知識習得などが容易でないことから勤怠計算機能は限られたメンバしか開発やテストができないという課題を抱えており、特に開発に関する部分では、長きにわたり勤怠計算機能の開発に携わっているメンバしかソースコードの内容を把握できていないという課題があります。

teamspirit.hatenablog.com

そこで、他のメンバとも分担して勤怠計算機能の開発をできるようにするため、勤怠計算ロジックのリファクタリング(プログラミングの挙動を変えずに内部のコードを読みやすくする)を行うことになりました。
勤怠計算リファクタリングチームでは、この勤怠計算ロジックのリファクタリングを行い、最終的に製品パッケージに組み込んでリリースすることを目標としています。

どうリファクアリングを進めるか?

現在のソースコードは、

  • 構造的な課題により、テストのカバレッジを増やそうとするとSalesforceのガバナ制限に抵触してしまうためテスト数が増やせない
  • 勤怠管理機能の肝とも言えるロジックであるため、いきなり現行ソースコードを修正することのリスクが高い

ということから、現行のソースコードの外側で新しく作り直すという方針をとりました。

大まかには、

  1. 今までより詳細な勤怠計算ロジックの仕様書と、より網羅的な勤怠計算テストの仕様書を作成する
  2. 1.にもとづき、新しい勤怠計算ロジックとそのテストコードを作成する
  3. バックエンド(コントローラー)から、新しい勤怠計算ロジックと旧(=現行)ロジックの両方に接続するよう改修し、並行稼動させる
  4. 新旧それぞれの計算結果の差分を検出し、新しい勤怠計算ロジックの品質を向上させる
  5. 差分がなくなったタイミングで新しい計算ロジックに切り替える

というステップで進めていきます。

新旧ロジック差分検出のイメージ図

チーム内の役割分担

現在、勤怠計算リファクタリングチームはリーダ1名、開発者3名、QA2名の計6名の構成となっています。
開発者は主に勤怠計算ロジックの仕様書整備やリファクタリング、テストを自動化するための基盤構築や実行環境の整備などを行い、QAは主にテスト仕様書作成およびテストコードの実装を行いました。
勤怠計算のテストケースは、TeamSpiritの設定や入力パターンの多さからかなりの件数となったため(勤怠計算は勤怠管理機能の中でも特に重要な機能であり、法要件への適合やTeamSpiritをご利用のお客様の給与計算にも影響しますので、テストをしっかり行う必要があります)、テストコード実装のピーク時には開発者と外部メンバにも参画してもらいました。

現在の状況は?

新しい勤怠計算ロジックの実装とテストケースの実装が完了し、アルファテストとして開発環境に新しい勤怠計算ロジックをデプロイして、過去に実装済みのテストコードと今回実装したテストコードをそれぞれ実行しています。
アルファテスト開始直後は現行ロジックとの差分が何件も検出されましたが、改修とテスト実行を重ね、検出される差分もかなり少なくなってきました。
また、テストを自動で実行できるようにクラウド環境(AWS)や自動化ツール(Jenkins)を利用した環境整備も進めており、現在では大部分のテストを自動で動かせるようになってきました。

最後に

まだまだテストは続きますが、新しい勤怠計算ロジックをリリースできるようチーム一丸となって頑張っていきます!

JMeterでSalesforceアプリへの負荷テストを実施しました

こんにちは。TeamSprit EXのQAエンジニアの河西です。

この記事は、APIテストの取り組みに関する記事の3本目です(全3本)。

  1. JMeterによるAPIテストの実装について
  2. JenkinsによるAPIテストの定期実行について
  3. JMeterを使ったSalesforceアプリへの負荷テストの実施について ◀︎ 今回はこちら

前回までは、APIテストの実装と定期実行の取り組みについてご紹介しました。 今回は、APIテストの実装で習得した知識を活用してSalesforceアプリへの負荷テストを実施した際の、取り組みについて書いていきます。


なぜ負荷テストを実施するのか?

機能テストと、性能を測る性能テストは、全く異なる観点のソフトウェアテストで、どちらも製品を提供するにあたって重要なテストです。

  • 機能テスト
    仕様書や設計書に基づいた正しい動きをしているかどうか。
  • 性能テスト
    ユーザーが快適に利用できるかどうか。
    実際の利用想定に基づいて、システムのデータ処理や応答速度のボトルネックとなる箇所を検出することを目指す。

性能テストには、通常の状態での処理速度や同時処理数を検証するものに加えて、システムが高負荷の状態にあるときの性能を検証するテストがあります。 これを負荷テストと呼び、その目的に応じていくつかのテストアプローチがあります。

TeamSprit EX は大企業向けのサービスです。 大企業、つまり多くのユーザーにご利用頂ける製品になっているか、検証する必要がありました。
まずは、私たちが想定している最大ユーザー数でご利用頂ける状態か検証するために、ロードテストを実施することにしました。 そこで問題がなかった場合に、想定以上の負荷をかけるストレステストも実施することにしました。

どうやって実施するのか?

まずはテスト計画を立てました。計画を立てる上で、下記の3点を関係者にヒアリングし決定しました。

  • テストの目的
    TeamSprit EX はSalesforce Platform上にアプリケーションを開発しています。 そのため、今回の負荷テストでは「サーバーの性能を測ること」ではなく、「高負荷時のアプリとしての問題点を洗い出すこと」を目的としました。

  • テスト対象
    想定しているユーザー数と、どの機能に対して負荷テストを実施するかをヒアリングし、決定しました。 今回は画面操作ではなく、APIリクエストでのテスト実施のため、ターゲットとなるAPIもここで決定しました。 そして、最大でどの程度の負荷をかけるか、RPS(1秒あたりの要求数)を決定しました。

  • スケジュール
    いつまでに結果報告が必要かヒアリングし、決定したテスト対象からおおよそのテスト実施期間を決定しました。 初めて負荷テストを実施するということもあり、準備期間は多めに取りました。

ツールの選定については、今回はAPIリクエストによる負荷テストのため、APIテストで使用した JMeter を選びました。

続いて、決定したRPS(1秒あたりの要求数)から負荷を試算し、テストスクリプトの設計をして、JMeterの設定項目「スレッド数」「Ramp-Up期間(s)」「ループ回数」を決定しました。 参考サイト

そうして、下記3ケースのテストスクリプトを作成しました。

  • 想定しているユーザー数規模(1つのAPIを実行)
    RPSは固定のまま、スレッド数を調整して負荷のかけ方を変えた、8パターンを用意しました。
  • 想定しているユーザー数の2倍規模(1つのAPIを実行)
    RPSは固定のまま、スレッド数を調整して負荷のかけ方を変えた、8パターンを用意しました。
  • 5つのAPIを実行
    とある画面を表示する際に実行されるAPI5つを実行するテスト。RPS・スレッド数を調整した10パターンを用意しました。

画面を表示する際に実行される5つのAPIを実行するテストケースの方が、より実際の負荷に近いものとなります。 しかし、テスト結果を分析することが少し難しいため、5つの中で1番レスポンスに時間がかかる1つのAPIに重点を置きました。

続いて、テストスクリプトを作成したら、Salesforceアプリへの負荷テスト実施で必要な、Salesforceへのパフォーマンステストの承認申請を行いました。 こちら を確認し、ケースにて申請を行い、承認を得ました。

最後に、テスト環境にテストデータを入れて、準備は完了です。
準備したテストスクリプトを順番に実行しました。
(JMeterのGUIではなく、CLIで実行します。スムーズに実行するために、実行するコマンドを一覧化しておくことをオススメします。 その際、出力するログファイル名は、実行するテストスクリプトのファイル名と同じにしておくと、結果の確認がしやすいです。)

テストの結果

結果が出力されているファイル(result.jtlなど)から、結果を確認します。 (ファイルを、JMeterの「統計レポート」というリスナーで参照すると確認しやすいです。)
結果をExcelでまとめ、有用なデータをグラフ化したものがこちらです。
高い負荷をかけましたがあまり性能劣化は起きておらず、Salesforce Platformの性能の良さを改めて知ることができました。

しかし、一部のリクエストでエラーが発生しました。赤線の箇所)
発生したエラーは「403 Forbidden」です。 こちらについてSalesforceに確認したところ、 Apexガバナ制限 によるもの、と回答を頂きました。

10個の長時間(5000ms以上)のトランザクションが実行されている間に追加のトランザクションが開始されると、追加のトランザクションは拒否されます

この制限に引っ掛かりました。この制限は組織内だけであり、他組織に影響はありません。同時実行される可能性が高いAPIで、5000ms以上かかるものがあると、この制限が起きる頻度は上がります。

「高負荷時のアプリとしての問題点を洗い出すこと」を目的とした今回の負荷テストでは、上記の結果を得ることができました。

レポートの共有

結果をまとめて、開発メンバーに共有するレポートを作成しました。レポートには、下記の内容を記載しました。

  • 結果総評
  • テスト結果詳細
    • 処理遅延について
      • データからの読み取り
      • まとめ
    • エラー発生について
      • データからの読み取り
      • エラーの内容
      • APIテストとの照合
      • まとめ
  • 今後の課題について

今回の負荷テストの結果と、定期実行しているAPIテストの結果を踏まえて、今後の課題まで共有することができました。

テスト実行環境について

今回の負荷テストは、PC1台(MacBook Pro2020(Apple M1, 16GB))で実施しました。 計画段階で、PC1台で実施できるのか不安がありましたが、今後の負荷テストの課題を洗い出すためにも、とりあえず今準備できるもので実施してみようと思いました。
負荷テスト実施時は、不要なアプリケーションを全て閉じて、コンソールとアクティビティモニタのみ起動している状態で実施しました。

考えうる課題として、CPU負荷メモリについてモニタリングしました。

  • CPU負荷について
    テストスクリプトのコマンドを叩いた時、つまりJMeterが立ち上がる時に、一時的にCPU使用率が上がりましたが、それ以外はあまり上がりませんでした。 なるべく余裕のある状態での実施が望ましいですが、今回ほど厳密に全てのアプリケーションを閉じて実施しなくても良い、と思われます。

  • メモリについて
    本来、JMeterで負荷テストを実施する際は、先にJVMのチューニングをしておくことが推奨されていますが、今回はあえてチューニングせずに実施してみました。 すると、1500スレッドのテストは問題なく実行できましたが、1920スレッドのテストではメモリ不足によるフリーズにより、テストが止まりました。
    そこで、下記のようにJVMのチューニングをしてみました。
    すると、1920スレッドのテストも問題なく実行できました。
    最大6Gの設定にしましたが、モニタリングしたところ1.5Gまでしか使用されなかったため、まだ余裕があると思われます。

上記の結果から、今回以上の負荷(例えば5000スレッド以上)のテストは、PC1台で実施することは難しそうです。 AWSなどでJMeterサーバーを立てて実施するのが望ましいと考えます。

こうして、テスト実行環境についても課題を洗い出すことができました。

最後に

負荷テストについては、わからないことがとても多く、なかなか計画を立てられず、準備段階でも不安が多くありました。 「わからないことを明確にする」という目的で、とりあえず実施してみると、予想以上に多くの結果を得ることができました。

見つかった課題は Apexガバナ制限 だったため、 負荷テストを実施しないとわからない課題、ではありませんでした。 しかし、普段のテストとは違うアプローチをすることで、潜在的な課題が顕在化し、具体的な影響も見えたことで課題の優先度を判断することができた、と思っています。

APIテスト・負荷テストを任せていただけたことで、とても多くの学びがあり、スキルアップできたと感じています。
新しいアプローチのテストを導入することは大変ではありますが、個人としてもチームとしても、これからもチャレンジし続けたいと思います!

勤怠計算についてチーム内勉強会を開催しています

こんにちは。QAエンジニアの石原です。
現在TSFエンジニアリングチームでは、勤怠計算の勉強会を毎月開催しています。
本記事では、この勤怠計算勉強会についてご紹介します。

なぜ勉強会を開催するのか?

多くのお客様にご利用いただいているTeamSpiritの勤怠管理機能の中で、特に重要なサブ機能の1つが労働時間などを算出する勤怠計算の機能です。
勤怠計算は労働基準法などの法要件に基づいて行われ、固定労働制、フレックスタイム制、変形労働制などの勤務体系によって計算方法が異なります。
また、TeamSpiritの勤怠管理機能には、お客様の運用に合わせて柔軟に設定できるように勤怠計算に関連する様々な設定項目が用意されています。勤怠の入力パターンも、残業、遅刻、早退、休暇、休日出勤など様々なケースがあります。

勤怠計算機能の開発やテストを担当するメンバには、上で述べた法要件、TeamSpirit自体の機能、入力パターン等のいわゆるドメイン知識が欠かせませんが、習得するのは容易ではありません。
このため、現状では勤怠計算の開発やテストができるメンバが限られてしまっており、TSFエンジニアリングチームの課題となっています。この課題を解消するための取り組みの1つとして、勉強会を開催することにしました。

勉強会の内容

勉強会は、TSFエンジニアリングチームのQAである私(石原)ともう1人のQAメンバの計2人で交代で開催しています。
私が担当する勉強会では、勤怠計算初心者〜中級者の方を対象に、計算方法を理解し、基本的なパターンについて労働時間等の各項目の値を自力で計算できるようになることを主な目的としました。
参加者の方には事前に勤怠計算の仕様書を読んできていただき、勉強会の時間では私が作成した練習問題を解いていく構成としました。

練習問題の内容を少しご紹介すると、例えば残業に関する問題はこんな感じです。

固定労働制で以下の勤務をした場合、各項目の値はどのようになりますか?
・出社 9:00
・退社 19:30
・休憩 12:00-13:00
・残業申請(17:30-19:00)を申請済み

※勤務体系の設定(始業終業時刻や所定労働時間など)も問題内で提示していますが、ここでは省略します。

当初はQAメンバ向けに開催する予定でしたが、TSFエンジニアリングチーム全体向けにした方がよいのではと提案をもらったので、チームの方ならばどなたでも参加できるようにしました。

勉強会の様子

コロナ禍でチームメンバの多くは自宅からのリモートワークなので、勉強会は毎回オンラインで開催しています。
練習問題を1問ずつ時間を決めて実際に解いてもらい、その後に答え合わせと解説をするという形式で進めます。単なる座学にならないよう、参加者の方には、計算結果とどのように考えて計算したかを答え合わせの前に発表してもらうようにしています。

先月開催した勉強会では、QAメンバ、開発メンバ合わせて7名が参加してくれました!

勤怠計算勉強会に参加してくださった皆さん

最後に

勤怠計算の勉強会を開催することによって、自分自身の知識の棚卸しにもなりました。
勉強会で使用している練習問題は勤怠計算の一部の範囲しかまだカバーできていないので、練習問題の拡充と勉強会開催を継続しつつ、今後も引き続きチームの課題解消に取り組んでいく予定です。

Salesforce認定資格の話

こんにちは、開発チームの畑本です。約3年近く在籍していますが、実はこちらのブログに書くのは初となります・・・

先日、Salesforce 認定アプリケーションアーキテクト資格を取得できました!これで9個目の資格となります。

これを機に、Salesforceの認定資格について色々ご紹介させて頂ければと思います。

Salesforce認定資格とは?

文字通り、Salesforceプラットフォームに関連するいわゆるベンダー資格です。

Salesforce上での様々な業務に関連した資格があり、試験に合格することで業務上必要な能力があることを証明できます。こちらから資格の一覧や受験ガイドを参照できます。 資格一覧 - Salesforce

Trailheadにも解説記事があります。自分のジョブに対応した受験すべき資格を見つけることができます。 https://trailhead.salesforce.com/ja/credentials/administratoroverview/

どの資格を取るか

まず最初に認定アドミニストレータか認定Platformアプリケーションビルダーを取るのがおすすめです!以下の流れで基本資格から上位資格にステップアップできます。

・管理者・コンサルタントコース

まず基本資格となる「認定アドミニストレータ」に挑戦しましょう!Salesforceに関わるひと通りの機能を学ぶことができます。
その後は以下の上位資格に挑戦できます。

  • 認定上級アドミニストレータ:組織管理の実践的な業務知識を学ぶ
  • 認定Sales Cloudコンサルタント:Sales Cloud機能(商談、売上予測、キャンペーンetc)に特化した業務知識を学ぶ
  • 認定Service Cloudコンサルタント:Service Cloud機能(ケース、ナレッジetc)に特化した業務知識を学ぶ
・開発者コース

基本資格として「認定Platformアプリケーションビルダー」と「認定Platformデベロッパー」があります。アプリケーションビルダーが宣言型(ノンコーディング)開発、デベロッパーがコーディング開発と覚えてください。
アプリケーションビルダーはカスタマイズの幅が広がるので管理者にもお勧めの資格です。
それ以降の上位資格はまた様々です。更にSFの技術を極めるには「認定上級Platformデベロッパー」、画面開発に必須な技術に関わる「認定JavaScriptデベロッパー」 資格、 より上流の観点から包括的にシステムを理解する「アーキテクト」関連資格もあります。

どうやって資格を取るか

基本的にオンデマンド試験に合格すれば認定されます。Webassessorというシステムで受験申込を行いますので、まずはこちらのサイトにユーザ登録しましょう。 https://www.webassessor.com/wa.do?page=publicHome&branding=SALESFORCEJP ※初期登録したメールアドレスはユーザIDとして今後ずっと使いますので、なるべく使いやすいアドレスを登録してください。

受験方法には2種類あります。「オンサイト監督」は 国内各地にあるテストセンターの端末で受験します。本人確認書類(2種類)をお忘れなく! 一方、「オンライン監督」は自分のPCで受験します。テストセンターに行かなくて済むのが利点ですがPCセットアップの手間が難点です。。こちらのサイトで注意点を確認しましょう。 オンライン受験のご紹介 - Salesforce

受験費用の決済方法も2種類あります。通常はクレジットカード決済ですが、代わりにバウチャーコードを使うこともできます。 バウチャーは主に企業が一括購入して従業員に配布するためのものですが、Salesforceのイベントで配布されることも・・・!?

試験に合格するには

基本はTrailheadを使います。Salesforceに関する知識はすべてTrailheadに集約されていますので、これを使わない手はないです。

基礎学習

資格対策に特化したTrailmix(複数の学習コンテンツを一纏めにしたリスト)が公式/非公式問わずありますので、まずこれに沿って学んでいきましょう。

trailhead.salesforce.com

trailhead.salesforce.com

Trailheadのモジュールやプロジェクトは実際にSalesforce組織を操作して再現できる手順が掲載されていることが多いです。ただテキストを読むだけでなく、自分で設定手順を再現することでより理解が深まります。
また、モジュールの中には参考資料としてヘルプページへのリンクがあります。詳細な仕様はこちらに記述されているので、こちらもできる限りチェックしましょう。

直前対策

試験直前になったら、「認定試験に向けた学習」トレイルを履修しましょう。試験本番の多肢選択形式で出題されたサンプル問題を参照できます。

trailhead.salesforce.com

trailhead.salesforce.com

また、Salesforce主催の有償/無償トレーニングも随時開催されています。特に無償トレーニング「Certification Days」ではWebAssessorで使える割引クーポンも貰えるのでおトクですよ。 www.salesforce.com

認定資格の出題内容は受験ガイド記載のトピック別出題比率に沿って出題されるので、出題率の高いトピックを重点的に復習しましょう。もし不合格になってしまったら、Webassessorからトピック別正答率が確認できるので苦手分野を復習しましょう。

合格したら

合格おめでとうございます!初めて資格を取った場合は、まずWebassessorとTrailheadをリンクしましょう。操作はTrailheadから行います。 quip.com

リンクが完了したら、こんな感じにTrailheadのプロフィールに資格情報が表示されます。これでみんなに自慢できますね! https://trailblazer.me/id/hatamoto-t

Trailhead画面

またTrailheadとのリンクにはもう一つ重要な理由がありまして・・・ Salesforce資格は、Trailheadの資格更新バッジを取らないと失効します。 資格更新バッジは「認定資格の維持」トレイルにまとまっているので、定期的に確認しましょう。(だいたい年1回ペース)対応するモジュールのバッジを取ることで資格の有効期限が延長されます。

なぜ資格を取るか

業務でSalesforceに携わる方の中でも、認定資格に興味のない方は案外いらっしゃいます。「資格取る暇があれば業務に関わる作業した方がいいよ」と思っている方も多いです。確かに業務独占資格と違って必須の資格ではないかもしれません。でも取る理由は色々ありますよ。

①Salesforceパートナー企業にとって重要

Salesforceとパートナー契約を結ぶ際に資格者要件があるため、起業する場合に有資格者を集める必要があります。また社内の有資格者の人数はパートナー企業のスコアリングに反映されます。

②Salesforce関連企業で優遇される
そんなわけで、パートナー企業では社員の資格取得を促すために様々な奨励策を取っている事が多いです。受験費用の補助があり、合格時に報奨金が支給されることもあります。
なお弊社には資格手当制度があり、資格保持者には保有資格に応じて毎月支給されます!

③業務経験から得られない技術を学べる

Salesforceの資格試験では多数のトピックから出題されますが、その中には業務で使ったことがない機能が含まれている事があります。試験を通じて、自分がまだ学び足りていない技術が浮き彫りになります。

④足りない知識を補うことでより良い活用ができる

「業務で使わない知識は、要らない知識なんじゃないか?」と思われるかも知れません。けどその技術を知っていれば、過去の業務でより良いシステム構築ができていたということはないでしょうか?新しい技術を学ぶことでそんな可能性に気付くことができます。

これからも様々な認定資格を取れるように学び続けていきたいと思っています。 同じ思いを持っている方、一緒に勉強しませんか?社内外問わず一緒に勉強できるもくもく会を定期開催しておりますので、ぜひ来てくださいね! (最後に宣伝です😅) sfsaturday-tokyo-kyobashi.connpass.com

JenkinsでAPIテストの定期実行を始めました

こんにちは。TeamSprit EXのQAエンジニアの河西です。

この記事は、APIテストの取り組みに関する記事の2本目です(全3本)。

  1. JMeterによるAPIテストの実装について
  2. JenkinsによるAPIテストの定期実行について ◀︎ 今回はこちら
  3. JMeterを使ったSalesforceアプリへの負荷テストの実施について

前回は、運用できるAPIテストの実装の取り組みについてご紹介しました。
自動テストを運用するということは、定期的に実行して結果をウォッチし、開発にフィードバックできる状態にする必要があります。
その取り組みの中で、CIサーバ初心者の私が学んだことや工夫したことについて、今回は書いていきます。


なぜAPIテストを定期実行するのか?

TeamSprit EX は、複数のスクラムチームによって継続的に開発が行われています。
開発が進み、その複雑さが増してくると、改修した部分が影響して不具合が発生するリスクが高くなります。 それを早期に検知するためには、定期的なリグレッションテストの実施が重要になります。
リグレッションテストは、同じテストの実施を何度も行うため、手動テストよりも自動テストの方が向いています。

今回追加したAPIテスト以外にも、下記3点のテストを自動で定期実行しています。

  • Unitテスト
  • E2Eテスト(Autifyなど)
  • 性能テスト(Webpagetest)

このように様々なアプローチのテストを定期実行することで、リグレッションテストの範囲を広げることができ、手動テストの負荷を軽減させることができます。

どうやって定期実行するのか?

前回ご紹介した通り、APIテストはJMeterで実装しています。
JMeterを定期実行するために、CIツールを利用することにしました。ツールは、チームで使っていることもあって、 Jenkins を採用しました。

Jenkinsとは、継続的インテグレーション(CI)や継続的デリバリー(CD)、継続的デプロイメントを実現するツールです。 下記の4点の特徴があります。

  • 汎用性が高いことから大きな支持を得ている
  • 世界中のソフトウェアエンジニアによって開発された 1,800以上ものプラグインが利用可能
  • Javaが動く環境であればLinuxでもWindowsでも動作させることができる
  • プラグインが提供する機能だけでなく、スクリプトを記述することで、より柔軟に自動化を行うことができる

JenkinsでJMeterを実行するためには、下記の作業が必要です。

  1. Jenkinsが動作しているサーバーに、JMeterをインストールする
  2. サーバーで、JMeterを実行できることを確認する
  3. Jenkinsに Performanceプラグイン をインストールする
  4. Jenkinsのジョブを作成する

詳細については こちら を参考に、作業を行いました。
Jenkinsのジョブを作成したら、それを定期実行するように設定すれば、APIテストの定期実行ができるようになります。
(私たちの場合は、テスト環境へのデプロイなどと組み合わせたパイプラインを作成し、それを毎朝実行するようにしています。)

JMeter, Jenkins, Performanceプラグイン を利用することで、 実行も集計も自動化することができます。
Performanceプラグインによって、このように結果をGUIで確認することもできます。 (これはサマリーですが、サンプラーごとの集計結果も確認できます。 )

JenkinsでJMeterを実行する際の課題

定期実行はできるようになりましたが、私たちがAPIテストを運用する上で、新たに2つの課題が生まれました。

  • 1件のエラーも逃さない仕組み
    • エラーが発生したら、Jenkinsジョブのビルドが失敗する (Slack通知は設定済み)
  • エラー時に誰でも問題を確認できる
    • ログに、エラー箇所と原因が特定できる情報を追加する

エラーをどの程度許容するかは、定期実行を検討する上で重要な指標です。私たちは今回実装したAPIテストの特性から「1件のエラーも無視できない」と定めました。
(Performanceプラグインの一般的な設定は こちら のようです。)

上記2つの課題を解決する方法は複数あると思いますが、今回は下記の改善を行いました。

① jmeter.log にエラー箇所と原因が特定できる情報を追加する
これを各サンプラーに追加しました。

② Jenkinsジョブで、APIテスト実施後に jmeter.log の内容を確認し、エラーが見つかればビルド失敗とする
※ result.jtl などのテスト結果を格納しているファイルは、Performanceプラグインを使用している場合は履歴を蓄積している必要があるため、実行毎のNGを判断するのには不向き、と判断したため jmeter.log を活用しました。

この改善により、定期実行のエラーにすぐに気付くことができ、エラー原因の特定もスムーズになりました。

定期実行の結果をウォッチして、運用する

サンプラーごとの結果は、Jenkinsの「Performance Report」から、このように確認することができます。

ざっくりと結果を見る分にはこれで十分ですが、結果を分析したりするには、前回実行時との差分などの情報が含まれているため、少し不便です。
そのため私たちは、Jenkins上のレポートとは別に、定期的にレポートを作成してチームに共有しています。 その方法は、下記の通りです。

  1. 定期実行の結果が出力されているファイル(result.jtlなど)をダウンロードする
  2. ダウンロードしたファイルを、JMeterの「統計レポート」というリスナーで参照する
  3. 出力された結果をコピーし、Excelファイルに貼り付ける

少し手間ですが、こうしてExcelファイルにすることで、ソートやマークアップがしやすくなります。
チームにはこのレポートと、レポートの見方を共有しています。必要に応じて、各自が使いやすいように加工して利用してもらっています。

ここまで大変なことも多くありましたが、こうしてAPIテストの運用を確立できました。

最後に

今まであまり考えていなかった「テストを運用する」ということを、深く考える機会となりました。
何の為にどのように運用するかによって、実装や設定は異なります。 そのため、インターネット上の知見だけでは解決しないこともあり、試行錯誤しました。

現在、運用しているAPIテストからバグは検出されていません。 だからといって無意味ではなく、「不具合が発生していない」という結果を上げられていると思っています。
また、副産物として「APIレスポンスタイムの調査」などに使っていただくこともあるため、お役には立てているのかな、と感じています。

次回は、JMeterでSalesforceアプリへの負荷テストを実施したことについてご紹介します!

teamspirit.hatenablog.com

JMeterでAPIテストの実装を始めました

初めまして!TeamSprit EXのQAエンジニアの河西です。

昨年9月に入社し、APIテストの実装や、負荷テストの実施に取り組んでいます。
その中で多くの試行錯誤があったため、そのことについて全3本の記事でご紹介したいと思います。

  1. JMeterによるAPIテストの実装について ◀︎ 今回はこちら
  2. JenkinsによるAPIテストの定期実行について
  3. JMeterを使ったSalesforceアプリへの負荷テストの実施について

既にAPIテストは少し作られていましたが運用されていなかったため、既存のAPIテストを参考にし、運用できるAPIテストの実装を始めました。
その取り組みの中で、自動テスト実装初心者の私が学んだことや工夫したことについて、今回は書いていきます。


なぜAPIテストを実施するのか?

APIはUIと比較して作りが単純であるため、テスト資産のメンテナンスの容易さも含め、自動化に向いています。
UIテストよりも変更が生じにくく一貫性があるため、既に作成したテスト資産を長期間にわたって利用(運用)しやすいという利点があります。

さらに、性能テストなどと組み合わせることで、製品の性能におけるボトルネックを発見しやすいという利点もあります。

どうやって実装するのか?

ツールは、 JMeter を採用しました。
JMeterは、Javaアプリケーションのオープンソースの負荷検証ツールで、ブラウザではなくプロトコルレベルで動作します。 サーバに対して指定した量のリクエストを送り、そのレスポンスを受けることで、パフォーマンス計測することができます。

今回は、リクエスト量を最小にすることでAPIテストとして利用します。
JMeterで作成したAPIテストは、リクエスト量を調整することで負荷テストに応用することができます。

JMeterの実装は、このようなJMXファイルを作成します。
こちらは手動でコーディングもできますが、JMeterではGUIが用意されているため、基本的にはGUIで実装することをオススメします。

GUIはわかりやすく、作成しやすいと感じました。一部コーディングが必要ですが、GUIで作成できるのはテスト自動化のハードルを下げられます。
GUIで実装したものが、JMXファイルに書き出されます。そのため、Gitによるコード管理も可能です。ちなみに、コピペや文字列置換などはコードを直接編集した方が早いです。

APIテスト実装における課題

私は、APIテストを実装するのも、JMeterを使うのも初めてでした。
最初は苦戦しましたが、既存のAPIテストとAPI仕様書を見ながら、実装して実行して、とやっている内に理解できました。 API仕様書がしっかりと書かれていたことと、APIが複雑な作りではないことが、とても助けになりました。 (開発の皆様、いつもありがとうございます!)

どうやって実装すればいいかがわかるようになった次は、本格的にテスト計画を考え始めました。
冒頭にも書きましたが、今回実装するのは「運用できるAPIテスト」です。 既存のAPIテストが運用できなかった課題を洗い出し、3つの改善に気付きました。

  • 「テスト実装しづらいAPI」が無い状態にする
  • 定期実行できるものにする
  • テスト環境に依存しないものにする
    • ログインに使うテストデータの部分だけを書き換えれば、どの環境でもテスト実行できるものが理想

これらの課題を解決するために、APIテストをシナリオテストの形で実装することにしました。 (既存のAPIテストは、コンポーネントテストの形でした。)
APIを理解して、まとめられるものはシナリオテストで実装することで、カバレッジの管理もしやすくなります。 また、データを作成して削除する、という流れにしてAPIテストの実行終了時にデータが無い状態にすることで、定期実行の自動化も容易になります。

シナリオテストのイメージ

APIには、リクエストにパラメータが必要なものがあります。
例えば、データを削除するAPIには、「何を削除するか」というデータを指定するパラメータが必要な場合があります。 その際に必要なパラメータを固定値にしてしまうと、繰り返し実行できない・他の環境で実行できない、APIテストになる可能性があります。 この場合においても、シナリオテストにすることで解決できます。

  1. データ作成
  2. データ参照・取得
    • PostProcessorで「今登録したデータ」を取り出して、次のリクエストのパラメータで使えるようにする
  3. データ削除(対象を指定する)

この流れで実装することで、テスト実行ごとに削除したいデータを決めることができます。
これはAPIがどのような作りになっているかにもよりますが、私たちの場合はこの流れでテスト実装するのが一番スマートでした。 (こういったシナリオを考える上でも、API仕様書は重要です。開発の皆様、いつもありがとうございます!)

属人化問題と向き合う

シナリオテストを設計することで、あとは設計通りに実装すればカバレッジが上がっていく、という状態になります。 既存のAPIテストは、1人の方が実装されてそこからアップデートされていませんでした。
テスト自動化は属人化しがち、という話もよく聞くため、今回は早い段階から実装を分担することにしました。 (こういった分担をするためにも、Gitで管理ができるのは有難いです。)
属人化しないために行ったことは、下記の3点です。

  • 共有資料を作成する
    • APIテストやJMeterについてまとめた資料
    • 実装方法についてまとめた資料(動画も入れました)
  • 資料を基に、ナレッジ共有会を行う
    • 日本のQAチームだけでなく、シンガポールのチームにも共有 
    • 受けた質問を基に、資料をアップデート
  • 実装を分担して行う
    • モブプロやPRレビューなどをやってみる

Gitの操作に慣れていない方も居たため、そこもサポートしました。
最初はモブプロが必要でしたが、今はサポート無しで、PRを出してもらえる状態になりました。

結果として、現在は私以外に3名程がAPIテストを実装できます。 大変ではありますが、テスト自動化をする時は早い段階で属人化を解消しておくことで、テストの拡充がスピーディに行えると感じました。
各スクラムチームに属しているQAメンバーもAPIテストを実装できるため、まだ実現できてはいませんが、開発のスピードに合わせてAPIテストを拡充していくことも可能な体制になりました。

次の課題は、命名規則やコメントの付け方などのコーディング規約だと思っています。 このあたりはまだルール化はしていませんが、「誰でもメンテナンスできるように」という方針でPRレビューを行なっています。

最後に

APIテストができると、テストデータを作る際にも役立ちます。新しいものを導入することは大変ですが、得られるものはとても多いと感じました。
私はQA歴も浅く、APIテストの実装も初めてでしたが、任せていただけたことでとてもスキルアップできたと感じています。

次回は、JenkinsでAPIテストの定期実行を始めたことについてご紹介します!

teamspirit.hatenablog.com

【イベントレポート】Autify community meetup QAチームのオンボーディング事情

こんにちは!エンジニリングマネージャの生井(id:riririusei99)です。
今回は、7月6日に行われたAutify Communityの中でチームスピリットから橘さんが登壇しましたのでイベントレポートを書きます。

 

autifyjapan.connpass.com

 

Autify community meetup とは?

Autify community meetupは、Autifyユーザー = Autifier(オーティファイアー)のためのコミュニティ「Autifier Community」が運営する、QAやテスト自動化をテーマにしたミートアップです。
サービスや製品の品質管理に携わっているみなさんに向けた情報をカジュアルに共有していきます。
Autifyのご使用経験がない方のご参加も大歓迎です。

Autifyは自動テストをノーコードで作成できるツールなので、QAエンジニアや開発者がテストのことをより深く理解することで、もっともっとAutifyを活用できる!

…そんな背景からQAやテスト自動化に関する勉強会を開いています。(と思っています。)

 

最近は品質保証・テストに関する勉強も盛んに開かれており、1人目のQAの事例発表や勉強会のテーマとして良く取り上げられるテーマだと思います。

今回のイベントはそこからから少し進んだQAチームの次なる大仕事、2人目以降のメンバーの受け入れに焦点を当てた「オンボーディング」というテーマでイベントを開催されました。

 

今回Autify Communityのメンバーとしてイベントのネタ出し要員としても企画のタイミングで参加しています!

私のコアメンバーの活動の軌跡はこちらから読めます。

Autifyコアメンバー活動やってみました! - riririusei99’s blog

 

パネルディスカッション

参加者は橘さんの他に株式会社レコチョクさんからもオンボーディングを受けた側として参加、モデレータのAutifyの早川さんが元1人目のQAなのでオンボーディングした側という3人で進行していきました。

 

パネルディスカッションの様子

パネルディスカッションの中ではオンボーディングに対する「期間・内容」「それぞれ工夫している部分」「これがあって良かった」などをメインに話し、その中で気になった部分を深堀りするという形式で進んでいきました。

 
チームスピリットのオンボーディングの期間について

パネルディスカッションの話題でオンボーディング期間について補足しておくと「チームスピリットのオンボーディングは2ヶ月」という話がありましたが、通常は3ヶ月です。

チームスピリットのオンボーディングはざっくり分けると3つに分けられます。

  • 全社員共通オンボーディング(製品紹介、社内ルール等)
  • 開発者向けオンボーディング(製品テスト、環境構築)
  • Salesforce知識をつけるオンボーディング(Trailhead)

橘さんの場合、Salesforceの知識がとてもある人だったので3つ目が免除になりましたが、通常はこのTrailheadが非常に大変です。

私も入社した時はSalesforceは初めての状態だったので、とても時間がかかったことを今でも思い出します。

(…今も調べ物をする時にTrailheadを見るのがあるんですが、調べたい内容のTrailが既に履修済みになってたりするんですよね。)

 

オンボーディングの詳しい内容は他のメンバーもブログに残してくれていますので、よければご覧ください。

 

teamspirit.hatenablog.com

 

teamspirit.hatenablog.com

 

QAのスキルを身につけるために行なっている教育や勉強方法について

スキルを身につけるための勉強方法の中でISTQB・JSTQBの資格受験やシラバスを読むということについても言及されました。

資格取得についてはこちらもブログ記事がありますので、この機会に確認してみてください。

teamspirit.hatenablog.com

 

teamspirit.hatenablog.com

 

ISTQB・JSTQBの知識体系を大事にしていることについてですが、会社から見ればメンバーの立ち上がりがしやすく、メンバーからは幅広い場所で使えるスキルを取得することで個人のキャリアにもプラスに働くため双方にとって良いことだと考えています。

資格取得について厳格なルールは存在していませんが、勉強方法などについて聞かれた際は私もシラバスを読むのを提案したりします。

 

テストアナリスト試験の前は有志で勉強会などもやっています。

teamspirit.hatenablog.com

 

そういった活動の成果として、現在は社内でAdvanced Level保持者は8人いて、TA&TM両方を持ってるメンバーは4人所属しています。

 

終わりに

登壇してくれた橘さんは質問に対しても丁寧に対応しチームスピリットでの経験を通してとても成長しているんだなぁと感じました。

入社してから既にブログも複数書いて、今回の登壇のオファーも快諾していただき本当に感謝です。

 

そしてイベントの中で言及されたテストコンテストですがチームスピリットは企業チームとして出場していますので、よければこちらもご覧ください。

 

teamspirit.hatenablog.com

 

以上、イベントレポートでした!