転送します。http://www.cnblogs.com/lovesoo/p/7845731.html
1.インタフェースのテストとは何ですか
名前が示唆するように、システムまたはコンポーネントのテストのインターフェース、主交換チェックデータ、管理および制御の転送処理、及び相互の論理的依存性との間のインターフェースをテストすることです。前記HTTPにインターフェースプロトコル、Webサービス、ダボ、倹約、ソケット及び他のタイプ、テストの種類と機能試験、性能試験、安定性試験、セキュリティテストに分割されます。
階層的なテスト「ピラミッド」モデルでは、それは、第二層インターフェイステストの統合テストサービスカテゴリに属します。自動テストの点でUI層(主にWEBまたはAPP)と比較して、試験の自動化インターフェースより大きな利益は、より高い入出力比で、低メンテナンスコストを実現しやすい、自動テストを行うことが好ましい各社です。
分析の結果に、ケースの設計で記述されたスクリプトから、要件分析からのテストの実行を、完全なテストケースの設計とテストスクリプトが用意されています。ここでは、例として、インターフェース自動テスト・プロセスへの完全な導入をHTTPインタフェースを持っています。
2.基本的な流れ
次のように基本的なインタフェース機能、自動テストのプロセスは以下のとおりです。
要件分析 - >ユースケースのデザイン - >スクリプト開発 - >テストの実行 - >結果分析
例2.1インタフェース
インターフェイス名:IMDBの検索
インターフェイスのドキュメント住所:
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.要件分析
解析は、内部ロジックを達成するための必要性のニーズを明確に理解に基づいて、参照の要件、設計ドキュメントであり、この段階では、現在の需要で行われた設計が不十分なまたは省略することができます必要があります。
以下のような:IMDBの検索インタフェース、それはタイトル、キャストとクルーの検索や表示をサポートし、検索結果ページに戻るには、ニーズの私の理解です。
例4デザイン
ケースのデザインは、理解のインタフェースのテスト要件に基づいて、またはテストケースを書くために設計された他のXMindのMindManagerのマインドマッピングソフトウェアを使用され、校正、検証機能、検証ビジネスシナリオ、およびその他の安全性とパフォーマンスの検証を含む主要なパラメータ、従来の設計手法を用いた例は、同値分割法、境界値分析、シーン解析、因果ダイアグラム、および他の直交を有します。
機能テストセクションのIMDBの検索インタフェースは次のように、我々は主に3つのパラメータチェック、機能チェック、ビジネスシナリオ、デザインのテストケースからご確認ください:
5.スクリプトの開発
上記のテストケースのデザインに合わせて用意し、我々は、関連する自動テストスクリプトを書くためのpython + nosetestsフレームワークを使用します。メッセージを送信する自動テスト、自動テスト実行とレポート機能を完了することができますインターフェイスを実装します。
5.1関連libにインストール
必要に応じてlibにライブラリは、ピップのコマンドを使用してインストールすることができます。
鼻をインストールPIP 鼻-HTML-報告インストールPIP PIPがリクエストをインストール
5.2インタフェース呼び出し
ライブラリを使用するための要求、我々は簡単に準備することができ、インタフェースメソッド呼び出し(例えば、Q =アンディ検索、次のサンプルコード)言いました:
#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:\n', json.dumps(params, ensure_ascii=False) print 'Search Response:\n', 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:\n', json.dumps(params, ensure_ascii=False) print 'Search Response:\n', 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=刘德华”,我们需要判断返回的结果中是否含有“演职人员刘德华或片名刘德华”,搜索“tag=喜剧”时,需要判断返回的结果中电影类型是否为“喜剧”,结果分页时需要校验返回的结果数是否正确等。完整结果校验代码如下:
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命令可以方便的运行自动化测试,并可使用nose-html-reporting插件生成html格式测试报告。
运行命令如下:
nosetests -v test_doubanSearch.py:test_doubanSearch --with-html --html-report=TestReport.html
5.5 发送邮件报告
测试完成之后,我们可以使用smtplib模块提供的方法发送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, "tag": "喜剧"},此时返回的结果数与我们的期望结果不一致(count为负数时,期望结果是接口报错或使用默认值20,但实际返回的结果数目是189。赶紧去给豆瓣提bug啦- -)
7. 完整脚本
豆瓣电影搜索接口的完整自动化测试脚本,我已上传到的GitHub。下载地址:
https://github.com/lovesoo/test_demo/tree/master/test_douban
下载完成之后,使用如下命令即可进行完整的接口自动化测试并通过邮件发送最终的测试报告:
python test_doubanSearch.py
最终发送测试报告邮件,截图如下:
8. 参考资料
1) requests:
http://cn.python-requests.org/zh_CN/latest/
2) nosetests:
http://nose.readthedocs.io/en/latest/testing.html
3) nose-html-reporting:
https://pypi.python.org/pypi/nose-html-reporting
转载于:https://www.cnblogs.com/wateryx/p/10790293.html