顾老师新作“带着ChatGPT玩转软件开发”将于今年底明年初出版
4.3 使用ChatGPT生成找回密码的测试用例和测试脚本
4.3.1 使用ChatGPT生成找回密码测试用例
1.申请生成找回密码测试用例
提示词
用户可以通过输入邮箱或手机号来找回密码。如果输入的邮箱或手机号未注册,将返回错误信息。否则,用户需输入验证码、新密码和确认密码。新密码和确认密码必须一致,且新密码不能与之前使用过的密码相同。密码设置成功后,用户将被重定向到登录页面。
新密码需满足以下条件。
•包含大小写字母、数字和特殊字符。
•长度为5-30位。
所有密码将使用SHA256进行散列处理和存储。请设计相应的测试用例。
2.生成找回密码测试用例回复
ChatGPT回答
为了确保这个用户找回密码的功能在不同情况下都能正常工作,我们需要设计一系列的测试用例。测试用例应覆盖各个正常和异常情况,确保系统在不同的输入下都能表现正确。以下是设计的一些测试用例:
1.输入有效的注册邮箱/手机号进行找回密码
•前提条件:用户已注册邮箱或手机号。
•测试步骤
Ø第一步:输入已注册的邮箱/手机号。
Ø第二步:输入验证码。
Ø第三步:输入符合规则的新密码和确认密码(密码包括大小写英文字符、数字和特殊字符,长度在5到30位之间,且两次密码一致)。
Ø第四步:系统应返回密码重置成功,并跳转至登录页面。
•预期结果:成功重置密码并返回登录页面。
2.输入未注册的邮箱/手机号
•前提条件:该邮箱或手机号没有在系统中注册。
•测试步骤
Ø第一步:输入未注册的邮箱/手机号。
Ø第二步:系统应返回错误信息:”该邮箱/手机号未注册”。
•预期结果:返回错误信息,提示用户邮箱或手机号未注册。
3.验证码输入错误
•前提条件:邮箱或手机号已注册。
•测试步骤
Ø第一步:输入已注册的邮箱/手机号。
Ø第二步:输入错误的验证码。
Ø第三步:系统应返回错误信息:“验证码错误”。
•预期结果:系统返回验证码错误,用户需要重新输入验证码。
4.新密码和确认密码不一致
•前提条件:邮箱或手机号已注册,验证码正确。
•测试步骤
Ø第一步:输入已注册的邮箱/手机号。
Ø第二步:输入验证码。
Ø第三步:输入新密码,并输入与新密码不一致的确认密码。
Ø第四步:系统应返回错误信息:“新密码与确认密码不一致”。
•预期结果:系统返回错误提示,用户需要重新输入一致的密码。
5.新密码不符合复杂度要求
•前提条件:邮箱或手机号已注册,验证码正确。
•测试步骤
Ø第一步:输入已注册的邮箱/手机号。
Ø第二步:输入验证码。
Ø第三步:输入不符合复杂度要求的密码(例如只包含数字或只有字母)。
Ø第四步:系统应返回错误信息:”新密码不符合复杂度要求”。
•预期结果:系统返回密码复杂度错误,要求用户输入包含大小写字母、数字和特殊字符的新密码。
6.新密码长度不符合要求
•前提条件:邮箱或手机号已注册,验证码正确。
•测试步骤
Ø第一步:输入已注册的邮箱/手机号。
Ø第二步:输入验证码。
Ø第三步:输入长度小于5位或大于30位的新密码。
Ø第四步:系统应返回错误信息:“新密码长度必须在5-30位之间”。
•预期结果:系统返回密码长度错误,要求用户输入符合长度要求的密码。
7.新密码已使用过
•前提条件:用户已经在以前使用过某个密码。
•测试步骤
Ø第一步:输入已注册的邮箱/手机号。
Ø第二步:输入验证码。
Ø第三步:输入一个与用户历史密码相同的新密码。
Ø第四步:系统应返回错误信息:“新密码不能与以前使用过的密码相同”。
•预期结果:系统返回密码重复使用的错误信息,要求用户选择一个新密码。
8.密码正确使用SHA256散列传输
•前提条件:用户已注册,验证码正确,新密码符合要求。
•测试步骤
Ø第一步:输入已注册的邮箱/手机号。
Ø第二步:输入验证码。
Ø第三步:输入符合规则的新密码,并提交。
Ø第四步:使用调试工具或查看后端日志,验证密码是否已经通过SHA256散列传输。
•预期结果:密码以SHA256散列的形式在网络中传输,确保密码安全。
9.验证码有效期过期
•前提条件:邮箱或手机号已注册。
•测试步骤
Ø第一步:输入已注册的邮箱/手机号。
Ø第二步:请求验证码后,等待验证码过期。
Ø第三步:输入过期的验证码。
Ø第四步:系统应返回错误信息:“验证码已过期,请重新获取”。
•预期结果:系统提示验证码已过期,用户需要重新获取验证码。
注解:不考虑验证码已过期。
10.重复请求验证码
•前提条件:邮箱或手机号已注册。
•测试步骤
Ø第一步:输入已注册的邮箱/手机号。
Ø第二步:连续多次请求验证码。
Ø第三步:系统应防止频繁请求验证码,并返回错误提示:“请稍等片刻再试”。
•预期结果:系统防止频繁请求验证码,避免滥用。
注解:不考虑频繁请求验证码。
11.空字段提交
•前提条件:邮箱或手机号已注册,验证码正确。
•测试步骤
Ø第一步:输入已注册的邮箱/手机号。
Ø第二步:输入验证码。
Ø第三步:新密码和确认密码字段为空。
Ø第四步:系统应返回错误信息:“密码不能为空”。
•预期结果:系统返回字段不能为空的错误信息。
12.用户输入的手机号格式不正确
•前提条件。邮箱或手机号未注册。
•测试步骤
Ø第一步:输入格式不正确的手机号(如缺少国家码或包含非数字字符)。
Ø第二步:系统应返回错误信息:“手机号格式不正确”。
•预期结果。系统返回手机号格式错误。
13.用户输入的邮箱格式不正确
•前提条件:邮箱或手机号未注册。
•测试步骤
Ø第一步:输入格式不正确的邮箱(例如缺少“@”符号或后缀)。
Ø第二步:系统应返回错误信息:“邮箱格式不正确”。
•预期结果。系统返回邮箱格式错误。
14.总结
这些测试用例覆盖了用户找回密码功能的正常流程和常见的错误场景,确保了系统的健壮性和安全性。通过这些测试,您可以确保系统在各种条件下都能正确处理用户请求,并且保证密码的安全性和复杂度要求得以满足。如果有其他特定场景需要测试,可以进一步补充。
3.找回密码测试用例调整
根据上一节的反馈,对找回密码的测试用例进行了如下调整。
TC-001:输入有效的注册手机号进行找回密码。
TC-002:输入有效的注册邮箱进行找回密码。
TC-003:输入未注册的邮箱。
TC-004:输入未注册的手机号。
TC-005:输入错误的验证码。
TC-006:新密码与确认密码不一致。
TC-007:新密码不符合复杂度要求。
TC-008:新密码长度不符合要求。
TC-009:新密码已被使用。
TC-010:密码通过SHA256散列进行传输。
TC-011:提交空密码。
TC-012:手机号格式不正确。
TC-013:邮箱格式不正确。
其中。
•TC-001、TC-002、TC-003、TC-004、TC-005、TC-009、TC-010和TC-011采用API测试方法实现。
•TC-006、TC-007、TC-008、TC-012和TC-013采用GUI测试方法实现。
4.3.2生成找回密码API测试用例脚本
1.申请基于的API找回密码功能测试用例脚本
提示词
编写基于Python requests库和unittest框架的测试脚本。
验证码处理页面。
VERICODE_URL="http://127.0.0.1:8080/CharGPTEbusiness/jsp/VeriCodePage.jsp"重置密码处理页面。
RECOVER_URL="http://127.0.0.1:8080/CharGPTEbusiness/jsp/RecoverPage.jsp"重置用户邮箱。
contract_email="xianggu625@126.com"重置用户手机号。
contract_phone="13681732596"重置密码。
password="Abc@123"验证码处理页面。
参见代码4-12 VeriCodePage.jsp
重置密码处理页面。
参见代码4- 13 RecoverPage.jsp
测试用例。
•TC-001:使用有效的注册手机号进行找回密码。
•TC-002:使用有效的注册邮箱进行找回密码。
•TC-003:输入未注册的邮箱进行找回密码。
•TC-004:输入未注册的手机号进行找回密码。
•TC-005:输入错误的验证码。
•TC-009:使用已被使用过的新密码。
•TC-010:使用SHA256散列传输正确的密码。
•TC-011:提交空密码。
2.基于API找回密码功能测试用例脚本回复
ChatGPT回答
下面是一个基于Python的requests库和unittest框架的测试脚本示例,涵盖了您所列的用例(TC-001、TC-002、TC-003、TC-004、TC-005、TC-009、TC-010和TC-011)。该脚本将测试验证码发送和密码重置的过程。
代码4-50 Test_Recover.py
import unittest
import requests
import hashlib
#定义常量
VERICODE_URL="http://127.0.0.1:8080/CharGPTEbusiness/jsp/VeriCodePage.jsp"
RECOVER_URL="http://127.0.0.1:8080/CharGPTEbusiness/jsp/RecoverPage.jsp"
class TestRecoverAPI(unittest.TestCase):
def setUp(self):
self.csrf_token="pz0SDKjkasMVtsOZxBviTtyEzdCrU03cU9U5fOfEy051rdq8tzXzcBNd06IyObrLfvmk9hBfQwo640Jr6z4NOZk781x8jxLOwl94"
self.vaild_email="xianggu625@126.com"
self.vaild_phone="13681732596"
self.unregistered_email="unregistered@mail.com"
self.unregistered_phone="12345678901"
self.invalid_password="short"
self.vaild_password="Abc@123"
self.used_password="Abc@123"#假设这是已使用过的密码
#向手机或邮箱发送验证码。
def send_verification_code(self,contact):
payload={
"csrftoken":self.csrf_token,
"contact":contact
}
response=requests.post(VERICODE_URL,data=payload)
return response.text
#重置用户密码。
def reset_password(self,identifying_code,new_password,confirm_password):
#SHA256 加密新密码
hashed_password=hashlib.sha256(new_password.encode()).hexdigest()
payload={
"csrftoken":self.csrf_token,
"identifyingCode":identifying_code,
"newPassword":hashed_password,
"confirmPassword":hashed_password
}
response=requests.post(RECOVER_URL,data=payload)
return response.text
#向有效手机号发送验证码。
def test_vaild_phone(self):
response=self.send_verification_code(self.vaild_phone)
self.assertIn("验证码已发送",response)
#向有效邮箱发送验证码。
def test_vaild_email(self):
response=self.send_verification_code(self.vaild_email)
self.assertIn("验证码已发送",response)
#向未注册的邮箱发送验证码。
def test_unregistered_email(self):
response=self.send_verification_code(self.unregistered_email)
self.assertIn("邮箱未注册",response)
#向未注册的手机号发送验证码。
def test_unregistered_phone(self):
response=self.send_verification_code(self.unregistered_phone)
self.assertIn("手机号未注册",response)
#处理验证码错误的情况。
def test_incorrect_verification_code(self):
#假设验证码为"123456",实际情况中应从验证码发送逻辑中获取
response=self.reset__password("123456",self.vaild_password,self.valid_password)
self.assertIn("验证码输入错误",response)
#测试已被使用的密码。
def test_used_password(self):
#假设之前已经使用过的密码
response=self.reset_password("验证码",self.used_password,self.used_password)
self.assertIn("新密码已使用过",response)
#提交的新密码为空。
def test_empty_password_submission(self):
response=self.reset_password("验证码","","")
self.assertIn("空密码提交",response)
if __name__=="__main__":
unittest.main()1.注意事项
•CSRF Token:确保CSRF token是有效的,可能需要在请求之前先获取。
•期望结果:这里的assertIn()检查期望的响应内容,您需要根据实际返回内容进行调整。
•验证码处理:发送验证码后,您需要在实际的测试中模拟验证码的输入和重置密码的过程。这里假设验证码为"123456",您需要根据实际情况进行调整。
•环境:确保您的测试环境能够访问到定义的URL。
•错误处理:实际的应用中,建议添加更多的错误处理逻辑,例如请求失败时的处理。
您可以根据需要扩展reset_password()方法以测试不同的密码输入情况。希望这个示例能帮助您进行自动化测试!
3.调整基于API找回密码功能测试用例脚本
在globals.py添加。
代码4-51 globals.py
VERICODE_URL="http://127.0.0.1:8080/CharGPTEbusiness/jsp/VeriCodePage.jsp"
RECOVER_URL="http://127.0.0.1:8080/CharGPTEbusiness/jsp/RecoverPage.jsp"
CONTRACT_EMAIL="xianggu625@126.com"
CONTRACT_PHONE="13681732596"
INVALID_CODE="000000"对Test_Recover.py做如下调整。
代码4-52 Test_Recover.py
#-*-coding:utf-8-*-
import requests
import unittest
from Util import ClassDB
from Util import CSRF
from Util import HASH
from parameterized import parameterized
from globals import Config
MESSAGES={
"OK":"登录",
"NON_EXISTER_EMAIL_OR_PHONE":"您输入的手机号或Email不存在,请重新输入!",
"INCORRECT_VERIFICATION":"验证码错误,请重新输入!",
"HAVEN_USING_PASSWORD":"这个密码以前设置过,请用一个新密码!",
"PASSWORD_NEED_HASH":"密码需要HASH散列",
}
class TestRecoverAPI(unittest.TestCase):
def setUp(self):
self.session=requests.Session()
response=self.session.get(Config.VERICODE_URL)
self.csrf=CSRF.get_csrf(response.text)
self.token={"csrftoken":self.csrf}
self.db=ClassDB()
self.db.init_login(username="",password="")
def tearDown(self):
self.db.init_db()
@parameterized.expand([
(1,Config.CONTRACT_PHONE,MESSAGES["OK"]),
(1,Config.CONTRACT_EMAIL,MESSAGES["OK"],),
(0,Config.OTHER_EMAIL,MESSAGES["NON_EXISTER_EMAIL_OR_PHONE"]),
(0,Config.OTHER_PHONE,MESSAGES["NON_EXISTER_EMAIL_OR_PHONE"]),
(1,Config.CONTRACT_EMAIL,MESSAGES["INCORRECT_VERIFICATION "]),
(1,Config.CONTRACT_EMAIL,MESSAGES["HAVEN_USING_PASSWORD"]),
])
def test_valid_contact(self,sig,contact,message):
"""TC-001-输入有效的注册手机号进行找回密码"""
"""TC-002-输入有效的注册邮箱进行找回密码"""
"""TC-003-输入未注册的邮箱"""
"""TC-004-输入未注册的手机"""
"""TC-005-验证码输入错误"""
"""TC-009-新密码已使用过"""
#进入输入手机或Email页面
uid=str(self.db.getId(Config.CONTRACT_EMAIL))
data1={
'csrftoken':self.csrf,
'contact':contact
}
#获取Uid
self.token['uid']=uid
try:
response=requests.post(Config.VERICODE_URL,data=data1,cookies=self.token)
response.raise_for_status()
except requests.exceptions.RequestException as e:
self.fail(f"请求失败:{e}")
if sig==0:
self.assertEqual(response.status_code,200)
self.assertIn(message,response.text)
else:
self.assertEqual(response.status_code,200)
self.assertIn("找回密码",response.text)
#获取验证码
if message=="验证码错误,请重新输入!":
vricode=Config.INVALID_CODE
else:
vricode=self.db.geveriCode(uid)
if message=="这个密码以前设置过,请用一个新密码!":
newpassword=Config.VALID_PASSWORD
else:
newpassword=Config.DIFF_PASSWORD
data2={
'csrftoken':self.csrf,
'identifyingCode':vricode,
'newPassword':HASH.hash_password(newpassword),
'confirmPassword':HASH.hash_password(newpassword)
}
#进入输入新密码页面
self.csrf=CSRF.get_csrf(response.text)
try:
response=requests.post(Config.RECOVER_URL,data=data2,cookies=self.token)
response.raise_for_status()
except requests.exceptions.RequestException as e:
self.fail(f"请求失败:{e}")
self.assertEqual(response.status_code,200)
self.assertIn(message,response.text)
@parameterized.expand([
(Config.VALID_PASSWORD),
(Config.ZERO_SIZE_STRING),
])
def test_recover_password_by_password_format_no_hash256(self,newpassword):
"""TC-010-密码正确使用SHA256散列传输"""
"""TC-011-空字段提交"""
#进入输入手机或Email页面
uid=str(self.db.getId(Config.CONTRACT_EMAIL))
data1={
'csrftoken':self.csrf,
'contact':Config.CONTRACT_EMAIL
}
#获取Uid
self.token['uid']=uid
try:
response=requests.post(Config.VERICODE_URL,data=data1,cookies=self.token)
response.raise_for_status()
except requests.exceptions.RequestException as e:
self.fail(f"请求失败:{e}")
self.assertEqual(response.status_code,200)
self.assertIn("找回密码",response.text)
#获取验证码
vricode=self.db.geveriCode(uid)
data2={
'csrftoken':self.csrf,
'identifyingCode':vricode,
'newPassword':newpassword,
'confirmPassword':newpassword
}
#进入输入新密码页面
self.csrf=CSRF.get_csrf(response.text)
try:
response=requests.post(Config.RECOVER_URL,data=data2,cookies=self.token)
response.raise_for_status()
except requests.exceptions.RequestException as e:
self.fail(f"请求失败:{e}")
self.assertEqual(response.status_code,200)
self.assertIn(MESSAGES["PASSWORD_NEED_HASH"],response.text)
if __name__=="__main__":
unittest.main()4.3.3生成找回密码GUI注册测试用例脚本
1.申请基于的GUI找回密码功能测试用例脚本
提示词
对下面用例书写基于playwright和pytest的书写测试脚本。
前端代码。
登录页面
参看代码4-1 login.html
2)输入手机号码或电子邮箱
参看代码4-12VeriCodePage.jsp
3)重置密码
参看代码4-11 RecoverPage.jsp
•GTC-001(TC-006):新密码与确认密码不一致。
•GTC-002(TC-007):新密码未满足复杂度要求。
•GTC-003(TC-008):新密码长度不符合规定。
•GTC-004(TC-012):用户输入的手机号格式不正确。
•GTC-005(TC-013):用户输入的邮箱格式不正确。
2.基于GUI找回密码功能测试用例脚本回复
ChatGPT回答
以下是基于Playwright和pytest的自动化测试脚本,用于测试找回密码页面的相关用例(GTC-001、GTC-002、GTC-003、GTC-004和GTC-005)。脚本模拟了用户在找回密码页面的操作,验证了新密码和确认密码是否一致、密码的复杂度要求、密码长度、手机号和邮箱格式的正确性。
1.安装Playwright和pytest
首先,您需要安装playwright和pytest以及Playwright的浏览器。
pip install playwright pytest
python-m playwright install2.测试脚本
代码4-53 Test_Recover_GUI.py
import pytest
from playwright.sync_APIimport sync_playwright
#测试数据
VALID_PHONE="13681732596"
VALID_EMAIL="xianggu625@126.com"
INVALID_PHONE="12345"
INVALID_EMAIL="invalid-email"
VALID_PASSWORD="Abc@123"
WEAK_PASSWORD="abc123"
SHORT_PASSWORD="abc"
#启动Playwright浏览器和页面
@pytest.fixture(scope="function")
def page():
with sync_playwright()as p:
browser=p.chromium.launch(headless=False)#headless=False 会显示浏览器
context=browser.new_context()
page=context.new_page()
yield page
browser.close()
#GTC-001:新密码和确认密码不一致
def test_password_mismatch(page):
page.goto("http://127.0.0.1:8080/CharGPTEbusiness/jsp/RecoverPage.jsp")
#填写验证码
page.fill("#identifyingCode","123456")
#填写不一致的新密码和确认密码
page.fill("#newPassword","Abc@123")
page.fill("#confirmPassword","Abc@124")
page.click("button[type='submit']")
#检查错误提示
error_message=page.inner_text("#recoverError")
assert "新密码和确认密码不一致" in error_message
#GTC-002:新密码不符合复杂度要求
def test_password_complexity(page):
page.goto("http://127.0.0.1:8080/CharGPTEbusiness/jsp/RecoverPage.jsp")
#填写验证码
page.fill("#identifyingCode","123456")
#填写不符合复杂度要求的新密码
page.fill("#newPassword","abcdefg")
page.fill("#confirmPassword","abcdefg")
page.click("button[type='submit']")
#检查错误提示
error_message=page.inner_text("#newPasswordError")
assert "新密码不符合复杂度要求" in error_message
#GTC-003:新密码长度不符合要求
def test_password_length(page):
page.goto("http://127.0.0.1:8080/CharGPTEbusiness/jsp/RecoverPage.jsp")
#填写验证码
page.fill("#identifyingCode","123456")
#填写长度过短的新密码
page.fill("#newPassword","abc")
page.fill("#confirmPassword","abc")
page.click("button[type='submit']")
#检查错误提示
error_message=page.inner_text("#newPasswordError")
assert "新密码长度不符合要求" in error_message
#GTC-004:用户输入的手机号格式不正确
def test_invalid_phone_format(page):
page.goto("http://127.0.0.1:8080/CharGPTEbusiness/jsp/VeriCodePage.jsp")
#填写不正确的手机号格式
page.fill("#contact",INVALID_PHONE)
page.click("#sendCode")
#检查错误提示
error_message=page.inner_text("#contactError")
assert "手机号格式不正确" in error_message
#GTC-005:用户输入的邮箱格式不正确
def test_invailid_email_format(page):
page.goto("http://127.0.0.1:8080/CharGPTEbusiness/jsp/VeriCodePage.jsp")
#填写不正确的邮箱格式
page.fill("#contact",INVALID_EMAIL)
page.click("#sendCode")
#检查错误提示
error_message=page.inner_text("#contactError")
assert "邮箱格式不正确" in error_message3.测试用例解释
•test_password_mismatch():模拟用户输入的新密码和确认密码不一致的情况。系统应该提示“新密码和确认密码不一致”。
•test_password_complexity():模拟用户输入不符合复杂度要求的密码(例如只有字母),系统应该提示“新密码不符合复杂度要求”。
•test_password_length():模拟用户输入长度过短的密码(例如只有3个字符),系统应该提示“新密码长度不符合要求”。
•test_invalid_phone_format():模拟用户输入格式错误的手机号(例如只有5位数),系统应该提示“手机号格式不正确”。
•test_invailid_email_format():模拟用户输入格式错误的邮箱地址(例如没有@符号),系统应该提示“邮箱格式不正确”。
4.启动和运行测试
使用pytest运行测试脚本:
pytest-sv Test_Recover_GUI.py5.其他提示
•Playwright的选择器:我们使用了#identifyingCode,#newPassword,#confirmPassword等选择器来定位页面元素。根据实际页面的HTML结构,选择器可能需要调整。
•Playwright的sync_playwright:此示例使用同步API,确保操作按顺序执行。Playwright也支持异步API,您可以根据需要选择不同的实现。
•浏览器设置:headless=False会显示浏览器界面,您可以改为headless=True来运行无界面的测试。
该脚本能够测试页面中关于密码找回和格式验证的功能,并且能够在浏览器中模拟用户操作。
3.调整基于GUI找回密码功能测试用例脚本
在globals.py添加。
代码4-54 globals.py
SIMPLE_PASSWORD="12345"
SPACE_EMAIL_1=" "+CONTRACT_EMAIL+" "
SPACE_PHONE_1=" "+CONTRACT_PHONE+" "对Test_Recover_GUI.py做如下调整。
代码4-55 Test_Recover_GUI.py
import pytest
from playwright.sync_api import Page
from Util import ClassDB
import time
from globals import Config
MESSAGES={
"OK":"找回密码",
"INVALID_PASSWORD":"密码必须包含大小写字母、数字和特殊字符,长度在5-30之间",
"INVALID_REPASSWORD":"密码确认不一致!",
"INVALID_PHONE_EMAIL":"请输入有效的中国手机号或Email",
"XSS":"alert('XSS')",
}
class TestRecover:
@pytest.fixture(autouse=True)
def setup_and_teardown(self):
self.db=ClassDB()
self.db.init_login(username="", password="")
yield
self.db.init_db()
def _fill_new_password_form(self, page:Page, code:str, password:str, repassword:str):
#填充新密码表单
page.get_by_placeholder("输入验证码").fill(code)
page.get_by_placeholder("输入新密码").fill(password)
page.get_by_placeholder("确认新密码").fill(repassword)
page.get_by_role("button", name="确定").click()
def _fill_phone_mail_form(self, page:Page, contact:str):
page.get_by_placeholder("输入手机号码或邮箱").fill(contact)
page.get_by_role("button", name="发送验证码").click()
@pytest.mark.parametrize("code, password, repassword,expected_message", [
(Config.CODE, Config.VALID_PASSWORD,Config.DIFF_PASSWORD, MESSAGES["INVALID_REPASSWORD"]), #GTC-001:新密码和确认密码不一致
(Config.CODE, Config.SIMPLE_PASSWORD,Config.SIMPLE_PASSWORD, MESSAGES["INVALID_PASSWORD"]), #GTC-002: 新密码不符合复杂度要求
(Config.CODE, Config.SHORT_PASSWORD,Config.SHORT_PASSWORD,MESSAGES["INVALID_PASSWORD"]), #GTC-003:新密码长度不符合要求
])
def test_reset_password(self, page:Page, code, password, repassword, expected_message):
try:
page.goto(Config.RECOVER_URL)
except TimeoutError:
pytest.fail(f"加载页面失败:{Config.RECOVER_URL}")
page.reload()
self._fill_new_password_form(page, code, password, repassword)
error_message=page.inner_text("#confirmPasswordError" if expected_message=="密码确认不一致!" else "#newPasswordError")
assert expected_message in error_message
@pytest.mark.parametrize("contact,expected_message",[
(Config.INVALID_PHONE,MESSAGES["INVALID_PHONE_EMAIL"]), #GTC-004:用户输入的手机格式不正确
(Config.INVALID_EMAIL,MESSAGES["INVALID_PHONE_EMAIL"]), #GTC-005:用户输入的邮箱格式不正确
])
def test_invalid_phone_format(self,page:Page,contact, expected_message):
try:
page.goto(Config.VERICODE_URL)
except TimeoutError:
pytest.fail("加载页面失败:{"+Config.VERICODE_URL+"}")
page.reload()
self._fill_phone_mail_form(page,contact)
#检查错误提示
error_message=page.inner_text("#contactError")
assert expected_message in error_message
@pytest.mark.parametrize("contact,expected_message",[
(Config.SPACE_EMAIL_1,MESSAGES["OK"]), #GTC-008:用户输入的邮箱正确,但是前后有空格
(Config.SPACE_PHONE_1,MESSAGES["OK"]), #GTC-009:用户输入的手机正确,但是前后有空格
])
def test_valid_phone_format(self,page:Page,contact, expected_message):
try:
page.goto(Config.VERICODE_URL)
except TimeoutError:
pytest.fail("加载页面失败:{"+Config.VERICODE_URL+"}")
page.reload()
self._fill_phone_mail_form(page,contact)
#检查信息提示
title=page.title()
assert expected_message==title
if __name__=='__main__':
pytest.main(["-sv", "Test_Recover_GUI.py"])4.URL中的XSS攻击
如第3.3.3-5节所示,找回密码同样也存在URL中的XSS攻击的缺陷。在RecoverPage.jsp和VeriCodePage.jsp中添加。
代码4-56 RecoverPage.jsp/VeriCodePage.jsp
…
ct.setCookie();
out.println(util.repleatHTML(error));在Test_Recover_GUI.py中加入。
代码4-57 Test_Recover_GUI.py
def test_XSS_URL_For_Recover_Page(self, page:Page):
##GTC-006:RECOVER_URL XSS攻击
page.goto(Config.RECOVER_URL+"?error="+Config.XSS_USERNAME)
assert MESSAGES["XSS"] in page.locator("#recoverError").inner_text()
def test_XSS_URL_For_Vericode_Page(self, page:Page):
##GTC-007:VERICODE_URL XSS攻击
page.goto(Config.VERICODE_URL+"?error="+Config.XSS_USERNAME)
assert MESSAGES["XSS"] in page.locator("#VeriCodeError").inner_text()运行Test_Recover_GUI.py,保证测试通过。
4.3.4回归测试
运行所有产生的基于API的和基于GUI的自动化测试用例,保证所有测试用例均通过。
4.3.5小结
到目前为止有以下17个测试用例。如表4-1所示。
表4-1 找回密码模块测试用例

其中10个API测试用例,9个GUI测试用例(2个与API重复),没有手工测试用例。
顾翔凡言:人工智能未来的发展瓶颈在于对知识的更新。唯一不变的是变化,知识发生了变化,人工智能软件能否及时跟进变化,可能阻碍人工智能的使用。