zoukankan      html  css  js  c++  java
  • Python nose单元测试框架结合requests库进行web接口测试

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

    之前写过一篇关于nose使用方法的博客。最近在做一元乐购产品的接口测试,结合着python的requests库可以很方便的进行web接口测试并生成测试结果。接口测试脚本示例如下(脚本路径为“E:forPytest est_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 "
    "
        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接口测试了,非常好用。

  • 相关阅读:
    【原创】ASP.NET Web开发,实现打印Log日志,步骤详解
    [原创] ASP.NET WEBAPI 接入微信公众平台 总结,Token验证失败解决办法
    Mac安装Linux
    mac下终端的一些命令
    《Python程序设计》题库--摘
    Day 28 类的用法延伸
    Day 27 面向对象补充
    Day 24~26 类,面向对象,属性
    Q 91~100
    Q 81~90
  • 原文地址:https://www.cnblogs.com/LanTianYou/p/6532597.html
Copyright © 2011-2022 走看看