MagicPodで自動化したシナリオの実行時間が手動実行時間より長くなってしまったので改善した話

こんにちは、かとあず(@kato_az)です。弥生でQAエンジニアをしています。
好きな勘定科目は未払金です。
先日、MagicPodを導入したブログを公開しました。
tech-blog.yayoi-kk.co.jp 今回は、自動化したシナリオの実行時間が本気を出した手動実行実行よりも遅かったことと、それに対応したお話しです。

判決「要改善」……?

リグレッションテストを自動化

ひとこと「リグレッションテスト」と言っても想像するものは人それぞれです。「あなたが言っているEndはどこのこと?」となると理解がずれてしまいます。
今回は、システムテストのリグレッションを自動化しました。具体的には、「テスト対象のスマート証憑管理にデータが入ってくる処理」から「スマート証憑管理がデータを送信する処理(と、確実に送信できたことを確認する)処理」を範囲としています。

チームが自動化したシナリオのひとつに、
Misocaからスマート証憑管理に証憑データを連携し、スマート証憑管理からYAYOI SMART CONNECTに仕訳情報を連携するシナリオ
があります。

自動化してみた

Misocaからスマート証憑管理に証憑データを連携し、スマート証憑管理からYAYOI SMART CONNECTに仕訳情報を連携するシナリオ
をもう少し具体的に書いてみます。

  • Misocaにログインする
  • Misocaで証憑を作成する
  • Misocaの操作でスマート証憑管理に証憑を連携する操作をする
  • Misocaからログアウトする
  • 連携を少し待つ
  • スマート証憑管理にログインする
  • スマート証憑管理で連携内容を確認する
  • スマート証憑管理で仕訳登録を実行する
  • スマート証憑管理からログアウトする
  • 連携を少し待つ
  • 弥生会計 オンラインにログインする
  • YAYOI SMART CONNECTに画面遷移する
  • YAYOI SMART CONNECTの「未確定の取引」に仕訳データが連携されていることを確認する

ここまでが目的としている連携のテストです。
この後、繰り返しテスト実行ができるよう、データの片付け処理をしていきます。

  • YAYOI SMART CONNECTの「未確定の取引」に登録された仕訳データを削除する
  • 弥生会計 オンラインからログアウトする
  • Misocaにログインする
  • Misocaで作成した証憑を選択し、ゴミ箱に入れる
  • Misocaからログアウトする
  • 連携を少し待つ
  • スマート証憑管理にログインする
  • スマート証憑管理でMisocaから連携された証憑が、「削除済みの証憑」に移動していることを確認する
  • スマート証憑管理からログアウトする

連携を1パターン実行するのにこれだけの操作が必要になります。

手順で記載している「連携を少し待つ」は、システム間の連携です。連携が完了するまでにかかる時間は、各システムの負荷状況によるため一定ではありません。
手動でテストしている際は、様子を見て画面更新しながらしばし待つという対応をしています。自動テストでは「様子を見ていい感じのタイミングで次の確認を始める」という手順が作れず、どうしても「一定時間の待機処理」に頼ってしまっています。

Misocaからスマート証憑管理への連携方法は全部で11パターンあります。

Misocaからスマート証憑管理へ連携するパターン
手動で実行しているリグレッションテストでは、テストのたびにランダムにパターンを選んで確認をしていますが、自動テストでは全11の連携パターンを作成しました。全11パターンを作成したら毎回全パターンの実行をしたくなりました。

実行!

11パターンのテストを実行し終えるのに、約120分かかりました。

どうして?なんとか改善をしなければ……

自動化したことで、早朝や深夜、昼休み、ミーティング中、他の作業をしながらテスト実行ができるため、人が作業をする時間は実行結果を目視確認する1分程度になり「ほぼゼロ」と言えます。

こんな時にもテスト実行できるのが自動化の強み

ただ、11パターンを私が本気を出して手動で実行したら120分もかからないのです。

改善、開始

一つ一つの処理は、手動実行するより自動実行した方が確実に早いにもかかわらず、全体の実行時間が長くなっている主な原因は以下2点です。

  • ログイン処理
  • システム間連携の待ち時間

1点目 ログイン処理について
弥生のサービスでは、前回ログイン情報のセッションが残ってしまったときに、重複ログインの確認画面を表示します。
この重複ログインの確認画面を表示した場合、処理を続行する選択をしてから進まなければなりません。
ほとんどのテスト実行では発生しないのですが、テスト実行前に正常終了できていなかった場合やセッションが残ってしまった場合、重複ログインの確認画面でテスト実行が進めなくなってしまいテストがFailで終わってしまいます。このため、「重複ログイン画面が出た場合」の分岐処理を入れる必要がありました。
これにより、手動のログイン実行よりも時間がかかってしまっています。
今後改善できるかもしれませんが、すぐに対応できる解決策がみつからないため、ひとまずテストが安定してPassするために処理の変更は入れませんでした。

2点目 システム間連携の待ち時間について
確実にシステム間のデータ連携が完了してしてから次の処理に進めるように調整をした結果、「60秒待機」「120秒待機」といった待機時間が入ることになってしまいました。
「画面更新がされたら次のステップに進む」という設定にすることで待機を最小限まで短縮することも考えましたが、自動で描画が更新されないこともあり、手順の作成が複雑になってします。
そこで思い切ってテストケースの実行順序を変更し、まとめて確認できる内容については、1回ずつ確認するのではなく、まとめて確認をするようにケースを組み替えることにしました。

Misocaからスマート証憑管理への請求書連携を例にして、具体的に説明していきます。

請求書連携テスト変更前
変更前は、連携方法ごとにケースを作成していました。請求書の連携では4つのケースになっています。
計画したシナリオのとおりになっています。

請求書連携テスト 変更前のケース

請求書連携テスト変更後
Misocaからスマート証憑管理へ連携しスマート証憑管理がYAYOI SMART CONNECTに連携を実行するところまでのケースと、YAYOI SMART CONNECTにデータ連携されたことの確認以降のケースを分離しました。
これにより、テストケースは1つ増えて請求書連携テストを完了するには、4ケースから5ケースが必要になりましたが、「連携待ち」の回数が減りました。
請求書連携テスト 変更後のケース

例示した、Misocaからスマート証憑管理への請求書連携と同じような組み替えを、Misocaからスマート証憑管理への納品書連携とMisocaからスマート証憑管理への見積書連携でも対応しました。

まとめ

11パターンのMisocaからスマート証憑管理への連携確認が約120分かかっていたところから、改善により約45分に短縮することができました。
手動で実行するよりもはやく正確にテスト実行ができるようになり、デプロイ完了から結果の確認までの短縮といったチーム内でのメリットと、「クラウド端末(テスト一括実行)」の専有時間が短くなるといった社内のチーム外へのメリットもありました。

自動テストのシナリオは、作成して終わりではありません。日々運用することで効果をもたらします。
テストの網羅率をあげることも大事ですが、作成したシナリオを運用し続け改善することも大事な対応の一つです。
今回は、はじめての自動化で手探りだったため、一度作成してから実行順序を組み替えるという方法をとりました。今後は実行する時間のことも考えてテストシナリオを検討し、テストケースを作成していきます。


弥生では、一緒に働く仲間を募集しています。

herp.careers

SageMakerの使い方まとめ

概要

弥生R&D室のsiidaです。R&D室ではSageMakerを使用して機械学習 (ML) のプロジェクトを進めています。SageMakerはMLのための様々な機能が搭載されたサービスであり、データ分析からモデル訓練、ひいてはワークフローの構築まで、SageMakerの中で完結させることができます。

今回はこれまでに投稿してきたSageMakerの使い方記事をまとめました。いわゆるAI/MLを活用したPoCの範囲で扱うSageMakerの基本的な機能を一通り網羅しています。

sagemaker

続きを読む

SageMakerでProcessingJobを使用するPythonラッパーの紹介

はじめに

こんにちは。弥生R&D室のsiidaです。R&D室ではSageMakerを使用して機械学習 (ML) のプロジェクトを進めています。SageMakerはMLのための様々な機能が搭載されたサービスであり、データ分析からモデル訓練、ひいてはワークフローの構築まで、SageMakerの中で完結させることができます。

SageMakerにはProcessingJobという機能があり、こちらはコマンドをジョブの形でサーバ上から実行できるというものです。重い計算を実行したり、再現性のある実験を行うために有用な機能ですが、実はPythonラッパーで簡単に実行することができます。今回はそのラッパーについて紹介します。

processing-job

続きを読む

ProcessingJobで使用可能なジョブ数を上げる方法

はじめに

こんにちは。弥生R&D室のsiidaです。R&D室ではSageMakerを使用して機械学習 (ML) のプロジェクトを進めています。SageMakerはMLのための様々な機能が搭載されたサービスであり、データ分析からモデル訓練、ひいてはワークフローの構築まで、SageMakerの中で完結させることができます。

SageMakerにはProcessingJobという機能があり、こちらはコマンドをジョブの形でサーバ上で実行できるというものです。重い計算を実行したり、再現性のある実験を行うために有用な機能ですが、同時に実行できるジョブの数には制限があります。今回は、この使用可能なジョブ数を上げる方法を紹介します。

背景

ProcessingJobでジョブを作成しようとしたところ、ジョブ多すぎ!という感じのエラーが。。。

なお、ジョブの作成には、下記のPythonラッパーを使用しました。

https://sagemaker.readthedocs.io/en/stable/api/training/processing.html

発生したエラー

ERROR:sagemaker:Please check the troubleshooting guide for common errors: https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-python-sdk-troubleshooting.html#sagemaker-python-sdk-troubleshooting-create-processing-job
Traceback (most recent call last):
  File "/home/sagemaker-user/processing-job-sample/trigger.py", line 116, in <module>
    main()
  File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/click/core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
  File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/click/core.py", line 1078, in main
    rv = self.invoke(ctx)
  File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/click/core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
  File "/home/sagemaker-user/processing-job-sample/trigger.py", line 105, in main
    run_processor(
  File "/home/sagemaker-user/processing-job-sample/src/processing_job_sample/processing.py", line 109, in run_processor
    processor.run(
  File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/sagemaker/workflow/pipeline_context.py", line 346, in wrapper
    return run_func(*args, **kwargs)
  File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/sagemaker/processing.py", line 1781, in run
    return super().run(
  File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/sagemaker/workflow/pipeline_context.py", line 346, in wrapper
    return run_func(*args, **kwargs)
  File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/sagemaker/processing.py", line 681, in run
    self.latest_job = ProcessingJob.start_new(
  File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/sagemaker/processing.py", line 917, in start_new
    processor.sagemaker_session.process(**process_args)
  File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/sagemaker/session.py", line 1589, in process
    self._intercept_create_request(process_request, submit, self.process.__name__)
  File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/sagemaker/session.py", line 6606, in _intercept_create_request
    return create(request)
  File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/sagemaker/session.py", line 1587, in submit
    raise e
  File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/sagemaker/session.py", line 1577, in submit
    self.sagemaker_client.create_processing_job(**request)
  File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/botocore/client.py", line 569, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/botocore/client.py", line 1023, in _make_api_call
    raise error_class(parsed_response, operation_name)
botocore.errorfactory.ResourceLimitExceeded: An error occurred (ResourceLimitExceeded) when calling the CreateProcessingJob operation: The account-level service limit 'ml.m5.24xlarge for processing job usage' is 10 Instances. Please use AWS Service Quotas to request an increase for this quota. If AWS Service Quotas is not available, contact AWS support to request an increase for this quota.

現在の設定では、使用しているインスタンスでは同時に10件のジョブまでしか利用できないとのことでした。

この件数を引き上げたいと思います。

対処法

01

まずAWSコンソールを開きます。

02

次に検索欄に "Service Quotas" と入力し、表示されたリンクをクリックします。

03

"AWSのサービス" の欄に "SageMaker" と入力し、"クォータの表示" を押します。

04

"クォータ名で検索" 欄に "<インスタンスタイプ> for processing job usage" と入力して検索します。

この際、インスタンスタイプは実際に使用しているものを設定してください。エラーメッセージ上にも表示されています。

05

表示されたクォータを開きます。

06

"アカウントレベルでの引き上げをリクエスト" をクリックします。

07

"クォータ値を引き上げる" の欄でクォータ値を設定し "リクエスト" を押せば完了!

まとめ

SageMakerのProcessingJobでジョブを作成する際にResourceLimitExceededが発生した場合、Service Quotasからジョブの最大数を引き上げることで解決できます。

本記事は下記の記事と同じ内容です。 アクセス解析を目的としてマルチポストしています。

qiita.com

弥生では一緒に働く仲間を募集しています。 ぜひエントリーお待ちしております。

herp.careers

MagicPod導入しました

こんにちは、かとあず(@kato_az)です。弥生でQAエンジニアをしています。
好きな勘定科目は未払金です。
テスト自動化ツールMagicPodを導入しましたので、紹介をします。

これは、宇宙もくにゃん。

導入目的

私が担当している「スマート証憑管理」は、2週間スプリントで開発を進めています。
2022年にサービス運用を開始した直後は搭載している機能が限定的で、全機能を対象としたリグレッションテストをすることが開発スケジュールに影響することはありませんでした。
毎回手動でテストをすることで、機能を理解する、お客さまが実際に使っている操作を知ることにつながるというメリットもあったように感じています。

しかし、機能が増えるにつれて、テストする内容も増え、「テストが間に合わないのでリリース日を調整する必要がでてきそう」という状態になってきました。
また、レトロスペクティブの中で、アジャイルテスト4象限のQ3やQ4のところに力を入れていきたいという話題があがることがありました。

アジャイルテスト4象限
引用元:https://www.scrum.org/resources/blog/how-the-four-agile-testing-quadrants-support-scrum-teams-jp

アジャイルテスト4象限のQ3やQ4を推進するために、Q2領域のテストを自動化して手離れをしなければ新しい取り組みには着手できないと感じるようになってきました。
そこで、ローコードでテストシナリオが作成できるMagicPodを導入することにしました。

ちょうど他のサービスを担当しているQAエンジニアもテスト自動化ツールを検討していたため、一緒に協力してMagicPodの導入を進めることになりました。

導入に向けて

本番環境を使ってシナリオを作成する

まずは利用ができるかの確認です。本番環境で「基本機能」と位置付けている動作シナリオをツールで実行できるかを確認する作業に着手しました。
シナリオの作り方がわからない場合は、画面右下に配置されている「お問合せ・ヘルプ」に入力して問い合わせをします。
何度かお問合せをしました。すべて翌営業日に回答をいただくことができました。回答の速さと回答内容の適切さに救われました。
私たちのチームが予定しているテストシナリオの作成が可能であることがわかりました。

調査完了!

テスト環境でシナリオを作成する

まずは、ローカル実行から

本番環境からURLやログインアカウントを変えるだけでテスト実行できそうではありましたが、本番環境と異なりテスト環境は社内からしかアクセスができないよう制限をかけています。
私たちのチームでは、テスト環境で毎日リグレッションテストができることを目標にしていたため、「ローカル端末」を使ってテスト実施をすることにしました。
そして、日々テスト実行を続けながら、シナリオのパターンを増やしていきました。
テストを実行するという点では目的は達成できていますが、「ローカル端末」を使うとテスト実行開始は手動で行わなければならず、事前にスケジュールを設定しての定期実行ができません。
このため、テスト実行担当者が不在だとテスト実行が行われないことや、「MagicPodDesktop」をインストールしているPCでしかテスト実行ができないといった不便さがありました。
また、「ローカル端末」での実行では、CIサービスを使用して定期的にテストを実行するということができません。
これらの問題点は、テスト環境においてもクラウド実行ができるようになることで解消できます。

いい感じ!

そして、クラウド実行へ

テスト環境でクラウド実行をするには、「接続元IPアドレス制限」の対応が必要です。また、「ユーザー固定IP」も設定したいという希望がありました。これらの対応は、必要になっていた他のチームが先に対応着手していました。
チーム間協力、万歳!
契約プランをスタンダードプランからエンタープライズプランに変更したり、インフラチームに協力を仰いで「接続元IPアドレス制限」の対応を進めてくれていました。
私たちのチームがスケジュール実行を開始したかったタイミングではすでにこれらの対応が完了していたため、追加の作業をすることなく、テスト環境でのクラウド実行を始めることができるようになっていました。
対応してくださったみなさん、ありがとうございます。

ありがとうございます!

現在の状況

スマート証憑管理チームでは、テスト環境で毎朝5:00からシナリオを流して実行結果をSlackに通知するようにしています。
出勤したらSlackの通知を確認することで、テスト環境に意図しない変更が入っていないかをチェックできます。
また、日中にテスト環境にデプロイをしたら、追加機能に関して手動でテストを開始するとともにリグレッションテストはMagicPodで実行をすることで、テストの期間を短縮することができるようになりました。

ヘルススコア

2024/09/09のスマート証憑管理チームのMagicPodヘルススコアです。
99点!けっこうがんばっています。

MagicPodヘルススコア(2024/09/09画面キャプチャ取得)

不足している1点は、「安定したロケータの使用」です。テストシナリオの見直しや、エンジニアとの協力によって、残りの1点を取りに行きます。
また、ヘルススコアが高いからといってテストの内容がシステムを網羅できているというわけではないということは注意しなければいけません。
作成を予定しているテストシナリオはまだすべて作り終わっていません。
メンテナンスして運用を続けながら、引き続きテストシナリオを増やしていきます。

MagicPodで検出した事象

デプロイごとのリグレッションテストを目的にしていること、開発者自身でもしっかりと動作確認をしているチームであることから、デプロイしたらMagicPodのテストがまったく動かなくなったということは発生していません。
安心安全のチームです。
それでも、意図しない変更が入ってしまうことはあります。

「スマート証憑管理」では、はじめて利用するお客さまにチュートリアルを表示する機能があります。
このチュートリアル画面の動画の位置がなぜか突然左に寄ってしまうといった事象が発生しました。
この事象をMagicPodのテストで差分として検知しました。

動画の表示位置が左に寄ってしまっている
手動のテストでは「はじめて利用するお客さま」の観点を省略してしまうことが多く、毎回チュートリアルの表示詳細までは確認していません。
このため、手動テストだけを実施していたら検知が遅れたことと思います。
動画の位置を左右中央に修正
ちなみに、このチュートリアル、「スマート証憑管理」にログイン後、画面右上にある「?」をクリックして、「使い方ガイド」を開くメニューからいつでも表示することができます。
「スマート証憑管理」でできることにどんなことがあっただろう?という方がいらっしゃいましたら、ぜひご覧ください。

導入目的は達成できている?

いろいろと試行錯誤をしているところなので、別の記事で紹介できればと考えています。

おまけ

MagicPodを使った自動テストは、QAエンジニアだけではなく、チームみんなで運用して育てていきたいと感じています。
開発者も開発者以外も知らず知らずのうちにMagicPodが身近な存在になったらいいなと思い、「ソフトウェアテスト関係者くらいしか使わない絵文字」を社内Slackのスタンプとして登録しています。
magicpod.com 「mp-」から始まるスタンプ名で登録しています。
登録する・しないの選別は完全に私の好みです。

登録したSlackスタンプ

もうすでに弥生全員がMagicPodユーザーになり始めています。

弥生では、一緒に働く仲間を募集しています。

herp.careers

もくテク「AIを活用した業務効率化 ~ChatGPT導入事例集~」を開催しました!

こんにちは!もくテク運営岩佐です。
7月18日(木)にもくテク「AIを活用した業務効率化 ~ChatGPT導入事例集~」を開催しました。

イベント概要

イベントページはこちら(※開催は終了) https://mokuteku.connpass.com/event/322629/mokuteku.connpass.com

普段から業務でChatGPTを活用されている4名の方にLTをしていただきました。

イベント動画

イベントのアーカイブ動画をYouTubeで公開しています!

youtu.be

イベントの様子

イベントの内容については、ぜひ上記YouTube動画をご覧ください!
各LTの資料も公開していますので、興味のある発表があれば目を通してみてください。

LT1:ChatGPTでお手軽エンジニアライフハック by 稲毛 太亮

speakerdeck.com

LT2:プロンプトエンジニアリングに触れてみよう by 石橋 眞

speakerdeck.com

LT3:ChatGPT APIを使ったツール作成日記 by 縞居 伸一

speakerdeck.com

LT4:ChatGPTによるお手軽データ分析 by 飯田 頌平

speakerdeck.com

もくテクについてのご案内

メンバー登録お願いします

もくテクでは今後も様々なテーマで勉強会を開催していきます!
興味のある回へのご参加や、メンバー登録などしていただけると嬉しいです。 https://mokuteku.connpass.com/mokuteku.connpass.com

一緒に働く仲間を募集しています

弥生では一緒に働く仲間を募集しています! herp.careers

SageMaker Code Editorの紹介

はじめに

こんにちは。弥生R&D室のsiidaです。R&D室ではSageMakerを使用して機械学習 (ML) のプロジェクトを進めています。SageMakerはMLのための様々な機能が搭載されたサービスであり、データ分析からモデル訓練、ひいてはワークフローの構築まで、SageMakerの中で完結させることができます。

SageMakerは元々JupyterLabのIDEを備えていましたが、こちらはNotebookの実行に最適化されたIDEであるため、データ分析であればともかくモデリングやMLシステムの構築には不向きな点がありました。

そこでCode Editorの出番です。こちらはVSCodeを元に作られたIDEで、事実上ブラウザで動作するVSCodeとして扱うことができます。ターミナルもVSCode同様の扱いとなっているため、あえてターミナルを全画面に表示することでiTermのようなローカルのターミナルと同じように操作することもできます。Vim派のユーザーにもおすすめなツールです。

本日はこのCode Editorの使い方を紹介します。

続きを読む