• ddt中的data,unpack,file_data实现数据驱动--数据分离


    ddt:Class decorator for subclasses of ``unittest.TestCase``.

        -----``unittest.testcase``子类的类修饰器。

    首先介绍一下@file_data:

      1.file_data可以获取json文件和yaml文件的数据

      2.file_data需要把数据放入到独立的json文件中,使用file_data,应用json文件中的内容,与def函数中的参数个数对应,

        如下,def中的payload调用file_data中的payload;字典转json=== json.dumps(data)

    {
      "test_SHZoo_login_登录成功_001": {
        "payload": "------WebKitFormBoundary7MA4YWxkTrZu0gW
    Content-Disposition: form-data; name="txtUserName"
    
    2397244682@qq.com
    ------WebKitFormBoundary7MA4YWxkTrZu0gW
    Content-Disposition: form-data; name="txtPassword"
    
    123456
    ------WebKitFormBoundary7MA4YWxkTrZu0gW--"
      }
    }
        @file_data(os.path.join(dataPath,"api/shZoo/SHZ登录错误密码.json"))
        def test_003_login_errPwd(self,payload):
            res = self.client.send(data=payload, params=self.params)
            assertHTTPCode(res=res, code_list=[200])
            logger.info(res.text)
            self.assertIn("请输入正确的用户名",res.text)

        当然数据也可以写到一起,file_data会轮询json文件中的内容,如下json文件,放到上面的代码中,可以运行三次;

        但是这样只能做统一的校验

    {
        "test_SHZoo_login_登录成功_001":{
        "payload" :"------WebKitFormBoundary7MA4YWxkTrZu0gW
    Content-Disposition: form-data; name="txtUserName"
    
    2397244682@qq.com
    ------WebKitFormBoundary7MA4YWxkTrZu0gW
    Content-Disposition: form-data; name="txtPassword"
    
    123456
    ------WebKitFormBoundary7MA4YWxkTrZu0gW--"
      },
          "test_SHZoo_login_没有密码_002":{
        "payload" :"------WebKitFormBoundary7MA4YWxkTrZu0gW
    Content-Disposition: form-data; name="txtUserName"
    
    23972446@qq.com
    ------WebKitFormBoundary7MA4YWxkTrZu0gW
    Content-Disposition: form-data; name="txtPassword"
    
    
    ------WebKitFormBoundary7MA4YWxkTrZu0gW--"
      },
          "test_SHZoo_login_密码不正确_003":{
        "payload" :"------WebKitFormBoundary7MA4YWxkTrZu0gW
    Content-Disposition: form-data; name="txtUserName"
    
    23972446@qq.com
    ------WebKitFormBoundary7MA4YWxkTrZu0gW
    Content-Disposition: form-data; name="txtPassword"
    
    1234567
    ------WebKitFormBoundary7MA4YWxkTrZu0gW--"
      }
    }

    @data:data的数据就比较直观了  数据直接在py文件里面, 没有和py分的太远,比较直观 

    这里用到的  json.dumps(params)     type(json) == 'str'

    eg:

    @data(a,b)

    那么a和b各运行一次用例

    @data([a,d],[c,d])

    如果没有unpack,那么[a,b]当成一个参数传入用例运行

    如果有unpack,那么[a,b]被分解开,按照用例中的两个参数传递

    好像还有个parameterized库与data比较类似,可以自学

    from parameterized import parameterized

        @parameterized.expand([
            ("user_null", '', "123", "请输入帐号"),
            ("pawd_null", "user", '', "请输入密码"),
            ("login_error", "error", "error", "帐号或密码错误"),
            ("login_success", "admin", "admin123456", "admin你好"),
        ])
    import unittest,os,time,json
    from utils.client import HTTPClient
    from utils.log import logger
    from utils.config import Config,reportPath
    from utils.HTMLTestRunner_PY3 import HTMLTestRunner
    from utils.assertion import assertHTTPCode
    from ddt import ddt,data,file_data,unpack
    
    @ddt
    class test_add_stu(unittest.TestCase):
    
        url = 'http://api.nnzhp.cn/api/user/add_stu'
        # params = {}
        # logger.info(type(params))
        # params = json.dumps(params)
        # logger.info(type(params))
    
        def setUp(self):
            self.client = HTTPClient(url=self.url,method='get')
        # @data(("MAC","2","13641551222"))
    
        @data(("MAC","2","13661551222"),("MAC","2","13662231222"),("MAC","2","13631231222"),("MAC","2","13631231222"))
        @unpack
        def test_add_stu(self,name,grade,phone):
            params = {"name":name,"grade":grade,"phone":phone}
            logger.info(type(json.dumps(params)))
            # logger.info(name)
            # logger.info(grade)
            # logger.info(phone)
            res = self.client.send(data=json.dumps(params)).json()
            # logger.info(res.text)
            # json_text = json.loads(res.text)
            # logger.info(type(json_text))
            try:
                self.assertIn("请求方式错误",res['msg'])
            except:
                logger.error("校验失败,msg:{0}" .format(res['msg']))
    
    if __name__=="__main__":
    
        unittest.main(verbosity=2)

     

  • 相关阅读:
    ES5、6对异步事件的处理方式
    SQL技巧
    前端技巧
    docker start 启动失败,logs 没有日志
    mysql使用存储过程insert
    Spring 手动回滚事务/提交事务,及通过
    mysql触发器trigger 实例详解
    @PostConstruct 之NullException
    springboot 2 多数据源 hikari 连接池
    swagger 日期Date
  • 原文地址:https://www.cnblogs.com/nieliangcai/p/10497386.html
Copyright © 2020-2023  润新知