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\[email protected]\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\[email protected]\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\[email protected]\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\[email protected]\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)