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)

 

原文地址:https://www.cnblogs.com/nieliangcai/p/10497386.html