Python nose单元测试框架结合requests库进行web接口测试-阿里云开发者社区

开发者社区> 天外归云> 正文

Python nose单元测试框架结合requests库进行web接口测试

简介: [本文出自天外归云的博客园] 之前写过一篇关于nose使用方法的博客。最近在做一元乐购产品的接口测试,结合着python的requests库可以很方便的进行web接口测试并生成测试结果。接口测试脚本示例如下(脚本路径为“E:\forPytest\test_new_product_detail.
+关注继续查看

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

之前写过一篇关于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 = "1"
        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 = "1"
        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 = "1"
        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接口测试了,非常好用。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Kotlin+SpringBoot服务端restful框架搭建(1)
Kotlin+SpringBoot服务端restful框架搭建(1) 本文的组要目的是完成SpringBoot集成Kotlin的一个基本项目构建,通过这个例子能够对kotlin有一个简单的了解。与其看着枯燥的教程,看看它的使用也许会更有意思。
1467 0
PostgreSQL 通过SQL接口关闭、重启数据库
PostgreSQL 通过SQL接口关闭、重启数据库
1153 0
html中的div span和frameset框架标签
Div和span 1.      div独占一层,由div九不允许有别的。 2.      span标签不是独自占用一行,span一般用来设置字体。 框架标签: 什么是框架标签,就是把一个页面分成很多块,来分别显示显示不同的页面,下面看一下这个例子就能完全懂了。
660 0
新浪微博Python客户端接口OAuth2
Keyword: Python Oauth2 微博 sina weibo   #!/usr/bin/env python # -*- coding: utf-8 -*- __version__ = '1.
1039 0
python调用阿里云产品接口
因为有些人使用爬虫访问web,浪费服务器资源不说还会影响正常用户,所以需要限制爬虫ip,本可以通过nginx或者防火墙限制,但需要重新编译nginx,开启防火墙怕又不知道会影响到哪些程序,所以 想用/etc/hosts.deny文件限制某些ip访问web的,于是配置了http:124.90.. 发现根本没用,但我之前使用该文件是可以限制ip ssh的,为什么现在不能限制http了呢,于是上网搜了下,发现如下内容: hosts.allow和hosts.deny规则的执行者为TCP wrappers,对应守护进程为tcpd;而tcpd执行依赖于程序使用了libwrap库。
10329 0
+关注
天外归云
测试开发工程师,目前就职于网易。
200
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载