第一次发言,其实也不是真的第一次,去年问过一个 appium 的问题,管理员认为我姿势不对,没审核过。这次再试试吧!
逛了半天的接口测试相关的帖子,在自动化测试框架的设计上,“个人” 感觉大家的思路不太对。感觉把简单的问题复杂化了。
我认为接口测试在测试的几个方面是最简单的:
拿 postman 来说,粘贴个 url,加个参数,选择 GET/POST,点一个按钮数据返回。
人工对比一下接口数据对不对就 OK 了----> 还有比这更简单的测试? 功能测试、单元测试、性能测试都比这儿难多了。
这么简单的测试,大家的在设计单元测试框架的思路是什么?怎样不写接口测试代码!嗯,大家都在用写代码的方式解决怎样避免写代码。
以前大多测试不会写代码,大家说:测试不会写代码没逼格。现在大多测试都会写代码了,又说:做自动化测试要只写代码没逼格?
一定要做封装,用 UI/配置文件来填写接口测试。----->这不就是在走接口工具的路么?
为什么要把简单的问题复杂化呢?只写代码就维护成本高?写做成 UI,或用各种接口配置文件,接口描述文件来写接口用例就维护成本低?
那么接口自动化的目的是什么? 主要就是解决接口工具的不足嘛。
一般接口工具有什么不足:
我觉得只要能解决以上三点不足,就是一个好的接口自动化测试框。其它各种玩法都是不必要。
我的使用的是 Python + unittest + HTMLTestRunner + requests + pymysql
帖一个加密接口的例子。
#coding=utf-8
import requests
import unittest
import json
import hashlib
import time
from ReportTestRunner import HTMLTestRunner
class edmMailSystemTest(unittest.TestCase):
def setUp(self):
self.base_url = "http://aaa.xxxx.com/mail/send"
self.now_time = int(time.time())
def md5_str(self,now_time):
# $app_key.$time.$app_ secret.'&edm-xxx' --->加密接口的处理
app_key = 'kkkk'
time_ = str(now_time)
app_secret = 'adfasdfasdf'
md5 = hashlib.md5()
md5.update(app_key + time_ + app_secret + '&edm-xxx')
md5_ = md5.hexdigest()
return md5_
def test_all_parameter_null(self):
u'''测试不传任何参数'''
r = requests.post(self.base_url)
code = r.status_code
dicts = json.loads(r.text)
print(dicts)
self.assertEqual(code,200)
self.assertEqual(dicts['status'],10021)
self.assertEqual(dicts['message'],'Parameters error!')
def test_all_parameter_incomplete(self):
u'''测试参数不完整'''
payload = {'subject':'send mail test','html':'hello, xiaoming.',}
r = requests.post(self.base_url,data=payload)
code = r.status_code
dicts = json.loads(r.text)
print(dicts)
self.assertEqual(code,200)
self.assertEqual(dicts['status'],10021)
self.assertEqual(dicts['message'],'Parameters error!')
def test_app_null(self):
u'''这个程序不存在'''
now_time = str(self.now_time)
sign = self.md5_str(self.now_time)
payload = {'subject':'send mail test',
'html':'hello, xiaoming.',
'app_key':'kkkk_app_null',
'time':now_time,
'sign':sign,
'to':'zhangsan@aaaa.com'}
r = requests.post(self.base_url,data=payload)
code = r.status_code
dicts = json.loads(r.text)
print(dicts)
self.assertEqual(code,200)
self.assertEqual(dicts['status'],10022)
self.assertEqual(dicts['message'],'The app is not Exist!')
def test_timeout(self):
u'''时间过期'''
now_time = str(self.now_time-61)
sign = self.md5_str(self.now_time)
payload = {'subject':'send mail test',
'html':'hello, xiaoming.',
'app_key':'kkkk',
'time':now_time,
'sign':sign,
'to':'zhangsan@aaaa.com'}
r = requests.post(self.base_url,data=payload)
code = r.status_code
dicts = json.loads(r.text)
print(dicts)
self.assertEqual(code,200)
self.assertEqual(dicts['status'],10027)
self.assertEqual(dicts['message'],'The time is expire!')
def test_sign_error(self):
u'''签名错误'''
now_time = str(self.now_time)
sign = self.md5_str(self.now_time)
payload = {'subject':'send mail test',
'html':'hello, xiaoming.',
'app_key':'kkkk',
'time':now_time,
'sign':sign+'aaaa',
'to':'zhangsan@aaaa.com'}
r = requests.post(self.base_url,data=payload)
code = r.status_code
dicts = json.loads(r.text)
print(dicts)
self.assertEqual(code,200)
self.assertEqual(dicts['status'],10028)
self.assertEqual(dicts['message'],'The sign is not match!')
……
加密接口,直接写代码是最灵活的了。生成 md5,取时间戳都很方便。干嘛非要封装成 UI 必然会损失这种便捷性。步接口工具的后尘。
喜欢玩工具的同学绕道~~!
测试报告
完整项目,请看我的 github:
https://github.com/defnngj/pyrequest