zoukankan      html  css  js  c++  java
  • unittest参数化

     本文主要用来简单介绍unittest参数化的内容

    本段话引自牛牛的博客(牛牛杂货铺-unittest参数化http://www.nnzhp.cn/archives/584):

    我们在写case的时候,如果用例的操作是一样的,就是参数不同,比如说要测一个登陆的接口,要测正常登陆的、黑名单用户登陆的、账号密码错误的等等,在unittest里面就要写多个case来测试。

    这样的情况只是调用接口的时候参数不一样而已,再写多个case的话就有点多余了,那怎么办呢,就得把这些参数都写到一个list里面, 然后循环去执行这个case。这样就可以省去写多个case了。

    unittest:单元测试框架

    ddt模块:数据驱动框架,用于将数据导入、传参。

    测试用例的类需要导入参数,则需要在类前加@ddt.ddt来修饰该类。

      函数内若需传参,则在函数前加@ddt.data(******)用于传递数据。若函数有多个入参,则在函数前加@ddt.unpack;若函数入参只有一个参数,则只有一个@ddt.data(****)即可。

      函数传参为文件时,在函数前加@ddt.file_data('文件绝对路径/文件名')

    BeautifulReport模块:生成测试报告

    (1)下面代码中的解释:def test_interface(self,**test_data):使用"**"修饰参数名,表示传入的是字典的格式 key:value
    (2)self._testMethodDoc = detail:这个变量self._testMethodDoc是用来指定用例描述的。

    
    

     unittest参数化.py的代码如下:

    import unittest
    import ddt
    import requests
    import BeautifulReport as br
    def login(username,passwd):
        print(username,passwd)
        return True
    @ddt.ddt
    class Login(unittest.TestCase):
    
        #如果是一个数组,函数有多个入参,那就写上unpack
        # @ddt.data(['u1','p1',True],['u2','p2',False],['u3','p3',True])
        # @ddt.unpack
        # def test_login(self,username,passwd,check):
        #     res = login(username,passwd)
        #     self.assertEqual(check,res)
        #
        # #下面这样只有一个参数的,就不需要些unpack了
        # @ddt.data(1,2,3,4)
        # def test_query(self,key):
        #     print('run...',key)
        #
    
        @ddt.file_data('login.yaml')
        def test_interface(self,**test_data): #代表就是每一个用例数据的那个字典。
            url = test_data.get('url') #url
            method = test_data.get('method').upper() #method
            detail = test_data.get('detail','没写用例描述')#用例描述
            self._testMethodDoc = detail #这个变量就是指定用例描述的
            data  = test_data.get('data',{}) #请求数据
            headers = test_data.get('headers',{}) #请求头
            cookies = test_data.get('cookies',{}) #cookie
            is_json = test_data.get('is_json',0)#标识入参是否为json
            check = test_data.get('check') #断言
            if method=='POST':
                if is_json:
                    res = requests.post(url, json=data, cookies=cookies, headers=headers).text
                else:
                    res = requests.post(url,data=data,cookies=cookies,headers=headers).text
            elif method=='GET':
                res = requests.get(url,params=data,cookies=cookies,headers=headers).text
            for c in check:
                self.assertIn(c,res,'%s不在%s里面'%(c,res))
    
    
    # unittest.main()
    report = br.BeautifulReport(unittest.makeSuite(Login))
    report.report('接口测试','login_report.html')

    yaml文件内填写接口参数,如下:

    -
      url : http://ip/api/user/login
      method : post
      detail : 登录接口
      data :
        username : niuhanyang
        passwd : aA123
      check :
         - sign
         - userId
    
    -
      url : http://ip/api/user/all_stu
      method : get
      check :
        - sdfsdfs
      headers :
        Referer : http://api.nnzhp.cn/
      detail : 获取所有学生信息接口
  • 相关阅读:
    杭电1075
    杭电1016深度搜索问题
    杭电1015
    stringstream
    向量的点乘和叉乘
    杭电1010
    FCKEditor2.6.3 配置
    JQuery实现全选 与 批量删除
    JQuery实现下拉框的选择 与当CheckBox为服务器控件时如何获取值的操作,实现全选与删除
    JS 对GridView的一些操作
  • 原文地址:https://www.cnblogs.com/Noul/p/9932377.html
Copyright © 2011-2022 走看看