【Squishノウハウ】SquishのテストからEメールを送信する

こちらの記事はSending E-Mail From Squish Testsの抄訳です。

Squish GUI Testerを使用すると、GUIテストの実行と検証というソフトウェア開発に不可欠な作業をすべて自動で行うことができます。ユーザーは、Squish Test Centerなどを使用して、テスト設計やテストレポートに基づく不具合の根本原因の分析など、より創造的で抽象的なタスクに集中することができます。後者のタスクには専門のチームがあることが多いため、レポート解析は通常、テストを実施したテストエンジニア自身によって行われます具合が見つかった場合はリグレッションが発生し、対応するチケットが作成されます。

当然、すべての不具合が同様のものとは限りません。GUI テストの自動化は複雑なシステムであり、テスト失敗の原因の中には、通常の GUI 検証の範囲外に属するものも存在する可能性があります。例えば、テストが実行されるハードウェア自体の問題があります。このような場合、テストエンジニアリングチームに直接属していない人たちを不具合解析の議論に参加させることが非常に有効です。

例えば、リモートデバイスへのネットワーク接続が時々ダウンするような、テストセットアップの既知の弱点があるとします。頻繁に起こることではないかもしれませんが、それが起こるとテストの実行全体が中断されてしまいます。このようなハードウェアの問題は、DevOpsエンジニアやシステム管理者の領域かもしれません。こういった場合、テストスクリプトに責任者を明記し、問題が発生したときに適切な同僚にすぐに通知できるようにすることは、非常に有益です。

Eメールは、他のチームの同僚に異常なテスト結果を通知するのに最適な方法です。メール本文に詳細なエラーの説明を含め、スクリーンショットやログファイルなどの成果物を添付すると、問題の原因究明が非常に簡単になります。Eメールを活用するもう1つの利点は、誰もがすでにメールクライアントを持っているので、別のメッセンジャープラットフォームを導入する必要がないことです。

前提条件

ここでの説明は Squish がサポートするすべてのスクリプト言語に適用されますが、ここではデモンストレーションのために Python ベースのテストスイートを使用することを想定しています。

また、メールを受けとり、受信者にリレーするSMTPサーバへのアクセスも必要です。これは、どのようなメールを送る際にも必要なものです。もし、疑問があれば、システム管理者にご確認してください。

Pythonを使用してEメールを送信する

Pythonスクリプトを使ったメール送信は、2つのステップで構成されており、それぞれ標準ライブラリの一部である専用モジュールをベースにしています。

  1. まず、email モジュールを使ってメッセージが作成されます。このモジュールはEメールメッセージを、件名、受信者、本文、そして添付ファイルのようなメッセージの構成要素を含む、個別のオブジェクトとして(EmailMessageクラスを使用して)モード化します。
  2. 次に、構成されたメッセージは smtplibモジュールを介して SMTP サーバーに送信されます。 send_message 関数がすべての grunt 処理を引き受け、メッセージがリレーされることを確認します。

それでは、件名、宛先、本文を指定してメールを送信する簡単な関数を定義してみましょう。

import email, smtplib
def sendMail(subject, to, body):
msg = email.message.EmailMessage()
msg.set_content(body)
msg['Subject'] = subject
msg['From'] = 'GUIテストチーム<noreply@example.org>'
msg['To'] = to

server = smtplib.SMTP('mail.example.org')
server.send_message(msg)

このように、SMTPサーバーのホスト名を指定することが最も確実な方法です。

致命的なエラーに対応するEメールの送信は、1つの関数を呼び出すだけで済みます。ここでは、startApplicationの呼び出しが予期せず失敗した場合に、メールを送信する例を示します。メールの本文に意図しない空白が含まれないように、textwrap.dedentを使用することにします。

try:
startApplication("my_application")
except RuntimeError as err:
sendMail( subject="Error while executing " + testSettings.testCaseName, to="Frerich Raabe <raabe@example.org>", body=textwrap.dedent(f"""\
お疲れ様です。
アプリケーションのスタートが失敗したようです。
例外のテキストはこちらになります。 : {err}
お手数ですが、解析いただけますでしょうか?
- GUIテストチームより
""") 

スクリーンショットの添付

ここまでの手順でメールの送信は可能ですが、さらに情報を添付することで、より有益なメールになります。

スクリーンショットは、起きている問題を理解する際に非常に役立つ場合があります。sendMail関数を拡張することで、デスクトップ全体のスクリーンショットを自動的にメールに添付できるようにすることができます。この場合、grabDesktopScreenshot関数が役に立ちます。以下は、sendMailの定義の修正内容です。

import email, smtplib, tempfile
def sendMail(subject, to, body):
   msg = email.message.EmailMessage()
  msg.set_content(body)
  msg['Subject'] = subject
msg['From'] = 'GUIテストチーム<noreply@example.org>'
msg['To'] = to

tmpFileName = tempfile.mktemp(suffix='.png')
try:
img = grabDesktopScreenshot()
img.save(tmpFileName)
      with open(tmpFileName, 'rb') as f:
msg.add_attachment(f.read(), maintype='image', subtype='png')
finally:
os.remove(tmpFileName)

server = smtplib.SMTP('mail.example.org')
server.send_message(msg)

これは通常ベストプラクティスとはみなされませんが、grabDesktopScreenshotの戻り値である画像オブジェクトに使用する保存メソッドが引数としてファイル名を要求するため、ここではtempfile.mktempを使用して仮のファイル名を作成しています。この関数は、スクリーンショットをファイルとして保存し、そのファイルを電子メールに添付したあとに削除しています。

より良い方法

スクリーンショットは手始めとして最適ですが、その他にもメールの内容として考慮すべきことがたくさんあります。ここでは、そのいくつかをご紹介します。

  • ApplicationContext.readStdout関数が返す、テスト中のアプリケーションの出力
  • テスト対象のアプリケーションが書き出したログファイル
  • スタックトレース。テストスクリプトのコード内でエラーが発生した正確な場所を記録します

メールの受信者は、テストの環境や背景などについて精通していない可能性があることを忘れないでください。何が起こっているのかをよりよく理解するためのコンテキストを提供できる情報は、すべて有用です。

ここで紹介されたもの以外にも、メールに含めるべきだと思う情報はありますか?以下のコメント欄でお気軽にお知らせください!

お問い合わせ

SquishをはじめとするQtのQA(品質保証)ツールにご興味がおありの方は、Qt JapanのEメールアドレス:japan@qt.ioまでお気軽にご連絡ください。概要のご説明から詳細な技術的相談、また無料のツールトライアルのご案内もいたしております。


Blog Topics:

Comments