インターフェース自動化テスト、完全入門編


原文の回転:http://www.cnblogs.com/lovesoo/p/7845731.html#_label 1
目次
1.インターフェーステストは何ですか?
2.基本フロー3.需要分析4.用例設計5.スクリプト開発6.結果分析7.フルネーム8.参考資料目次に戻ります
1.何がインターフェーステストですか?
名前の通り、インターフェーステストはシステムまたはコンポーネント間のインターフェースをテストし、主にデータの交換、伝達と制御管理プロセス、および相互論理依存関係を検証する.インタフェースプロトコルはHTTP、WebService、Dubbo、Thrift、Socketなどのタイプに分けられています.テストタイプは主に機能テスト、性能テスト、安定性テスト、安全性テストなどに分けられます.
層状試験の「ピラミッド」モデルでは,インターフェース試験は第二層サービス統合試験の範疇に属する.UI層(主にWEBまたはAPP)の自動化テストに比べて、インターフェース自動化テストの収益はより大きく、かつ実現しやすく、メンテナンスコストが低く、より高い投入出力比があり、各社が自動化テストを実施する優先順位です.
HTTPインターフェースを例にとって、インタフェース自動化テストの流れを完全に紹介します.需要分析から用例設計まで、脚本の作成、テストの実行から結果分析まで、完全な用例設計とテストシナリオを提供します.

 
目次に戻ります
2.基本的な流れ
基本的なインターフェース機能自動化テストの流れは以下の通りです.
需要分析->用例設計->スクリプト開発->テスト実行->結果分析
2.1例示インターフェース
インターフェイス名:豆板ムービー検索
インターフェースドキュメントのアドレス:https://developers.douban.com/wiki/?title=movie_v 2〹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=喜劇
目次に戻ります
3.需要分析
需要分析は需要、設計などの文書を参考にして、必要を理解した上で、内部の実現ロジックを明確にする必要があります.そして、この段階で需要、設計に存在する不合理または欠落点を提出することができます.
例えば、豆瓣映画検索インターフェースでは、私が理解している需要は、タイトル、キャスト、タグの検索をサポートし、ページごとに検索結果を返します.
目次に戻ります
4.用例設計
用例設計はインターフェーステストの需要を理解した上で、MindManagerやXMindなどの思惟導図ソフトウェアを使ってテスト用例設計を作成します.主な内容はパラメータチェック、機能チェック、ビジネスシーンチェック、安全性および性能チェックなどです.
豆板映画検索インターフェース機能テスト部分については、主にパラメータ検証、機能検証、ビジネスシーン検証の3つの側面から、設計テストの用例は以下の通りである.

目次に戻ります
5.スクリプト開発
上記で作成したテストケースの設計に基づいて、python+nosetestsの枠組みを使って関連自動化テストスクリプトを作成しました.インタフェース自動化テスト、自動実行及びメール送信テスト報告機能を完全に実現できます.
5.1関連libの取り付け
必要なlibライブラリは以下の通りです.pipコマンドでインストールすればいいです.
pip install nose
pip install nose-html-reporting
pip install requests
5.2インターフェース呼び出し
requestsライブラリを使って、上記のインターフェースの呼び出し方法を簡単に作成できます.
#coding=utf-8
import requests
import json
 
url = 'https://api.douban.com/v2/movie/search'
params=dict(q=u'   ')
r = requests.get(url, params=params)
print 'Search Params:
', json.dumps(params, ensure_ascii=False) print 'Search Response:
', json.dumps(r.json(), ensure_ascii=False, indent=4)

実際に自動化テストスクリプトを作成するには、いくつかのパッケージが必要です.下記のコードの中で、私達は豆板映画の検索インターフェースをカプセル化しました.test_q方法はnosetestsが提供するyield方法を使用するだけで、リストqsの各テストセットを実行するのに便利です.
class test_doubanSearch(object):

    @staticmethod
    def search(params, expectNum=None):
        url = 'https://api.douban.com/v2/movie/search'
        r = requests.get(url, params=params)
        print 'Search Params:
', json.dumps(params, ensure_ascii=False) print 'Search Response:
', json.dumps(r.json(), ensure_ascii=False, indent=4) def test_q(self): # q qs = [u' ', u' ', u' ', u' ', u' , ', u' , ', u' , ', u' , '] for q in qs: params = dict(q=q) f = partial(test_doubanSearch.search, params) f.description = json.dumps(params, ensure_ascii=False).encode('utf-8') yield (f,)

私たちはテストケースに従って設計して、順次各機能の自動化テストスクリプトを作成すればいいです.
5.3結果検証
手でインターフェースをテストする時、インターフェースを通して戻ってきた結果、今回のテストが合格するかどうかを判断します.自動化テストも同じです.
今回のインターフェースについては、「q=アンディラウ」を検索しますが、返ってきた結果には「演者劉徳華または片名劉徳華」が含まれているかどうかを判断し、「(=コメディ)」を検索する際には、引き返した結果の中で映画の種類が「喜劇」かどうかを判断しなければなりません.完全な結果検証コードは以下の通りです.
class check_response():
    @staticmethod
    def check_result(response, params, expectNum=None):
        #
        if expectNum is not None:
            #         None ,         
            eq_(expectNum, len(response['subjects']), '{0}!={1}'.format(expectNum, len(response['subjects'])))
        else:
            if not response['subjects']:
                #
                assert False
            else:
                #
                subject = response['subjects'][0]
                #        tag
                if params.get('tag'):
                    for word in params['tag'].split(','):
                        genres = subject['genres']
                        ok_(word in genres, 'Check {0} failed!'.format(word.encode('utf-8')))

                #        q
                elif params.get('q'):
                    #       ,             ,           
                    for word in params['q'].split(','):
                        title = [subject['title']]
                        casts = [i['name'] for i in subject['casts']]
                        directors = [i['name'] for i in subject['directors']]
                        total = title + casts + directors
                        ok_(any(word.lower() in i.lower() for i in total),
                            'Check {0} failed!'.format(word.encode('utf-8')))

    @staticmethod
    def check_pageSize(response):
        #             
        count = response.get('count')
        start = response.get('start')
        total = response.get('total')
        diff = total - start

        if diff >= count:
            expectPageSize = count
        elif count > diff > 0:
            expectPageSize = diff
        else:
            expectPageSize = 0

        eq_(expectPageSize, len(response['subjects']), '{0}!={1}'.format(expectPageSize, len(response['subjects'])))

5.4試験の実行
上記のテストスクリプトについては、nosetestsコマンドを使用して、自動化テストを簡単に実行できます.そして、noset-html-reportingプラグインを使って、html形式のテストレポートを作成することができます.
実行コマンドは以下の通りです.
nosetests -v test_doubanSearch.py:test_doubanSearch --with-html --html-report=TestReport.html
5.5メールレポートを送信する
テストが完了したら、smatplibモジュールで提供した方法でhtmlフォーマットのテストレポートを送ることができます.基本的な流れはテストレポートを読み込みます.メールの内容と添付ファイルを追加します.メールサーバに接続します.メールを送信します.
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

def send_mail():
    #         
    with open(report_file, 'r') as f:
        content = f.read().decode('utf-8')

    msg = MIMEMultipart('mixed')
    #       
    msg_html = MIMEText(content, 'html', 'utf-8')
    msg.attach(msg_html)

    #     
    msg_attachment = MIMEText(content, 'html', 'utf-8')
    msg_attachment["Content-Disposition"] = 'attachment; filename="{0}"'.format(report_file)
    msg.attach(msg_attachment)

    msg['Subject'] = mail_subjet
    msg['From'] = mail_user
    msg['To'] = ';'.join(mail_to)
    try:
        #        
        s = smtplib.SMTP(mail_host, 25)
        #   
        s.login(mail_user, mail_pwd)
        #     
        s.sendmail(mail_user, mail_to, msg.as_string())
        #   
        s.quit()
    except Exception as e:
        print "Exceptioin ", e

目次に戻ります
6.結果分析
nosetestsの運転完了後に作成されたテスト報告を開くと、今回のテストは全部で51件のテストケースを実行しました.50件は成功して、1件は失敗しました.

失敗した用例では、入力されたパラメータは「{count]」:-10であり、「コメディー」である.このとき戻ってきた結果の数は私たちの期待結果と一致しない(countがマイナスの場合、インターフェースエラーまたはデフォルト値20を使用することが望ましいが、実際に戻ってきた結果の数は189である.すぐに豆板にbugを提出してください.-).

目次に戻ります
7.完全スクリプト
豆瓣映画検索インターフェースの完全自動化テストスクリプトは、GitHubにアップロードされました.ダウンロード先:https://github.com/lovesoo/test_demo/tree/master/test_ドビーン
 
ダウンロードが完了したら、下記のコマンドを使って、完全なインターフェース自動化テストを行い、メールで最終的なテスト報告を送ります.
python test_doubanSearch.py
 
最終的に試験報告メールを送ります.スクリーンショットは以下の通りです.

目次に戻ります
8.参考資料
1)requests:  http://cn.python-requests.org/zh_CN/latest/
2)nosetest:  http://nose.readthedocs.io/en/latest/testing.html
3)nose-html-reporting:  https://pypi.python.org/pypi/nose-html-reporting