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)
