技術共有

インターフェイス テストとは何ですか?インターフェイス テストを実装するにはどうすればよいですか?

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. インターフェーステストとは何ですか?
名前が示すように、インターフェイス テストは、システムまたはコンポーネント間のインターフェイスをテストすることです。主に、データの交換、転送および制御の管理プロセス、および相互の論理依存関係を検証します。インターフェースプロトコルはHTTP、WebService、Dubbo、Thrift、Socketなどに分かれており、テストの種類は主に機能テスト、パフォーマンステスト、安定性テスト、セキュリティテストなどに分かれています。

階層化テストの「ピラミッド」モデルでは、インターフェイス テストはサービス統合テストの 2 番目の層に属します。 UI 層 (主に WEB または APP) の自動テストと比較して、インターフェイスの自動テストはメリットが大きく、実装が簡単で、メンテナンスコストが低く、入出力比が高いため、すべての企業が実行する最初の選択肢です。自動テスト。

以下では、HTTP インターフェースを例として、要件分析からユースケース設計、スクリプト作成、テスト実行から結果分析まで、インターフェース自動テストプロセスを完全に紹介し、完全なユースケース設計とテストスクリプトを提供します。

2. 基本的なプロセス
基本的なインターフェイス機能の自動テスト プロセスは次のとおりです。

要件分析→ユースケース設計→スクリプト開発→テスト実行→結果分析

2.1 サンプルインターフェイス
インターフェース名:Douban動画検索

インターフェイスドキュメントのアドレス: https://developers.douban.com/wiki/?title=movie_v2#search

インターフェイス呼び出しの例:

1) キャストとスタッフから検索: https://api.douban.com/v2/movie/search?q=チャン・イーモウ

2) 映画のタイトルで検索: https://api.douban.com/v2/movie/search?q=西游之西游

3) ジャンルで検索: https://api.douban.com/v2/movie/search?tag=comedy


3. 分析が必要
要件分析とは要件や設計などの文書のことを指し、要件を理解した上で社内の実装ロジックを理解する必要があり、この段階で無理や漏れのある要件や設計が指摘されることがあります。

例: Douban 映画検索インターフェイス。私が理解している要件は、映画のタイトル、キャスト メンバー、タグの検索をサポートし、検索結果をページで返すことです。

4. ユースケースの設計
ユースケースの設計は、インターフェイスのテスト要件を理解し、MindManager や XMind などのマインド マッピング ソフトウェアを使用してテスト ケースの設計を作成することに基づいており、主な内容にはパラメータの検証、機能の検証、ビジネス シナリオの検証、セキュリティとパフォーマンスの検証などが含まれます。ユースケース設計手法には、同値クラス分割、境界値分析、シナリオ分析、特性要因図、直交表などが含まれます。

Douban 動画検索インターフェースの機能テスト部分では、主にパラメータ検証、機能検証、ビジネスシナリオ検証の 3 つの側面に焦点を当てています。設計テストの例は次のとおりです。

5. スクリプト開発

上記のテスト ケース設計に基づいて、python+nosetests フレームワークを使用して、関連する自動テスト スクリプトを作成しました。インターフェースの自動テスト、自動実行、テストレポートの電子メール送信などの機能を完全に実現できます。

5.1 関連ライブラリのインストール

必要な lib ライブラリは次のとおりです。 pip コマンドを使用してインストールできます。

  1. pip install nose
  2. pip install nose-html-reporting
  3. pip install requests

5.2 インターフェース呼び出し

リクエスト ライブラリを使用すると、上記のインターフェイス呼び出しメソッドを簡単に作成できます (q=Andy Lau の検索など、サンプル コードは次のとおりです)。

  1. #coding=utf-8
  2. import requests
  3. import json
  4. url = 'https://api.douban.com/v2/movie/search'
  5. params=dict(q=u'刘德华')
  6. r = requests.get(url, params=params)
  7. print 'Search Params:n', json.dumps(params, ensure_ascii=False)
  8. print 'Search Response:n', json.dumps(r.json(), ensure_ascii=False, indent=4)

実際に自動テスト スクリプトを作成するときは、カプセル化を実行する必要があります。次のコードでは、test_q メソッドは、nosetests が提供する yield メソッドを使用するだけで、リスト qs 内の各テスト セットを簡単にループできます。

  1. class test_doubanSearch(object):
  2. @staticmethod
  3. def search(params, expectNum=None):
  4. url = 'https://api.douban.com/v2/movie/search'
  5. r = requests.get(url, params=params)
  6. print 'Search Params:n', json.dumps(params, ensure_ascii=False)
  7. print 'Search Response:n', json.dumps(r.json(), ensure_ascii=False, indent=4)
  8. def test_q(self):
  9. # 校验搜索条件 q
  10. qs = [u'白夜追凶', u'大话西游', u'周星驰', u'张艺谋', u'周星驰,吴孟达', u'张艺谋,巩俐', u'周星驰,大话西游', u'白夜追凶,潘粤明']
  11. for q in qs:
  12. params = dict(q=q)
  13. f = partial(test_doubanSearch.search, params)
  14. f.description = json.dumps(params, ensure_ascii=False).encode('utf-8')
  15. yield (f,)

テスト ケースの設計に従って、関数ごとに自動テスト スクリプトを順番に作成できます。

5.3 結果の検証
インターフェイスを手動でテストする場合は、インターフェイスから返される結果に基づいてテストが成功するかどうかを判断する必要があります。これは自動テストの場合にも当てはまります。

このインターフェイスでは、「q=Andy Lau」を検索し、返された結果に「俳優 Andy Lau または映画タイトル Andy Lau」が含まれるかどうかを判断する必要があります。「tag=comedy」を検索する場合、そのタイプを判断する必要があります。返された結果が「コメディ」かどうか、結果をページングするときに返された結果の数が正しいかどうかを検証する必要があります。完全な結果検証コードは次のとおりです。

  1. class check_response():
  2. @staticmethod
  3. def check_result(response, params, expectNum=None):
  4. # 由于搜索结果存在模糊匹配的情况,这里简单处理只校验第一个返回结果的正确性
  5. if expectNum is not None:
  6. # 期望结果数目不为None时,只判断返回结果数目
  7. eq_(expectNum, len(response['subjects']), '{0}!={1}'.format(expectNum, len(response['subjects'])))
  8. else:
  9. if not response['subjects']:
  10. # 结果为空,直接返回失败
  11. assert False
  12. else:
  13. # 结果不为空,校验第一个结果
  14. subject = response['subjects'][0]
  15. # 先校验搜索条件tag
  16. if params.get('tag'):
  17. for word in params['tag'].split(','):
  18. genres = subject['genres']
  19. ok_(word in genres, 'Check {0} failed!'.format(word.encode('utf-8')))
  20. # 再校验搜索条件q
  21. elif params.get('q'):
  22. # 依次判断片名,导演或演员中是否含有搜索词,任意一个含有则返回成功
  23. for word in params['q'].split(','):
  24. title = [subject['title']]
  25. casts = [i['name'] for i in subject['casts']]
  26. directors = [i['name'] for i in subject['directors']]
  27. total = title + casts + directors
  28. ok_(any(word.lower() in i.lower() for i in total),
  29. 'Check {0} failed!'.format(word.encode('utf-8')))
  30. @staticmethod
  31. def check_pageSize(response):
  32. # 判断分页结果数目是否正确
  33. count = response.get('count')
  34. start = response.get('start')
  35. total = response.get('total')
  36. diff = total - start
  37. if diff >= count:
  38. expectPageSize = count
  39. elif count > diff > 0:
  40. expectPageSize = diff
  41. else:
  42. expectPageSize = 0
  43. eq_(expectPageSize, len(response['subjects']), '{0}!={1}'.format(expectPageSize, len(response['subjects'])))

5.4 テストの実行

上記のテスト スクリプトでは、nosetests コマンドを使用して自動テストを簡単に実行でき、nose-html-reporting プラグインを使用して HTML 形式のテスト レポートを生成できます。

次のようにコマンドを実行します。

nosetests -v test_doubanSearch.py:test_doubanSearch --with-html --html-report=TestReport.html

5.5 電子メールレポートの送信

テストが完了したら、smtplib モジュールが提供するメソッドを使用して、HTML 形式のテスト レポートを送信できます。基本的なプロセスは、テスト レポートの読み取り -> メールのコンテンツと添付ファイルの追加 -> メール サーバーに接続 -> メールの送信 -> 終了です。サンプル コードは次のとおりです。

  1. import smtplib
  2. from email.mime.text import MIMEText
  3. from email.mime.multipart import MIMEMultipart
  4. def send_mail():
  5. # 读取测试报告内容
  6. with open(report_file, 'r') as f:
  7. content = f.read().decode('utf-8')
  8. msg = MIMEMultipart('mixed')
  9. # 添加邮件内容
  10. msg_html = MIMEText(content, 'html', 'utf-8')
  11. msg.attach(msg_html)
  12. # 添加附件
  13. msg_attachment = MIMEText(content, 'html', 'utf-8')
  14. msg_attachment["Content-Disposition"] = 'attachment; filename="{0}"'.format(report_file)
  15. msg.attach(msg_attachment)
  16. msg['Subject'] = mail_subjet
  17. msg['From'] = mail_user
  18. msg['To'] = ';'.join(mail_to)
  19. try:
  20. # 连接邮件服务器
  21. s = smtplib.SMTP(mail_host, 25)
  22. # 登陆
  23. s.login(mail_user, mail_pwd)
  24. # 发送邮件
  25. s.sendmail(mail_user, mail_to, msg.as_string())
  26. # 退出
  27. s.quit()
  28. except Exception as e:
  29. print "Exceptioin ", e

6. 結果の分析

ノーズテストの実行後に生成されたテスト レポートを開くと、このテストでは合計 51 個のテスト ケースが実行され、そのうち 50 個が成功し、1 個が失敗したことがわかります。

失敗したユースケースでは、渡されたパラメーターが {"count": -10, "tag": "Comedy"} であることがわかります。この時点で返される結果の数は、予想される結果と一致しません ( count は負の数です。期待される結果は次のとおりです。インターフェイスはエラーを報告するか、デフォルト値の 20 を使用しますが、実際に返される結果の数は 189 です。急いでバグを Douban に報告してください - -)

7. スクリプトを完成させる
Douban ムービー検索インターフェイスの完全な自動テスト スクリプトを GitHub にアップロードしました。ダウンロードアドレス: test_demo/test_douban at master ·lovesoo/test_demo ·GitHub

ダウンロードが完了したら、次のコマンドを使用して完全なインターフェイス自動テストを実行し、最終テスト レポートを電子メールで送信します。

python test_doubanSearch.py
最後にテストレポートメールを送信します。スクリーンショットは次のとおりです。

最後に、私の記事を注意深く読んでくださった皆さんに感謝したいと思います。これはそれほど価値のあるものではありませんが、もし使えるのであれば、直接受け取ることができます。

この情報は、[ソフトウェア テスト] の友人にとって最も包括的で完全な準備倉庫となるはずです。この倉庫は、最も困難な旅を乗り越えてきた何万人ものテスト エンジニアにも役立ちます。