python 自动化接口测试(6)
迎接新的一波更新吧,这次是基于图灵机器人的一个api接口的测试。
这是api的接口:http://www.tuling123.com/openapi/api
我们试着通过浏览器直接访问看下
这是反馈的结果,那么我们来看下图灵机器人这边给的接口文档,http://www.tuling123.com/help/h_cent_webapi.jhtml?nav=doc这是文档中心,这里的编写很规范的,我们看到这个就很好知道我们想要用的接口,需要的东西,以及简单的接口说明,我们可以从这里很快的得到我们想要的信息。

这里面详细的给我们描述了需要的接口地址,包括请求格式和请求参数,那么我们接下来,来分析下,
可见这个文档给我们了请求地址,请求参数格式,那么我们接下来需要想想我们的思路,
理清我们要测试的目的,测试的思路,怎么去来写这个测试用例,怎么组织我们想要的测试结果,尽量让我们的测试更加全面,这里呢,
我的想法呢就是主要有一下, 测试api的url 测试请求方式 请求的参数,返回结果。那么我们的断言写在哪里呢,我是把断言用返回结果code加断言,

这是我整个目录
让返回结果来看看api返回值是否正确,那么我来写我的测试用例,在这里,我写的测试用例是基于yaml的文件写的,方便这里的读写,
post:
post1:
key: "aaaa"
coneent: 'sasa'
url: 'http://www.tuling123.com/openapi/api'
fangshi: 'POST'
code: "40001" #密码错误
post2:
key: "dfeb1cc8125943d29764a2f2f5c33739"
coneent: ''
url: 'http://www.tuling123.com/openapi/api'
fangshi: 'POST'
code: "40002" #未输入内容
post3:
key: "dfeb1cc8125943d29764a2f2f5c33739"
coneent: ''
fangshi: 'POST'
url: 'http://www.tuling123.com/openapi/api'
code: "40007" #格式异常
post4:
key: "dfeb1cc8125943d29764a2f2f5c33739"
coneent: 'sdsad'
fangshi: 'POST'
url: 'http://www.tuling123.com/openapi/api'
code: "40004" #次数用完
我的断言就是这些code,
那么我们写好测试用例了,下面就是来组织我们的脚本了。我喜欢吧一些我们经常用的封装起来,不管是框架也好,还是让我用起来方便吧,我一般都是简单的写几个函数,这样呢,在我接下来用的时候就特别方便了。我这里面呢使用的是第三方库,理由很简单,就是我们的第三方库提供给我们很多便利, 我使用的是requests来做的,我们大家可以看下,教程 。 这是一个中文的教程,大家可以来试试,这里因为我是文章,就不给大家讲解。大家可以看下详细的文档。接下来看下我封装的,其实就是简单的总结
# -*- coding: utf-8 -*-
# @Author : leizi
import requests,json
class reques():
def __init__(self):
self.headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:51.0) Gecko/20100101 Firefox/51.0"}
def get(self, url):#get消息
try:
r = requests.get(url, headers=self.headers)
r.encoding = 'UTF-8'
json_response = json.loads(r.text)
return json_response
except Exception as e:
print('get请求出错,出错原因:%s'%e)
return {}
def post(self, url, params):#post消息
data = json.dumps(params)
try:
r =requests.post(url,params=params,headers=self.headers)
json_response = json.loads(r.text)
return json_response
except Exception as e:
print('post请求出错,原因:%s'%e)
def delfile(self,url,params):#删除的请求
try:
del_word=requests.delete(url,params,headers=self.headers)
json_response=json.loads(del_word.text)
return json_response
except Exception as e:
return {}
print('del请求出错,原因:%s'%e)
def putfile(self,url,params):#put请求
try:
data=json.dumps(params)
me=requests.put(url,data)
json_response=json.loads(me.text)
return json_response
except Exception as e:
print('put请求出错,原因:%s'%e)
return json_response
其实没有怎么封装吧,但是呢 还是给我提供了便利。 我封装了几个请求方式,这样在接下来的使用中我可以直接使用了,我自己固定好的格式,给定的函数。
接下来就是来写我们的用例了。这里我利用了yaml和 unittest来组织用例。yaml使用方法以及剖析。http://www.cnblogs.com/c9com/archive/2013/01/05/2845539.html
unittest详细讲解:http://www.cnblogs.com/yufeihlf/p/5707929.html
# -*- coding: utf-8 -*-
# @Author : leizi
from fengzhuang.feng import reques
import yaml,unittest class Test_tuling(unittest.TestCase):
def setUp(self):
title=u'登陆测试'
self.data_file = open(r"C:\\Users\\Administrator\\Desktop\\jiejko\\data\\data.yaml","r",encoding= "utf-8")
self.data = yaml.load(self.data_file)
self.post_data=self.data['post']
def tearDown(self):
pass
def test_post1(self):
try:
self.url=self.post_data['post1']['url']
self.key=self.post_data['post1']['key']
self.coneent=self.post_data['post1']['coneent']
self.fangshi=self.post_data['post1']['fangshi']
self.code=int(self.post_data['post1']['code'])
self.parem={'key':self.key,'info':self.coneent}
if self.fangshi == 'POST':
self.me=reques().post(url=self.url,params=self.parem)
self.assertEqual(self.me['code'],self.code,msg='接口返回标识符有误')
else:
print('不支持%s方式请求'%self.fangshi)
except Exception as e:
print('用例1测试失败,原因:%s'%e) def test_post2(self):
try:
self.url=self.post_data['post2']['url']
self.key=self.post_data['post2']['key']
self.coneent=self.post_data['post2']['coneent']
self.fangshi=self.post_data['post2']['fangshi']
self.code=int(self.post_data['post2']['code'])
self.parem={'key':self.key,'info':self.coneent}
if self.fangshi == 'POST':
self.me=reques().post(url=self.url,params=self.parem)
self.assertEqual(self.me['code'],self.code,msg='接口返回标识符有误')
else:
print('不支持%s方式请求'%self.fangshi)
except Exception as e:
print('用例2测试失败,原因:%s'%e)
def test_post3(self):
try:
self.url=self.post_data['post3']['url']
self.key=self.post_data['post3']['key']
self.coneent=self.post_data['post3']['coneent']
self.fangshi=self.post_data['post3']['fangshi']
self.code=int(self.post_data['post3']['code'])
self.parem={'key':self.key,'info':self.coneent}
if self.fangshi == 'POST':
self.me=reques().post(url=self.url,params=self.parem)
self.assertEqual(self.me['code'],self.code,msg='接口返回标识符有误')
else:
print('不支持%s方式请求'%self.fangshi)
except Exception as e:
print('用例3测试失败,原因:%s'%e)
def test_post4(self):
try:
self.url=self.post_data['post4']['url']
self.key=self.post_data['post4']['key']
self.coneent=self.post_data['post4']['coneent']
self.fangshi=self.post_data['post4']['fangshi']
self.code=int(self.post_data['post4']['code'])
self.parem={'key':self.key,'info':self.coneent}
if self.fangshi == 'POST':
self.me=reques().post(url=self.url,params=self.parem)
self.assertEqual(self.me['code'],self.code,msg='接口返回标识符有误')
else:
print('不支持%s方式请求'%self.fangshi)
except Exception as e:
print('用例4测试失败,原因:%s'%e)
if __name__ == '__main__':
project_path=''
suite = unittest.TestSuite()
suite.addTest(Test_tuling("test_post4"))
suite.addTest(Test_tuling('test_post3'))
suite.addTest(Test_tuling('test_post2'))
suite.addTest(Test_tuling('test_post1s'))
temp=str(time.time())
filedir=project_path+"//report//"+temp
os.makedirs(filedir)
filename="//pyresult.html"
filepath=filedir+filename
fp=file(filepath,'wb')# 调用HTMLtestrunner来执行脚本并生成测试报告,html格式的
runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title='report',description='demo')
runner.run(suite)
这是我写的用例。那么大家可以看出来,我的写法也是简单的。就是一些简单的使用。
这边的测试报告我使用的是HTMLrunner。
详细代码:GitHub传送门
由于在后面在6的基础上进行了 优化,git clone代码后,使用下面命令
git checkout 5a9c6b041aa1b47e40df52d57727ae39f3e6319c
那么我们来看下最后的测试报告,

最后我还写了发送邮件的模块,其中加的log模块暂时还没有用在代码中。 后续的优化,这样,我就运行一下,然后最后给我发送测试报告,我不用盯着电脑了。
其实在这里,大家还可以加入多线程来跑脚本,这样比较快。
其实大家都是为了走的更远,做的更好。路在脚下,相信自己。
有疑问可以加我qq:952943386或者我的qq群194704520
也可以资助我下:

python 自动化接口测试(6)的更多相关文章
- python自动化接口测试
前几天,同组妹子说想要对接口那些异常值进行测试,能否有自动化测试的方法.仔细想了一下,工具还挺多,大概分析了一下: 1.soapui:可以对接口参数进行异常值参数化,可以加断言,一般我们会加httpc ...
- Python+reuqests自动化接口测试
1.最近自己在摸索Python+reuqests自动化接口测试,要实现某个功能,首先自己得有清晰的逻辑思路!这样效率才会很快! 思路--1.通过python读取Excel中的接口用例,2.通过pyth ...
- python+requests+unittest执行自动化接口测试
1.安装requests.xlrd.json.unittest库 <1>pip 命令安装: pip install requestspip install xlrdpip install ...
- Selenium2+python自动化39-关于面试的题
前言 最近看到群里有小伙伴贴出一组面试题,最近又是跳槽黄金季节,小编忍不住抽出一点时间总结了下, 回答不妥的地方欢迎各位高手拍砖指点. 一.selenium中如何判断元素是否存在? 首先selen ...
- 薅羊毛? 月入10万? | 这是自动化测试老司机的特长--Python自动化带你薅视频红包,一个都不放过!
一.目标场景 如今短视频横行的时代,以某短视频为首的,背后依靠着强大的资金后盾,疯狂地对平台用户进行红包轰炸. 与传统的红包不一样,视频红包包含位置的不确定性.大小不确定性.元素 ID 的不确定性 ...
- 【软件测试 Python自动化】全网最全大厂面试题,看完以后你就是面试官!
前言 为了让大家更好的理解和学习投入到Python自动化来找到一份好的资料也是学习过程中,非常重要的一个点.你的检索能力越强,你就会越容易找到最合适你的资料. 有需要的小伙伴可以复制群号 313782 ...
- 测开之Python自动化全栈工程师+性能专项(送思维导图)
测开之Python自动化全栈工程师+性能专项 功能测试基础 接口测试基础接口的通信原理与本质cookie.session.token详解接口测试的意义与测试方法接口测试用例的设计 app测试 app流 ...
- flow.ci + Github + Slack 一步步搭建 Python 自动化持续集成
理想的程序员必须懒惰,永远追随自动化法则.Automating shapes smarter future. 在一个 Python 项目的开发过程中可能会做的事情:编译.手动或自动化测试.部署环境配置 ...
- Selenium2+python自动化23-富文本(自动发帖)
前言 富文本编辑框是做web自动化最常见的场景,有很多小伙伴遇到了不知道无从下手,本篇以博客园的编辑器为例,解决如何定位富文本,输入文本内容 一.加载配置 1.打开博客园写随笔,首先需要登录,这里为了 ...
随机推荐
- 来自高维的对抗 - 逆向TinyTool自制
一.序 无论是逆向分析还是漏洞利用,我所理解的攻防博弈无非是二者在既定的某一阶段,以高维的方式进行对抗,并不断地升级维度.比如,逆向工程人员一般会选择在Root的环境下对App进行调试分析,其是以ro ...
- 架构师之路——里氏替换原则LSP
定义: 如果对每一个对类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型. 内容: 里氏替换原则通 ...
- 不要怂,就是GAN (生成式对抗网络) (六):Wasserstein GAN(WGAN) TensorFlow 代码
先来梳理一下我们之前所写的代码,原始的生成对抗网络,所要优化的目标函数为: 此目标函数可以分为两部分来看: ①固定生成器 G,优化判别器 D, 则上式可以写成如下形式: 可以转化为最小化形式: 我们编 ...
- lxc.conf解析&lxc容器能力
lxd启动容器实际是生成lxc.conf.剩下的就是LXC对容器进行控制了.所以可认为lxc.conf就是lxd和lxc之间主要的接口.lxc.conf详细属性参考: http://manpages. ...
- poj 2236
Wireless Network Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 25817 Accepted: 107 ...
- 每一个程序员都应该知道的高并发处理技巧、创业公司如何解决高并发问题、互联网高并发问题解决思路、caoz大神多年经验总结分享
本文来源于caoz梦呓公众号高并发专辑,以图形化.松耦合的方式,对互联网高并发问题做了详细解读与分析,"技术在短期内被高估,而在长期中又被低估",而不同的场景和人员成本又导致了巨头 ...
- NSTimer定时器进阶——详细介绍,循环引用分析与解决
引言 定时器:A timer waits until a certain time interval has elapsed and then fires, sending a specified m ...
- Azure Messaging-ServiceBus Messaging消息队列技术系列4-复杂对象消息是否需要支持序列化和消息持久化
在上一篇中,我们介绍了消息的顺序收发保证: Azure Messaging-ServiceBus Messaging消息队列技术系列3-消息顺序保证 在本文中我们主要介绍下复杂对象消息是否需要支持序列 ...
- 消消乐、candy crush类三消游戏程序逻辑分析
最近在开发一款类似消消乐的三消游戏,在碰到实现斜方向下落的时候卡住了很长时间.好几天没有思路,原本的思路是一次性预判多个宝石的一连串运动路径,运用缓动运动队列来实现宝石运动路径,例如 下落->滑 ...
- TypeScript设计模式之中介者、观察者
看看用TypeScript怎样实现常见的设计模式,顺便复习一下. 学模式最重要的不是记UML,而是知道什么模式可以解决什么样的问题,在做项目时碰到问题可以想到用哪个模式可以解决,UML忘了可以查,思想 ...