断言失败了怎么清理已创建的测试数据
场景一:校验创建用户接口返回体中的字段默认值是否符合预期
(按照用例流程需要清理测试数据,但中间assert断言失败会导致用例停止,不会执行清理操作)
用例组织是这样的:
def test_case(self)
#调用adduser接口创建用户
#assert校验response的返回体字段默认值是否符合预期
#调用deleteuser接口删除创建的用户
如果assert校验失败,就会终止用例,deleteuser这一步不执行,导致测试数据未被清理。有什么办法解决这个问题?
方法一:使用try catch finally解决
将assert写在try中 将后面的清理操作写在finally里
方法二:使用pytest.assume 断言,assume断言失败后,不停止后面的执行
这种轮询校验response返回参数值是否符合预期的校验,推荐使用用pytest.assume,如果第一个参数断言失败,还会校验后面的参数,如果用assert,遇到失败就不校验后面的参数了
参考代码
expres = {'email': "", 'areacode': "", 'enabled': True, 'phone': "",
'description': "", 'is_domain': False, 'password_expires': None,
}
for key in expres:
resValue = jsonpath.jsonpath(jsonRes, "$.user." + key)[0]
pytest.assume(resValue == expres[key], "返回值与期望不一致,exp[" +key+"]="+ str(expres[key]) + "实际=" + str(resValue))
场景二:参数异常创建用户,期望是创建失败返回400,如果代码有bug,参数异常创建201,需要对创建的测试数据进行清理
用例代码如下:
def test_case1(self):
#使用异常参数调用adduser接口
#断言返回400,结束
但是如果代码有bug,参数异常创建201,需要对创建的测试数据进行清理
方法:用例中如果判断返回201就抛出一个异常,在异常exception里将userid加入垃圾桶去回收,exception不会导致后面的异常参数不执行
参考代码如下:
@pytest.mark.parametrize("invalidparm",
[{"domain_id": [getRandomString(len=32)]},{"password":["1232"]]
def test_case1(self,invalidparm):
for replaceParm in invalidparm:
#invalidparm={'domain_id': ['oxCHUZgLoGg9lbGCERPcA9aazMSt2AEs']}#replaceParm =domain_id
for replacevalue in invalidparm[replaceParm]:
try:
jsonbody = self.addOsUserBody()
jsonbody["user"][replaceParm] = replacevalue
parm ={"headers": getdomainToken,"json":jsonbody}
parm.update(jsonbody)
result = self.testapi.addOSUSERusers(parm)
jsonRes = json.loads(result.text)
pytest.assume((result.status_code in [400,404]),str(replaceParm)+"非法为"+str(replacevalue)+",exp=400,result="+str(result.status_code) )
if result.status_code == 201:
#如果参数异常返回201,就抛出一个异常,在异常里将userid加入垃圾桶去回收
raise Exception("invalid Parm Created")
except Exception:
print("触发异常,添加userid to垃圾桶")
user_id = jsonpath.jsonpath(jsonRes, "$.user.id")[0]
self.cleanUserlist.append(user_id)