前言
我们上一次分享了FastAPI(八十四)实战开发《在线课程学习系统》--个人信息接口测试,这次我们看下修改密码。
正文
我们根据之前的需求分析,接口设计,接口开发,我们需要对修改密码接口进行测试。
1.不登陆用户
2.用户原来密码错误
3.用户密码长度不符合要求
4.密码修改成功
5.原密码校验失败
6.新旧密码不能一样
那么我们先按照上面的用例点来编写接口的测试用例。
我们还是依赖之前封装的登陆来。
import unittest
from test.userlogin import *
class TestpasswordCase(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.url = 'http://127.0.0.1:8000/user/changepassword'
@classmethod
def tearDownClass(cls) -> None:
cls.url=""
def test_userNOtlogin(self):
reponse = requests.post(self.url)
status = reponse.status_code
reslut = reponse.json()
self.assertEqual(status, 200)
self.assertEqual(reslut['code'], 421)
def test_student_error(self):
student_parame['newpassword']='1234567'
toekn=get_students_token()
headers = {
"token": toekn
}
reponse = requests.post(self.url,json=student_parame,headers=headers)
status = reponse.status_code
reslut = reponse.json()
self.assertEqual(status, 200)
self.assertEqual(reslut['code'], 100303)
def test_student_user(self):
toekn = get_students_token()
headers = {
"token": toekn
}
student_parame['newpassword']='123456'
reponse = requests.post(self.url,json=student_parame,headers=headers)
status = reponse.status_code
reslut = reponse.json()
self.assertEqual(status, 200)
self.assertEqual(reslut['code'], 100304)
self.assertEqual(reslut['message'], "新旧密码不能一样")
def test_student_new(self):
student_parame['newpassword'] = '1234567'
toekn = get_students_token()
headers = {
"token": toekn
}
reponse = requests.post(self.url, json=student_parame, headers=headers)
status = reponse.status_code
reslut = reponse.json()
print(reslut)
self.assertEqual(status, 200)
self.assertEqual(reslut['code'], 100303)
self.assertEqual(reslut['message'], "新密码长度不匹配")
def test_student_newS(self):
student_parame['newpassword'] = '0123456789'
toekn = get_students_token()
headers = {
"token": toekn
}
reponse = requests.post(self.url, json=student_parame, headers=headers)
status = reponse.status_code
reslut = reponse.json()
self.assertEqual(status, 200)
self.assertEqual(reslut['code'], 200)
self.assertEqual(reslut['message'], "成功")
def test_student_not(self):
toekn = get_students_token()
headers = {
"token": toekn
}
student_parame['newpassword'] = '01234567819'
student_parame['password'] = '01123456789'
reponse = requests.post(self.url, json=student_parame, headers=headers)
status = reponse.status_code
reslut = reponse.json()
self.assertEqual(status, 200)
self.assertEqual(reslut['code'], 100301)
self.assertEqual(reslut['message'], "原密码校验失败")
if __name__ == '__main__':
unittest.main()
用例完毕后,我们发现了两个问题。一个是请求方式,写的get,应该为post的。更新密码也出了问题。更改之后的代码如下:
@usersRouter.post(path='/changepassword')
async def changepassword(request: Request, userchangepasword: UserChangepassword,
user: UsernameRole = Depends(get_cure_user),
db: Session = Depends(get_db)):
if userchangepasword.password == userchangepasword.newpassword:
return reponse(code=100304, message='新旧密码不能一样', data='')
if len(userchangepasword.newpassword) < 8 or len(userchangepasword.newpassword) > 16:
return reponse(code=100303, message='新密码长度不匹配', data='')
username = user.username
user_name = get_user_username(db, username)
verify = verify_password(userchangepasword.password, user_name.password)
if verify:
hashpassword = get_password_hash(userchangepasword.newpassword)
user_name.password=hashpassword
try:
db.commit()
db.refresh(user_name)
except Exception as e:
logger.exception(e)
return reponse(code=100302, message='密码保存失败', data='')
request.app.state.redis.delete(user.username)
request.app.state.redis.delete(user.username + "_password")
return reponse(code=200, message="成功", data=user.username)
return reponse(code=100301, message='原密码校验失败', data='')
但是再次执行,发现了之前的方法不能用了。因为之前的设计的测试用例的时候,用户名是固定的,所以我们要对测试用例进行再次改造。
先对依赖登陆地方进行改造
import requests
login_url = 'http://127.0.0.1:8000/user/login/'
student_parame={
"username": "liwanle1i",
"password": "0123456789"
}
teacher_parame= {
"username": "liwanlei",
"password": "123456"
}
def get_students_token(parame) ->str:
reponse = requests.post(login_url, json=parame)
reslut = reponse.json()
print(parame)
print(reslut)
token = reslut['data']['token']
return token
def get_teacher_tone(parame)->str:
reponse = requests.post(login_url, json=parame)
reslut = reponse.json()
token = reslut['data']['token']
return token
接着,我们对测试用例进行改造,改造后满足测试用例跟着实际测试改变进行再次测试,测试完毕还原测试密码。
import unittest
from copy import deepcopy
from test.userlogin import *
class TestpasswordCase(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.url = 'http://127.0.0.1:8000/user/changepassword'
cls.student_parame = {
"username": "liwanle1i",
"password": "012345678910",
"newpassword": "012345678910"
}
@classmethod
def tearDownClass(cls) -> None:
cls.url=""
def setUp(self) -> None:
pass
def tearDown(self) -> None:
toekn = get_students_token(self.student_parame)
headers = {
"token": toekn
}
self.student_parame["newpassword"] = '012345678910'
requests.post(self.url, json=self.student_parame, headers=headers)
self.student_parame["password"] = '012345678910'
def test_userNOtlogin(self):
reponse = requests.post(self.url)
status = reponse.status_code
reslut = reponse.json()
self.assertEqual(status, 200)
self.assertEqual(reslut['code'], 421)
def test_student_error(self):
self.student_parame['newpassword']='1234567'
toekn=get_students_token(self.student_parame)
headers = {
"token": toekn
}
reponse = requests.post(self.url,json=self.student_parame,headers=headers)
status = reponse.status_code
reslut = reponse.json()
self.assertEqual(status, 200)
self.assertEqual(reslut['code'], 100303)
def test_student_user(self):
toekn = get_students_token(self.student_parame)
headers = {
"token": toekn
}
reponse = requests.post(self.url,json=self.student_parame,headers=headers)
status = reponse.status_code
reslut = reponse.json()
self.assertEqual(status, 200)
self.assertEqual(reslut['code'], 100304)
self.assertEqual(reslut['message'], "新旧密码不能一样")
def test_student_new(self):
self.student_parame['newpassword'] = '1234567'
toekn = get_students_token(self.student_parame)
headers = {
"token": toekn
}
reponse = requests.post(self.url, json=self.student_parame, headers=headers)
status = reponse.status_code
reslut = reponse.json()
self.assertEqual(status, 200)
self.assertEqual(reslut['code'], 100303)
self.assertEqual(reslut['message'], "新密码长度不匹配")
def test_student_newS(self):
self.student_parame['newpassword'] = '0123456789101'
toekn = get_students_token(self.student_parame)
headers = {
"token": toekn
}
reponse = requests.post(self.url, json=self.student_parame, headers=headers)
status = reponse.status_code
reslut = reponse.json()
self.student_parame['password'] = '0123456789101'
self.assertEqual(status, 200)
self.assertEqual(reslut['code'], 200)
self.assertEqual(reslut['message'], "成功")
def test_student_not(self):
toekn = get_students_token(self.student_parame)
headers = {
"token": toekn
}
self.name=deepcopy(self.student_parame)
self.name['password']='1212132213'
self.name['newpassword']='111111111111'
reponse = requests.post(self.url, json=self.name, headers=headers)
status = reponse.status_code
reslut = reponse.json()
self.assertEqual(status, 200)
self.assertEqual(reslut['code'], 100301)
self.assertEqual(reslut['message'], "原密码校验失败")
if __name__ == '__main__':
unittest.main()
改造后,我们就可以每次测试不用来会修改数据。这里修改密码和用户身份没有关系,不用区别验证用户身份。
后记
发现问题,解决问题。遇到问题,慢慢解决问题即可。
欢迎关注雷子说测试开发,后续将会持续为大家分享更多的技术知识
如果你有问题可以留言或者加我微信:952943386。
2021,一起牛转钱坤,一起牛逼。
如果觉得这篇文章还不错,来个【分享、点赞、在看】三连吧,让更多的人也看到~