Python nose单元测试框架结合requests库进行web接口测试
[本文出自天外归云的博客园]
之前写过一篇关于nose使用方法的博客。最近在做一元乐购产品的接口测试,结合着python的requests库可以很方便的进行web接口测试并生成测试结果。接口测试脚本示例如下(脚本路径为“E:\forPytest\test_new_product_detail.py”):
# -*- coding: utf-8 -*-
from nose.tools import nottest,istest,assert_equal,assert_in
from nose_ittr import IttrMultiplier, ittr
import requests,json '''
用户信息配置
'''
user1 = ""
user2 = ""
pwd = "" class TestNewProductDetail(object):
__metaclass__ = IttrMultiplier '''
非进行中商品
'''
@nottest
@ittr(productId=["2016101716PT022944258","2016101411PT022935002"],accountId=[user1,user2])
def test_new_product_detail_1(self):
s = requests.Session()
url = "https://api.winyylg.com/new_product_detail.html"
periodId = ""
data = {
"productId":self.productId,
"accountId":self.accountId,
"sessionId":getSessionId(s,self.accountId,pwd),
"periodId":periodId
}
r = json.loads(s.get(url=url,params=data).text)
if self.productId == "":
assert_equal(r["result"],-1,msg="productId is null or not exists.")
else:
assert_equal(r["result"],100,msg="result not 100")
basic_asserts(r) '''
没有sessionId
没有accountId
非进行中商品
'''
@nottest
@ittr(productId=["2016101716PT022944258"])
def test_new_product_detail_2(self):
s = requests.Session()
url = "https://api.winyylg.com/new_product_detail.html"
periodId = ""
data = {
"productId":self.productId,
"periodId":periodId
}
r = json.loads(s.get(url=url,params=data).text)
assert_equal(r["result"],100,msg="result not 100")
basic_asserts(r) '''
进行中商品
'''
@istest
@ittr(productId=["2016102016PT023048118"],accountId=[user1,user2])
def test_new_product_detail_3(self):
s = requests.Session()
url = "https://api.winyylg.com/new_product_detail.html"
periodId = ""
data = {
"productId":self.productId,
"accountId":self.accountId,
"sessionId":getSessionId(s,self.accountId,pwd),
"periodId":periodId
}
r = json.loads(s.get(url=url,params=data).text)
if self.productId == "":
assert_equal(r["result"],-1,msg="productId is null or not exists.")
else:
assert_equal(r["result"],100,msg="result not 100")
basic_asserts(r)
for coupon in r["participateInfo"]["couponList"]:
assert_coupon_fields(coupon)
print coupon @nottest
def basic_asserts(result):
print "\n"
tylan_assert_in("resultDesc",result)
tylan_assert_in("product",result)
tylan_assert_in("participateInfo",result)
tylan_assert_in("prizeUser",result)
tylan_assert_in("calculationDetailUrl",result)
tylan_assert_in("imageTextUrl",result)
tylan_assert_in("additionalModel",result)
tylan_assert_in("userParticipateRecords",result)
tylan_assert_in("pastDetails",result)
#print result["participateInfo"]
tylan_assert_in("couponList",result["participateInfo"])
#print result["participateInfo"]["couponList"] @nottest
def assert_coupon_fields(result):
tylan_assert_in("couponId",result)
tylan_assert_in("couponSchemeId",result)
tylan_assert_in("couponType",result)
tylan_assert_in("status",result)
tylan_assert_in("threshold",result)
tylan_assert_in("couponAmount",result)
tylan_assert_in("remainAmount",result)
tylan_assert_in("accountId",result)
tylan_assert_in("takenId",result)
tylan_assert_in("createTime",result)
tylan_assert_in("updateTime",result)
tylan_assert_in("activeTime",result)
tylan_assert_in("expireTime",result)
tylan_assert_in("expireDay",result)
tylan_assert_in("couponName",result)
tylan_assert_in("couponDesc",result)
tylan_assert_in("couponApply",result)
tylan_assert_in("couponApplyDesc",result) @nottest
def tylan_assert_in(a,b):
assert_in(a,b,msg=a+" not include in "+str(b)) @nottest
def getSessionId(session,accountId,pwd):
url = "https://hygtest.ms.netease.com/winyyg/scripts"
data = {
"username":accountId,
"password":pwd,
"tag":"winyylg_login"
}
r = json.loads(session.post(url,data).text)
return r[0][1] '''
新的奖品详情页接口,将原来的奖品详情页的两个接口合成了一个接口:
1. https://api.winyylg.com/product_detail.html
2. https://api.winyylg.com/participate_records.html
新的接口为:https://api.winyylg.com/new_product_detail.html
接口类型为:GET
改动:去掉historyAwardUrl
请求参数:
productId
accountId
sessionId
periodId
返回参数:
result
resultDesc
product
...
participateInfo
...
couponList
...
prizeUser
...
calculationDetailUrl
imageTextUrl
additionalModel
...
userParticipateRecords
pastDetails
'''
在命令行中用例所在的目录下执行命令“nosetests --with-html-output --html-out-file=test_result.html -v”(若想查看脚本中的输出需要在命令结尾再加一个“-s”):

生成的结果文件:

利用nose框架的assert方法、@istest和@nottest装饰器、@ittr装饰器(需安装传参插件)等封装可以很方便的进行测试,再结合python的requests库就可以进行web接口测试了,非常好用。
Python nose单元测试框架结合requests库进行web接口测试的更多相关文章
- 【转】使用Python的Requests库进行web接口测试
原文地址:使用Python的Requests库进行web接口测试 1.Requests简介 Requests 是使用 Apache2 Licensed 许可证的 HTTP 库.用 Python 编写, ...
- Python nose单元测试框架的安装与使用
[本文出自天外归云的博客园] 安装(Python2下安装) pip install nose 原理与命名规则 Nose会自动查找源文件.目录或者包中的测试用例,符合正则表达式(?:^|[\b_\.%s ...
- 使用Python的Requests库进行web接口测试
1.Requests简介Requests 是使用 Apache2 Licensed 许可证的 HTTP 库.用 Python 编写,真正的为人类着想. Python 标准库中的 urllib2 模块提 ...
- Python 单元测试框架系列:聊聊 Python 的单元测试框架(一):unittest
作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...
- (转)Python爬虫利器一之Requests库的用法
官方文档 以下内容大多来自于官方文档,本文进行了一些修改和总结.要了解更多可以参考 官方文档 安装 利用 pip 安装 $ pip install requests 或者利用 easy_install ...
- python nose测试框架全面介绍十---用例的跳过
又来写nose了,这次主要介绍nose中的用例跳过应用,之前也有介绍,见python nose测试框架全面介绍四,但介绍的不详细.下面详细解析下 nose自带的SkipTest 先看看nose自带的S ...
- python nose测试框架全面介绍七--日志相关
引: 之前使用nose框架时,一直使用--logging-config的log文件来生成日志,具体的log配置可见之前python nose测试框架全面介绍四. 但使用一段时间后,发出一个问题,生成的 ...
- python nose测试框架全面介绍六--框架函数别名
之前python nose测试框架全面介绍二中介绍了nose框架的基本构成,但在实际应该中我们也会到setup_function等一系列的名字,查看管网后,我们罗列下nose框架中函数的别名 1.pa ...
- Python爬虫利器一之Requests库的用法
前言 之前我们用了 urllib 库,这个作为入门的工具还是不错的,对了解一些爬虫的基本理念,掌握爬虫爬取的流程有所帮助.入门之后,我们就需要学习一些更加高级的内容和工具来方便我们的爬取.那么这一节来 ...
随机推荐
- unix环境高级编程 读书笔记
1.上班业余时间把书下载下来,第一章读完了,但是程序只能回家运行啦!Fighting!
- Centos6.5使用yum安装mysql——快速上手必备(转)
第1步.yum安装mysql[root@stonex ~]# yum -y install mysql-server安装结果:Installed: mysql-server.x86_64 0: ...
- C++中没有finally,那么应该在哪里关闭资源?
这是一篇有趣的帖子 原文链接: http://bbs.csdn.net/topics/90070457 楼主: C++中没有finally,那么应该在哪里关闭资源? C++的try{}catch(){ ...
- SharePoint 关于拓扑错误的解决方案
Issue Topology报错信息:SharePoint Web Services Round Robin Service Load Balancer Event: EndpointFailure. ...
- 在ToolStrip中加入具有更好体验性的DateTimePicker
一. 需求的产生 很多时候,需要根据年月或日期来检索数据.在我的数据库中,如果只需要以月为单位,我一般按照200801这样的格式(yyyyMM)保存为int类型.在做数据检索时,是根据工具栏 ...
- 【Python】Windows平台下Python、Pydev连接Mysql数据库
Mysql数据库是跨平台的,不是说Python一定就要连接Mongodb. Python连接Mysql数据库是非常easy的. 首先,你要配置好Python的开发环境,详见<[Python]Wi ...
- Qt Creator中如何添加C++0x支持
最近在学习多线程编程,本人平时习惯使用Qt Creator写程序,只是作为C++编辑器,很少使用Qt library中的类. Multi Threading作为C++11标准已经纳入C++标准库了,可 ...
- ext: gridpanel中的点击事件的参数是什么意思?
listeners: { // 当用户单击列表项时激发该函数 itemclick: function(view, record, item, index, evt) //① ...
- PHP的生成器、yield和协程
虽然之前就接触了PHP的yield关键字和与之对应的生成器,但是一直没有场景去使用它,就一直没有对它上心的研究.不过公司的框架是基于php的协程实现,觉得有必要深入的瞅瞅了. 由于之前对于生成器接触不 ...
- Vue(四):实例化第一个Vue应用
实例化语法 var vm = new Vue({ // 选项 }) Vue 构造器中的内容 <!DOCTYPE html> <html> <head> <me ...