基于Python Requests的数据驱动的HTTP接口测试
|
#!/usr/bin/env python
#coding:utf-8
class calculator:
def __init__(self, a, b):
self.a=int(a)
self.b=int(b)
def myadd(self):
return self.a+self.b
def mysubs(self):
return self.a-self.b
def mymultiply(self):
return self.a*self.b
def mydivide(self):
try:
return self.a/self.b
except ZeroDivisionError:
print ("除数不能为零")
return 9999999999999999
|
|
CalculatorTest.py
#!/usr/bin/env python
#coding:utf-8
import unittest
from Calculator import calculator
class calculatortest(unittest.TestCase):
def setUp(self):
print ("Test start!")
def test_base(self):
j=calculator(4,2)
self.assertEqual(j.myadd(),6)
self.assertEqual(j.mysubs(),2)
self.assertEqual(j.mymultiply(),8)
self.assertEqual(j.mydivide(),2)
def test_divide(self):
j=calculator(4,0)
self.assertEqual(j.mydivide(),9999999999999999)
def tearDown(self):
print ("Test end!")
if __name__=='__main__':
#构造测试集
suite=unittest.TestSuite()
suite.addTest(calculatortest("test_base"))
suite.addTest(calculatortest("test_divide"))
#运行测试集合
runner=unittest.TextTestRunner()
runner.run(suite)
|
|
94行
import StringIO
改为
import io
539行
self.outputBuffer = StringIO.StringIO()
改为
self.outputBuffer = io.StringIO()
631行
print >>sys.stderr, '\nTime Elapsed: %s' % (self.stopTime-self.startTime)
改为
print (sys.stderr, '\nTime Elapsed: %s' % (self.stopTime-self.startTime))
642行
if not rmap.has_key(cls):
改为
if not cls in rmap:
766行
uo = o.decode('latin-1')
改为
uo = o
772行
ue = e.decode('latin-1')改为
ue = e
|
|
runtest.py
#!/usr/bin/env python
#coding:utf-8
import unittest
from HTMLTestRunner import HTMLTestRunner
test_dir='./'
discover=unittest.defaultTestLoader.discover(test_dir,pattern="*Test.py")
if __name__=='__main__':
runner=unittest.TextTestRunner()
#以下用于生成测试报告
fp=open("result.html","wb")
runner =HTMLTestRunner(stream=fp,title='测试报告',description='测试用例执行报告')
runner.run(discover)
fp.close()
|


|
testLogin.py
import requests
#正确的用户名,错误的密码
url=“http://127.0.0.1:8000/login_action/
payload={{"username":"jerry","password":“000000"}}
data = requests.post(url,data=payload)
if (str(data.status_code)==‘200’) and (“用户名或者密码错误” in str(data.text))
print(“pass”)
else:
print(“Fail”)
#错误的用户名,正确的密码
url=“http://127.0.0.1:8000/login_action/
payload={{"username":“tom","password":“123456"}}
data = requests.post(url,data=payload)
if (str(data.status_code)==‘200’) and (“用户名或者密码错误” in str(data.text))
print(“pass”)
else:
print(“Fail”)
#错误的用户名,错误的密码
url=“http://127.0.0.1:8000/login_action/
payload={{"username":“tom","password":“000000"}}
data = requests.post(url,data=payload)
if (str(data.status_code)==‘200’) and (“用户名或者密码错误” in str(data.text))
print(“pass”)
else:
print(“Fail”)
#正确的用户名,正确的密码
url=“http://127.0.0.1:8000/login_action/
payload={{"username":“jerry","password":“123456"}}
data = requests.post(url,data=payload)
if (str(data.status_code)==‘200’) and (“查看购物车” in str(data.text))
print(“pass”)
else:
print(“Fail”)
|
|
testLogin.py
import unittest,requests
class mylogin(unittest.TestCase):
def setUp(self):
print("--------测试开始--------")
def test_login_1:
url=“http://127.0.0.1:8000/login_action/
payload={{"username":“tom","password":“000000"}}
data = requests.post(url,data=payload)
self.assertEqual(‘200’,str(data.status_code))
self.assertIn((“用户名或者密码错误”,str(data.text))
def test_login_2:
url=“http://127.0.0.1:8000/login_action/
payload={{"username":“jerry","password":“123456"}}
data = requests.post(url,data=payload)
self.assertEqual(‘200’,str(data.status_code))
self.assertIn((“用户名或者密码错误”,str(data.text))
def test_login_3:
url=“http://127.0.0.1:8000/login_action/
payload={{"username":“tom","password":“000000"}}
data = requests.post(url,data=payload)
self.assertEqual(‘200’,str(data.status_code))
self.assertIn((“用户名或者密码错误”,str(data.text))
def test_login_4:
url=“http://127.0.0.1:8000/login_action/
payload={{"username":“jerry","password":“000000"}}
data = requests.post(url,data=payload)
self.assertEqual(‘200’,str(data.status_code))
self.assertIn((“查看购物车”,str(data.text))
def tearDown(self):
print("--------测试结束--------")
if __name__=='__main__':
#构造测试集
suite=unittest.TestSuite()
suite.addTest(mylogin(" test_login_1 "))
suite.addTest(mylogin(" test_login_2 "))
suite.addTest(mylogin(" test_login_3 "))
suite.addTest(mylogin(" test_login_4 "))
#运行测试集合
runner=unittest.TextTestRunner()
runner.run(suite)
|
|
loginConfig.xml
<node>
<case>
<TestId>testcase001</TestId>
<Title>用户登录</Title>
<Method>post</Method>
<Desc>正确用户名,错误密码</Desc>
<Url>http://127.0.0.1:8000/login_action/</Url>
<InptArg>{"username":"jerry","password":"12345"}</InptArg>
<Result>200</Result>
<CheckWord>用户名或者密码错误</CheckWord>
</case>
<case>
<TestId>testcase002</TestId>
<Title>用户登录</Title>
<Method>post</Method>
<Desc>错误用户名,正确密码</Desc>
<Url>http://127.0.0.1:8000/login_action/</Url>
<InptArg>{"username":"smith","password":"knyzh158"}</InptArg>
<Result>200</Result>
<CheckWord>用户名或者密码错误</CheckWord>
</case>
<case>
<TestId>testcase003</TestId>
<Title>用户登录</Title>
<Method>post</Method>
<Desc>错误用户名,错误密码</Desc>
<Url>http://127.0.0.1:8000/login_action/</Url>
<InptArg>{"username":"smith","password":"12345"}</InptArg>
<Result>200</Result>
<CheckWord>用户名或者密码错误</CheckWord>
</case>
<case>
<TestId>testcase004</TestId>
<Title>用户登录</Title>
<Method>post</Method>
<Desc>正确用户名,正确密码</Desc>
<Url>http://127.0.0.1:8000/login_action/</Url>
<InptArg>{"username":"jerry","password":"knyzh158"}</InptArg>
<Result>200</Result>
<CheckWord>查看购物车</CheckWord>
</case>
</node>
|
|
<Title> 、<Method>…</Method> …,所以我们可以这样来获得。
aaa = root.getElementsByTagName('AAA')
bbb = root.getElementsByTagName('BBB')
ccc = root.getElementsByTagName('CCC')
i = 0
for keyin AAA:
aaaValue = aaa[i].firstChild.data
bbbValue = bbb[i].firstChild.data
cccValue = ccc[i].firstChild.data
print(aaaValue)
print(bbbValue)
print(cccValue)
i =i+1
|
|
loginConfig.xml
#!/usr/bin/env python
#coding:utf-8
import unittest,requests
from xml.dom import minidom
class mylogin(unittest.TestCase):
def setUp(self):
print("--------测试结束--------")
#从XML中读取数据
dom = minidom.parse('loginConfig.xml')
root = dom.documentElement
TestIds = root.getElementsByTagName('TestId')
Titles = root.getElementsByTagName('Title')
Methods = root.getElementsByTagName('Method')
Descs = root.getElementsByTagName('Desc')
Urls = root.getElementsByTagName('Url')
InptArgs = root.getElementsByTagName('InptArg')
Results = root.getElementsByTagName('Result')
CheckWords =root.getElementsByTagName('CheckWord')
i = 0
mylists=[]
for TestId in TestIds:
mydicts={}
#获取每一个数据,形成字典
mydicts["TestId"] = TestIds[i].firstChild.data
mydicts["Title"] = Titles[i].firstChild.data
mydicts["Method"] = Methods[i].firstChild.data
mydicts["Desc"] = Descs[i].firstChild.data
mydicts["Url"] = Urls[i].firstChild.data
mydicts["InptArg"] = InptArgs[i].firstChild.data
mydicts["Result"] = Results[i].firstChild.data
mydicts["CheckWord"] =CheckWords[i].firstChild.data
mylists.append(mydicts)
i = i+1
self.mylists = mylists
def test_login(self):
for mylist in self.mylists:
payload = eval(mylist["InptArg"])
url=mylist["Url"]
#发送请求
try:
if mylist["Method"] == "post":
data = requests.post(url,data=payload)
elif mylist["Method"] == "get":
data = requests.get(url,params=payload)
else:
print ("Method 参数获取错误")
except Exception as e:
self.assertEqual(mylist["Result"],"404")
else:
self.assertEqual(mylist["Result"],str(data.status_code))
self.assertIn(mylist["CheckWord"],str(data.text))
def tearDown(self):
print("--------测试结束--------")
if __name__=='__main__':
#构造测试集
suite=unittest.TestSuite()
suite.addTest(mylogin("test_login"))
#运行测试集合
runner=unittest.TextTestRunner()
runner.run(suite)
|

|
getXML.py
#!/usr/bin/env python
#coding:utf-8
from xml.dom import minidom
class GetXML():
def getxmldata(xmlfile):
#从XML中读取数据
dom = minidom.parse(xmlfile)
root = dom.documentElement
TestIds = root.getElementsByTagName('TestId')
Titles = root.getElementsByTagName('Title')
Methods = root.getElementsByTagName('Method')
Descs = root.getElementsByTagName('Desc')
Urls = root.getElementsByTagName('Url')
InptArgs = root.getElementsByTagName('InptArg')
Results = root.getElementsByTagName('Result')
CheckWords =root.getElementsByTagName('CheckWord')
i = 0
mylists=[]
for TestId in TestIds:
mydicts={}
#获取每一个数据,形成字典
mydicts["TestId"] = TestIds[i].firstChild.data
mydicts["Title"] = Titles[i].firstChild.data
mydicts["Method"] = Methods[i].firstChild.data
mydicts["Desc"] = Descs[i].firstChild.data
mydicts["Url"] = Urls[i].firstChild.data
mydicts["InptArg"] = InptArgs[i].firstChild.data
mydicts["Result"] = Results[i].firstChild.data
mydicts["CheckWord"] =CheckWords[i].firstChild.data
mylists.append(mydicts)
i = i+1
return mylists
|
|
loginConfig.xml
…
from getXML import GetXML #引入刚才建立的类
…
class mylogin(unittest.TestCase):
def setUp(self):
print("--------测试开始--------")
self.mylists = GetXML.getxmldata("loginConfig.xml")#调用类中的函数
…
|
版权声明:51Testing软件测试网原创出品,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明,否则将追究法律责任
基于Python Requests的数据驱动的HTTP接口测试的更多相关文章
- 基于python+requests的简单接口测试
在进行接口测试时,我们可以使用已有的工具(如:jmeter)进行,也可以使用python+requests进行.以下为简单的接口测试模板: 一.提取常用变量,统一配置 新建一个config.py文件, ...
- 基于Python+Requests+Pytest+YAML+Allure实现接口自动化
本项目实现接口自动化的技术选型:Python+Requests+Pytest+YAML+Allure ,主要是针对之前开发的一个接口项目来进行学习,通过 Python+Requests 来发送和处理H ...
- 基于Python + requests 的web接口自动化测试框架
之前采用JMeter进行接口测试,每次给带新人进行培训比较麻烦,干脆用python实现,将代码和用例分离,易于维护. 项目背景 公司的软件采用B/S架构,进行数据存储.分析.管理 工具选择 pytho ...
- 基于Python+requests搭建的自动化框架-实现流程化的接口串联
框架产生目的:公司走的是敏捷开发模式,编写这种框架是为了能够满足当前这种发展模式,用于前后端联调之前(后端开发完接口,前端还没有将业务处理完毕的时候)以及日后回归阶段,方便为自己腾出学(mo)习(yu ...
- Python+Requests接口测试教程(1):Fiddler抓包工具
本书涵盖内容:fiddler.http协议.json.requests+unittest+报告.bs4.数据相关(mysql/oracle/logging)等内容.刚买须知:本书是针对零基础入门接口测 ...
- 【转】基于Python的接口测试框架实例
下面小编就为大家带来一篇基于Python的接口测试框架实例.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 背景 最近公司在做消息推送,那么自然就会产生很多接口,测试 ...
- 基于python的直播间接口测试实战 详解结合项目
基于python的直播间接口测试详解 一.基本用例内容描述 以设置白名单 /advisor/setUserWhiteList.do接口为例,该方法为POST at first,先要导入一些常用到的模块 ...
- 基于python的接口测试框架设计(三)接口测试的框架
基于python的接口测试框架设计(三)接口测试的框架 其实我这里用到的是unittest单元测试框架,,这个框架好就好在比较清楚,,setup terdown都可以处理一些初始化及完成后的工作 主要 ...
- 基于Python的接口测试框架实例
文章来源:http://www.jb51.net/article/96481.htm 下面小编就为大家带来一篇基于Python的接口测试框架实例.小编觉得挺不错的,现在就分享给大家,也给大家做个参考. ...
随机推荐
- ssm整合所用全部依赖pom.xml(idea版)
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven ...
- mysql幻读、MVCC、间隙锁、意向锁(IX\IS)
IO即性能 顺序主键写性能很高,由于B+树的结构,主键如果是顺序的,则磁盘页的数据会按顺序填充,减少数据移动,随机主键则可能由于记录移动产生很多io 查询二级索引时,会再根据主键id获取数据页,产生一 ...
- 重新开始记录java教程
最近在工作上学到了很多的知识和经验,以后每天都来记录给博客园上面
- LC滤波电路分析,LC滤波电路原理及其时间常数的计算
LC滤波器具有结构简单.设备投资少.运行可靠性较高.运行费用较低等优点,应用很广泛. LC滤波器又分为单调谐滤波器.高通滤波器.双调谐滤波器及三调谐滤波器等几种. LC滤波主要是电感的电阻小,直流损耗 ...
- MATLAB中的参数估计函数详解及调用示例【联合整理】
前言 因为最近项目上的需要,才发现MATLAB的统计工具箱中的参数估计函数,觉得很简单很好用,现在把所有的参数估计函数整理一下,并在最后面附上调用示例. 参与人员 由于时间关系,这篇随笔是两个人一起整 ...
- Bootstrap Blazor 初体验
自微软去年发布blazor以来,我也一直关注着blazor的动态,从net core 3.1 到 net 5,从 server side 到 wasm client , 点点滴滴印证了 blazor ...
- STM32入门系列-库帮助文档使用
在前面文件夹介绍时,提到了stm32f10x_stdperiph_lib_um.chm文件,此文件是库函数使用帮助文档,可以直接打开如下图. 因为STM32库函数非常多,我们不可能把所有的外设函数都记 ...
- Java学习的第三十五天
1. 例1.1 例1.2 例1.3 例1.4 2.不知道为什么con的时候错误需要加入 3.明天继续写例题
- TCP/IP 基础知识
我把自己以往的文章汇总成为了 Github ,欢迎各位大佬 star https://github.com/crisxuan/bestJavaer 已提交此篇文章 要说我们接触计算机网络最多的协议,那 ...
- Nginx跳转配置
1.携带目录调转到后端,后端无目录,location配置如下 例子: i2.jusdacfj.com/ideas_edi/--10.0.2.137:7040/10.0.2.138:7040 locat ...