[本文出自天外归云的博客园]

之前写过一篇关于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接口测试的更多相关文章

  1. 【转】使用Python的Requests库进行web接口测试

    原文地址:使用Python的Requests库进行web接口测试 1.Requests简介 Requests 是使用 Apache2 Licensed 许可证的 HTTP 库.用 Python 编写, ...

  2. Python nose单元测试框架的安装与使用

    [本文出自天外归云的博客园] 安装(Python2下安装) pip install nose 原理与命名规则 Nose会自动查找源文件.目录或者包中的测试用例,符合正则表达式(?:^|[\b_\.%s ...

  3. 使用Python的Requests库进行web接口测试

    1.Requests简介Requests 是使用 Apache2 Licensed 许可证的 HTTP 库.用 Python 编写,真正的为人类着想. Python 标准库中的 urllib2 模块提 ...

  4. Python 单元测试框架系列:聊聊 Python 的单元测试框架(一):unittest

    作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...

  5. (转)Python爬虫利器一之Requests库的用法

    官方文档 以下内容大多来自于官方文档,本文进行了一些修改和总结.要了解更多可以参考 官方文档 安装 利用 pip 安装 $ pip install requests 或者利用 easy_install ...

  6. python nose测试框架全面介绍十---用例的跳过

    又来写nose了,这次主要介绍nose中的用例跳过应用,之前也有介绍,见python nose测试框架全面介绍四,但介绍的不详细.下面详细解析下 nose自带的SkipTest 先看看nose自带的S ...

  7. python nose测试框架全面介绍七--日志相关

    引: 之前使用nose框架时,一直使用--logging-config的log文件来生成日志,具体的log配置可见之前python nose测试框架全面介绍四. 但使用一段时间后,发出一个问题,生成的 ...

  8. python nose测试框架全面介绍六--框架函数别名

    之前python nose测试框架全面介绍二中介绍了nose框架的基本构成,但在实际应该中我们也会到setup_function等一系列的名字,查看管网后,我们罗列下nose框架中函数的别名 1.pa ...

  9. Python爬虫利器一之Requests库的用法

    前言 之前我们用了 urllib 库,这个作为入门的工具还是不错的,对了解一些爬虫的基本理念,掌握爬虫爬取的流程有所帮助.入门之后,我们就需要学习一些更加高级的内容和工具来方便我们的爬取.那么这一节来 ...

随机推荐

  1. 【LeetCode】215. Kth Largest Element in an Array (2 solutions)

    Kth Largest Element in an Array Find the kth largest element in an unsorted array. Note that it is t ...

  2. 使用import简化spring的配置 spring import 标签的解析 使用import或加载spring配置时,报错误There is no ID/IDREF 多个Spring配置文件import resource路径配置

    spring-import 标签的解析.使用案例: 对于spring配置文件的编写,我想,对于经历过庞大项目的人,都有那种恐惧的心理,太多的配置文件.不过,分模块都是大多数人能想到的方法,但是,怎么分 ...

  3. HDU 1907 John (Nim博弈)

    John Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submis ...

  4. appium简明教程(10)——控件定位基础

    狭义上讲,UI级的自动化测试就是让机器代替人去点来点去的过程. 但机器去点什么(点上面还是点左边),怎么点(是长按还是轻触),这些东西是必须由代码的编写者所指示清楚的. 控件定位就是解决机器点什么的问 ...

  5. javascript的崛起及其生态元素

    随着web的流行,人们花在浏览器上的时间吸引了巨头们对浏览器的重视,继而几年前富客户端概念,一批富客户端技术的涌现,如silverlight, flex等,曾经风起云涌,最终都败给了html5 和 j ...

  6. Android开发:setAlpha()方法和常用RGB颜色表----颜色, r g b分量数值(int), 16进制表示 一一对应

    杂家前文Android颜色对照表只有颜色和十六进制,有时候需要设置r g b分量的int值,如paint.setARGB(255, 127, 255, 212);就需要自己计算下分量的各个值.这里提供 ...

  7. C#基础第二天-作业答案-九九乘法表-打印星星

    题一:九九乘法表的答案 //正三角 ; i < ; i++) { ; j <= i; j++) { Console.Write("{0}*{1}={2} ", j, i ...

  8. 纯干货,Spring-data-jpa详解(转)

    本篇进行Spring-data-jpa的介绍,几乎涵盖该框架的所有方面,在日常的开发当中,基本上能满足所有需求.这里不讲解JPA和Spring-data-jpa单独使用,所有的内容都是在和Spring ...

  9. ubuntu 安装python mysqldb

    sudo apt-get install python-mysqldb #!/usr/bin/python #-*-coding:utf-8-*- ''' This file include all ...

  10. 【Android UI】如何做一个纯粹的Android app UI 设计

    原文:http://android.eoe.cn/topic/summary 许多开发者会在多个平台上发布应用.如果您打算为 Android 开发应用,请记住在不同的平台需要遵守不同的要求和惯例.在某 ...