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\r\nContent-Disposition: form-data; name=\"txtUserName\"\r\n\r\n2397244682@qq.com\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"txtPassword\"\r\n\r\n123456\r\n------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\r\nContent-Disposition: form-data; name=\"txtUserName\"\r\n\r\n2397244682@qq.com\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"txtPassword\"\r\n\r\n123456\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--"
  },
      "test_SHZoo_login_沒有密碼_002":{
    "payload" :"------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"txtUserName\"\r\n\r\n23972446@qq.com\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"txtPassword\"\r\n\r\n\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--"
  },
      "test_SHZoo_login_密碼不正確_003":{
    "payload" :"------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"txtUserName\"\r\n\r\n23972446@qq.com\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"txtPassword\"\r\n\r\n1234567\r\n------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)

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM